Compare commits

..

4 Commits

@ -0,0 +1,31 @@
import { http } from "@/utils/http";
/** 新建病历基本信息 */
export const createMedicalRecBaseInfo = (data?: object) => {
return http.request(
"post",
"/virtual-patient-manage/medicalRecManage/createMedicalRecBaseInfo",
{
data
}
);
};
/** 修改病历状态,上线或下线病历 */
export const updateMedicalStatus = (data?: object) => {
return http.request(
"post",
"/virtual-patient-manage/medicalRecManage/updateMedicalStatus",
{
data
}
);
};
/** 查询虚拟病人电子病历信息 */
export const queryMedicalRecBaseInfo = (data?: object) => {
return http.request(
"get",
"/virtual-patient-manage/medicalRecManage/queryMedicalRecBaseInfo",
{
params: data
}
);
};

@ -0,0 +1,39 @@
import { http } from "@/utils/http";
/** 查询数字人列表 */
export const queryPageList = (data?: object) => {
return http.request("get", "/virtual-patient-manage/humanManage/list", {
params: data
});
};
/** 新增数字人 */
export const createHuman = (data?: object) => {
return http.request(
"post",
"/virtual-patient-manage/humanManage/createHuman",
{
data
}
);
};
/** 修改数字人 */
export const updateHuman = (data?: object) => {
return http.request(
"post",
"/virtual-patient-manage/humanManage/updateHuman",
{
data
}
);
};
// 删除数字人;
export const deleteHuman = (data?: object) => {
return http.request(
"delete",
"/virtual-patient-manage/humanManage/deleteHuman",
{
params: data
}
);
};

@ -33,19 +33,3 @@ export const getLogin = (data?: object) => {
export const refreshTokenApi = (data?: object) => {
return http.request<RefreshTokenResult>("post", "/refreshToken", { data });
};
/** 用户注册 */
export const getRegister = (data?: object) => {
return http.request<UserResult>("post", "/virtual-patient/user/register", {
data
});
};
/** 修改密码 */
export const changePassWord = (data?: object) => {
return http.request<UserResult>(
"post",
"/virtual-patient/user/changePassWord",
{
data
}
);
};

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.2 KiB

@ -0,0 +1,13 @@
<svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
<g id="tishi" clip-path="url(#clip0_2113_4143)">
<path id="Vector" d="M7 0C3.1 0 0 3.1 0 7C0 10.9 3.1 14 7 14C10.9 14 14 10.9 14 7C14 3.1 10.9 0 7 0Z" fill="#00975E"/>
<g id="&#229;&#175;&#185;&#229;&#143;&#183; 2">
<path id="Vector_2" d="M4.14564 6.15296C3.8463 5.85206 3.36038 5.85226 3.06059 6.15282L3.06046 6.15296C2.76162 6.45335 2.76162 6.9404 3.06046 7.24079L3.06052 7.24085L5.52864 9.71898L5.52886 9.71919L9.95367 4.40062L9.84739 4.29477L9.84736 4.29481C9.8473 4.29486 9.84725 4.29492 9.8472 4.29497L6.07117 8.08619L4.14564 6.15296ZM4.14564 6.15296L4.03942 6.25863L4.14557 6.1529L4.14564 6.15296Z" fill="white" stroke="white" stroke-width="0.3"/>
</g>
</g>
<defs>
<clipPath id="clip0_2113_4143">
<rect width="14" height="14" fill="white"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 871 B

@ -0,0 +1,10 @@
<svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
<g id="tishi" clip-path="url(#clip0_2113_4249)">
<path id="Vector" d="M7 0C3.1 0 0 3.1 0 7C0 10.9 3.1 14 7 14C10.9 14 14 10.9 14 7C14 3.1 10.9 0 7 0ZM7.8 11.2C7.8 11.7 7.5 12 7 12C6.5 12 6.2 11.7 6.2 11.2V6.6C6.2 6.1 6.5 5.8 7 5.8C7.5 5.8 7.8 6.1 7.8 6.6V11.2ZM8.2 3.6C8.2 4.3 7.6 4.8 7 4.8C6.4 4.8 5.8 4.3 5.8 3.6C5.8 2.9 6.3 2.3 7 2.3C7.7 2.3 8.2 2.9 8.2 3.6Z" fill="#FF3429"/>
</g>
<defs>
<clipPath id="clip0_2113_4249">
<rect width="14" height="14" fill="white"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 591 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.4 KiB

@ -95,7 +95,7 @@ export default {
{
path: "/caseManagement/edit",
name: "caseManagementEdit",
component: () => import("@/views/caseManagement/list/edit.vue"),
component: () => import("@/views/caseManagement/list/edit/index.vue"),
meta: {
title: "编辑病历",
showLink: false,

@ -0,0 +1,22 @@
export default {
path: "/digitalHuman",
redirect: "/digitalHuman/index",
meta: {
title: "数字人",
icon: "weixinFavorites",
rank: 14
},
children: [
{
path: "/digitalHuman/index",
name: "DigitalHuman",
component: () => import("@/views/digitalHuman/index.vue"),
meta: {
title: "在线数字人 ",
showLink: true,
showParent: true,
roles: ["admin", "common"]
}
}
]
} as RouteConfigsTable;

@ -19,6 +19,19 @@ export default {
roles: ["admin", "common"]
}
},
{
path: "/generalRules/ConsultationResults",
name: "ConsultationResults",
component: () =>
import("@/views/generalRules/ConsultationResults/index.vue"),
meta: {
title: "问诊结果 ",
showLink: true,
showParent: true,
roles: ["admin", "common"]
}
},
{
path: "/generalRules/materialCenter",
name: "MaterialCenter",

@ -37,13 +37,9 @@ export const useConsultationStore = defineStore({
exhalationFlag: false, //呼出服务
voiceFlag: true,
planTypeFlag: "", // 处置计划类型
supportActionId: [], // 呼出辅助检查
voiceStartFlag: false //是否开始语音问诊
supportActionId: [] // 呼出辅助检查
}),
actions: {
changeVoiceFlag(data) {
this.voiceStartFlag = data;
},
changeActivedKey(data) {
this.activedKey = data;
if (data !== 1) {

@ -1,42 +1,35 @@
<!-- <script setup lang="ts">
import { nextTick, reactive, ref } from "vue";
<script setup lang="ts">
import { reactive, ref } from "vue";
import { FormInstance } from "element-plus";
import { message } from "@/utils/message";
import { createMedicalRecBaseInfo } from "@/api/caseManagement";
// import { useRoute } from "vue-router";
defineOptions({
name: "AddEdit"
});
const isEditFlag = ref(false);
const diseaseList = ref([]);
const id = ref("");
const dialogVisible = ref(false);
const formData = reactive({
patientName: "",
patientGender: "",
directoryDesc: "",
patientSelfDesc: "",
patientAge: "",
diseaseId: ""
});
const ruleFormRef = ref<FormInstance>();
const rules = {
patientName: [{ required: true, message: "请输入", trigger: "change" }],
patientGender: [{ required: true, message: "请选择", trigger: "change" }],
directoryDesc: [{ required: true, message: "请输入", trigger: "change" }]
patientAge: [{ required: true, message: "请输入", trigger: "change" }],
patientSelfDesc: [{ required: true, message: "请输入", trigger: "change" }],
diseaseId: [{ required: true, message: "请选择", trigger: "change" }]
};
defineExpose({
async open(item) {
async open(data) {
dialogVisible.value = true;
await nextTick();
if (item) {
for (const key in item) {
// eslint-disable-next-line no-prototype-builtins
if (formData.hasOwnProperty(key)) {
formData[key] = item[key];
}
}
isEditFlag.value = true;
id.value = item.id;
}
diseaseList.value = data;
}
});
const resetForm = () => {
@ -55,27 +48,14 @@ const reset = () => {
const save = (formEl: FormInstance | undefined) => {
formEl.validate(async (valid, fields) => {
if (valid) {
// formData.result = refWangEditor.value.valueHtml;
// const params = {
// ...formData,
// result: refWangEditor.value.valueHtml,
// diseaseId: route.query.id
// };
if (isEditFlag.value) {
// const res: any = await updateSupportInspect({
// ...params,
// id: id.value
// });
if (res.code === 200) {
message("修改成功", { type: "success" });
id.value = "";
}
} else {
// const res: any = await addSupportInspect(params);
// if (res.code === 200) {
// message("", { type: "success" });
// }
const params = {
...formData
};
const res: any = await createMedicalRecBaseInfo(params);
if (res.code === 200) {
message("新增成功", { type: "success" });
}
dialogVisible.value = false;
emit("update");
} else {
@ -106,13 +86,13 @@ const save = (formEl: FormInstance | undefined) => {
ref="ruleFormRef"
:model="formData"
:rules="rules"
label-width="80px"
label-width="90px"
>
<el-form-item label="姓名" prop="directoryDesc">
<el-form-item label="姓名" prop="patientName">
<el-input
size="large"
placeholder="请输入"
v-model="formData.directoryDesc"
v-model="formData.patientName"
/>
</el-form-item>
<el-form-item label="性别" prop="patientGender">
@ -229,19 +209,4 @@ const save = (formEl: FormInstance | undefined) => {
}
}
}
</style> -->
<script setup lang="ts">
import { onMounted } from "vue";
import MainView from "./page/index.vue";
import { useCaseStoreHooks } from "@/store/modules/caseManagement";
onMounted(() => {
useCaseStoreHooks().changeIsEditFlag(false);
});
</script>
<template>
<div>
<MainView />
</div>
</template>
</style>

@ -0,0 +1,313 @@
<script setup lang="ts">
import { nextTick, reactive, ref } from "vue";
import { FormInstance } from "element-plus";
import { message } from "@/utils/message";
// import { useRoute } from "vue-router";
import successIcon from "@/assets/svg/consultation/check_small.svg?component";
import errorIcon from "@/assets/svg/consultation/error.svg?component";
defineOptions({
name: "AddQuestion"
});
const isEditFlag = ref(false);
const id = ref("");
const dialogVisible = ref(false);
const tableList = ref([]);
const formData = reactive({
patientGender: "",
directoryDesc: "",
patientSelfDesc: "",
defaultAnswer: "",
dicIdPath: ""
});
const dictList = ref([]);
const isValidate = ref("1");
const ruleFormRef = ref<FormInstance>();
const rules = {
patientGender: [{ required: true, message: "请选择", trigger: "change" }],
directoryDesc: [{ required: true, message: "请输入", trigger: "change" }]
};
const props = {
value: "id",
label: "nameZh",
children: "childDictTreeList",
expandTrigger: "hover" as const
};
const columns: TableColumnList = [
{
label: "相似问题",
prop: "itemName"
},
{
label: "操作",
fixed: "right",
width: 100,
slot: "operation"
}
];
defineExpose({
async open(item) {
dialogVisible.value = true;
await nextTick();
if (item) {
for (const key in item) {
// eslint-disable-next-line no-prototype-builtins
if (formData.hasOwnProperty(key)) {
formData[key] = item[key];
}
}
isEditFlag.value = true;
id.value = item.id;
}
}
});
const handleChange = item => {
formData.dictId = item[item.length - 1];
};
const resetForm = () => {
ruleFormRef.value.resetFields();
};
const closeDialog = () => {
dialogVisible.value = false;
isEditFlag.value = false;
resetForm();
};
const emit = defineEmits(["update"]);
const reset = () => {
ruleFormRef.value.resetFields();
};
const handleDelete = item => {};
const save = (formEl: FormInstance | undefined) => {
formEl.validate(async (valid, fields) => {
if (valid) {
// formData.result = refWangEditor.value.valueHtml;
// const params = {
// ...formData,
// result: refWangEditor.value.valueHtml,
// diseaseId: route.query.id
// };
if (isEditFlag.value) {
// const res: any = await updateSupportInspect({
// ...params,
// id: id.value
// });
if (res.code === 200) {
message("修改成功", { type: "success" });
id.value = "";
}
} else {
// const res: any = await addSupportInspect(params);
// if (res.code === 200) {
// message("", { type: "success" });
// }
}
dialogVisible.value = false;
emit("update");
} else {
return fields;
}
});
};
</script>
<template>
<div>
<el-drawer
:size="650"
append-to-body
v-model="dialogVisible"
:show-close="false"
:with-header="false"
:before-close="closeDialog"
custom-class="AddQuestion"
>
<div class="AddQuestion">
<div class="header-title">
<div class="tip" />
<span>添加问题</span>
</div>
<div class="line" />
<el-form
ref="ruleFormRef"
:model="formData"
:rules="rules"
label-width="120px"
>
<el-form-item label="问诊问题" prop="directoryDesc">
<el-input
size="large"
style="width: 380px"
v-model="formData.patientSelfDesc"
/>
<div class="add_btn">评估</div>
</el-form-item>
<el-form-item label="相似度阈值(%)" prop="directoryDesc">
<span>{{ `0.7%(系统返回阈值结界)` }}</span>
</el-form-item>
<div class="result">
<div v-if="isValidate === '2'" class="result_error">
<errorIcon />
<span
>相似度高已存在相似问诊问题不支持添加若要添加可联系运营人员</span
>
</div>
<div v-if="isValidate === '1'" class="result_success">
<successIcon />
<span>相似度低支持添加该问题</span>
</div>
</div>
<el-form-item label="">
<pure-table
ref="tableRef"
align-whole="center"
style="height: 460px"
showOverflowTooltip
class="mt-4"
border
:data="tableList"
:columns="columns"
:header-cell-style="{
background: 'var(--el-table-row-hover-bg-color)',
color: 'var(--el-text-color-primary)'
}"
>
<template #operation="{ row }">
<el-button link type="danger" @click="handleDelete(row)">
删除
</el-button>
</template>
</pure-table>
</el-form-item>
<el-form-item label="问诊类目 " prop="dicIdPath">
<el-cascader
:disabled="isEditFlag"
style="width: 100%"
size="large"
v-model="formData.dicIdPath"
:options="dictList"
:props="props"
@change="handleChange"
/>
</el-form-item>
<el-form-item label="回复 " prop="defaultAnswer">
<el-input
size="large"
v-model="formData.defaultAnswer"
placeholder="请输入"
/>
</el-form-item>
</el-form>
</div>
<template #footer>
<div class="footer_btn">
<div class="reset" @click="reset()"></div>
<div class="main" @click="save(ruleFormRef)"></div>
</div>
</template>
</el-drawer>
</div>
</template>
<style lang="scss" scoped>
.AddQuestion {
:deep(.el-form-item__label) {
font-weight: 400;
color: #333;
}
.header-title {
display: flex;
align-items: center;
// border-left: 6px solid #4287ff;
font-size: 20px;
font-weight: bold;
color: #2b3f54;
.tip {
width: 6px;
height: 20px;
margin-right: 10px;
line-height: 20px;
background: #4287ff;
}
}
.add_btn {
width: 76px;
height: 32px;
background: #ffffff;
border-radius: 6px 6px 6px 6px;
border: 1px solid #4287ff;
line-height: 32px;
text-align: center;
font-size: 14px;
color: #4287ff;
margin-left: 16px;
cursor: pointer;
}
.result {
display: flex;
padding-left: 120px;
.result_error {
display: flex;
align-items: center;
span {
font-size: 12px;
color: #ff3429;
margin-left: 8px;
}
}
.result_success {
display: flex;
align-items: center;
span {
font-size: 12px;
color: #00975e;
margin-left: 8px;
}
}
}
.line {
position: relative;
left: -20px;
width: 630px;
height: 1px;
margin: 24px 0;
background: rgb(91 139 255 / 30%);
}
.footer_btn {
display: flex;
align-items: center;
justify-content: flex-end;
margin-top: 16px;
.reset {
width: 188px;
height: 48px;
margin-right: 24px;
font-size: 16px;
font-weight: 400;
line-height: 48px;
color: #4287ff;
text-align: center;
cursor: pointer;
background: #fff;
border: 1px solid #4287ff;
border-radius: 6px;
}
.main {
width: 188px;
height: 48px;
font-size: 16px;
line-height: 48px;
color: #fff;
text-align: center;
cursor: pointer;
background: #4287ff;
border: 1px solid #4287ff;
border-radius: 6px;
}
}
}
</style>

@ -0,0 +1,227 @@
<script setup lang="ts">
import { reactive, ref } from "vue";
import ProblemBase from "@/views/caseManagement/diseaseType/compontents/problemBase.vue";
import AddQuestion from "./AddQuestion.vue";
import { message } from "@/utils/message";
const seachForm = reactive({
type: "",
name: "",
patientSelfDesc: "",
patientAge: "",
diseaseId: ""
});
const typeList = ref([]);
const problemBaseRef = ref();
const AddQuestionRef = ref();
const dataList = ref([{}]);
const pagination = reactive<any>({
total: 0,
pageSize: 10,
currentPage: 1,
background: true
});
const columns: TableColumnList = [
{
label: "序号",
type: "index",
width: 80
},
{
label: "问题",
prop: "itemName"
},
{
label: "回复",
prop: "itemName"
},
{
label: "问题类目",
prop: "itemName"
},
{
label: "诊断依据",
prop: "itemName"
},
{
label: "操作",
fixed: "right",
width: 200,
slot: "operation"
}
];
const getData = () => {};
const search = () => {
pagination.currentPage = 1;
pagination.pageSize = 10;
getData();
};
const selectQuestion = () => {
problemBaseRef.value.open();
};
const add = () => {
AddQuestionRef.value.open();
};
const edit = item => {};
const handleDelete = item => {};
const reset = () => {
seachForm.name = "";
seachForm.type = "";
search();
};
const selectOk = async (data: any) => {
let flag = true;
data.forEach(e => {
for (const item of dataList.value) {
if (item.libraryQuestionId === e.libraryQuestionId) {
message("不能选择重复数据", { type: "error" });
flag = false;
return;
}
}
if (flag) {
dataList.value.push({
defaultAnswer: e.defaultAnswer,
dictNamePath: e.nameZhPath,
medicalRecAnswer: e.defaultAnswer,
libraryQuestionId: e.libraryQuestionId,
questionList: e.question,
answerResourceId: e.answerResourceId
});
}
});
};
</script>
<template>
<div class="ClinicalConsultation">
<div class="header">
<div class="header_left">
<span>临床问诊</span>
</div>
<div class="header_right">
<el-button
size="large"
class="btn"
@click="selectQuestion"
type="primary"
>选择问题</el-button
>
<el-button size="large" class="btn" @click="add" type="primary"
>添加问题</el-button
>
</div>
</div>
<el-form
style="padding-right: 40px"
ref="ruleFormRef"
:model="seachForm"
label-width="80px"
>
<el-row>
<el-form-item label="类目" prop="patientGender">
<el-select
size="large"
filterable
style="width: 100%"
v-model="seachForm.type"
placeholder="请选择"
>
<el-option
v-for="item in typeList"
:key="item"
:label="item"
:value="item"
/>
</el-select>
</el-form-item>
<el-form-item label="问题">
<el-input size="large" v-model="seachForm.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 style="padding: 0 40px">
<pure-table
ref="tableRef"
v-if="dataList.length > 0"
align-whole="center"
style="height: calc(100vh - 485px)"
showOverflowTooltip
class="mt-4"
:data="dataList"
:columns="columns"
:header-cell-style="{
background: 'var(--el-table-row-hover-bg-color)',
color: 'var(--el-text-color-primary)'
}"
>
<template #basisConfirm="{ row }">
<el-checkbox
:true-label="1"
:false-label="0"
v-model="row.basisConfirmFlag"
size="large"
/>
</template>
<template #operation="{ row }">
<el-button link type="primary" @click="edit(row)"> </el-button>
<el-button link type="danger" @click="handleDelete(row)">
删除
</el-button>
</template>
</pure-table>
</div>
<ProblemBase @select="selectOk" ref="problemBaseRef" />
<AddQuestion ref="AddQuestionRef" />
</div>
</template>
<style lang="scss" scoped>
.ClinicalConsultation {
flex: 1;
:deep(.el-form-item__label) {
font-weight: 400;
color: #333;
}
.header {
display: flex;
align-items: center;
justify-content: space-between;
height: 88px;
padding: 0 40px;
margin-bottom: 24px;
border-bottom: 1px solid #d9d9d9;
.header_left {
font-size: 20px;
color: #333;
span {
padding-left: 8px;
border-left: 6px solid #4287ff;
}
}
.header_right {
display: flex;
.btn {
width: 112px;
font-size: 16px;
}
}
.reset_btn {
width: 112px;
height: 40px;
border-radius: 6px 6px 6px 6px;
border: 1px solid #4287ff;
line-height: 40px;
text-align: center;
font-size: 16px;
color: #4287ff;
margin-right: 24px;
cursor: pointer;
}
}
}
</style>

@ -0,0 +1,197 @@
<script setup lang="ts">
import { reactive, ref } from "vue";
import { message } from "@/utils/message";
const seachForm = reactive({
type: "",
name: "",
patientSelfDesc: "",
patientAge: "",
diseaseId: ""
});
const typeList = ref([]);
const dataList = ref([{}]);
const pagination = reactive<any>({
total: 0,
pageSize: 10,
currentPage: 1,
background: true
});
const columns: TableColumnList = [
{
label: "检查项目",
prop: "toolName"
},
{
label: "检查部位",
prop: "locationName"
},
{
label: "初步诊断依据",
slot: "slot0"
},
{
label: "证实诊断依据",
slot: "slot1"
},
{
label: "鉴别依据",
slot: "slot2"
},
{
label: "全面依据",
slot: "slot3"
},
{
label: "是否必查",
prop: "requireCheckFlag",
slot: "requireCheckFlag"
}
];
const getData = () => {};
const search = () => {
pagination.currentPage = 1;
pagination.pageSize = 10;
getData();
};
const add = () => {};
const edit = item => {};
const handleDelete = item => {};
const reset = () => {
seachForm.name = "";
seachForm.type = "";
search();
};
</script>
<template>
<div class="ClinicalDiagnosis">
<div class="header">
<div class="header_left">
<span>临床诊断-体格检查辅助检查项目</span>
</div>
<div class="header_right">
<el-button size="large" class="btn" @click="add" type="primary"
>保存</el-button
>
</div>
</div>
<el-form
style="padding-right: 40px"
ref="ruleFormRef"
:model="seachForm"
label-width="80px"
>
<el-row>
<el-form-item label="类目" prop="patientGender">
<el-select
size="large"
filterable
style="width: 100%"
v-model="seachForm.type"
placeholder="请选择"
>
<el-option
v-for="item in typeList"
:key="item"
:label="item"
:value="item"
/>
</el-select>
</el-form-item>
<el-form-item label="问题">
<el-input size="large" v-model="seachForm.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 style="padding: 0 40px">
<pure-table
ref="tableRef"
v-if="dataList.length > 0"
align-whole="center"
style="height: calc(100vh - 485px)"
showOverflowTooltip
class="mt-4"
:data="dataList"
:columns="columns"
:header-cell-style="{
background: 'var(--el-table-row-hover-bg-color)',
color: 'var(--el-text-color-primary)'
}"
>
<template #basisConfirm="{ row }">
<el-checkbox
:true-label="1"
:false-label="0"
v-model="row.basisConfirmFlag"
size="large"
/>
</template>
<template #basisIdentification="{ row }">
<el-checkbox
:true-label="1"
:false-label="0"
v-model="row.basisIdentificationFlag"
size="large"
/>
</template>
<template #operation="{ row }">
<el-button link type="primary" @click="edit(row)"> </el-button>
<el-button link type="danger" @click="handleDelete(row)">
删除
</el-button>
</template>
</pure-table>
</div>
</div>
</template>
<style lang="scss" scoped>
.ClinicalDiagnosis {
flex: 1;
:deep(.el-form-item__label) {
font-weight: 400;
color: #333;
}
.header {
display: flex;
align-items: center;
justify-content: space-between;
height: 88px;
padding: 0 40px;
margin-bottom: 24px;
border-bottom: 1px solid #d9d9d9;
.header_left {
font-size: 20px;
color: #333;
span {
padding-left: 8px;
border-left: 6px solid #4287ff;
}
}
.header_right {
display: flex;
.btn {
width: 112px;
font-size: 16px;
}
}
.reset_btn {
width: 112px;
height: 40px;
border-radius: 6px 6px 6px 6px;
border: 1px solid #4287ff;
line-height: 40px;
text-align: center;
font-size: 16px;
color: #4287ff;
margin-right: 24px;
cursor: pointer;
}
}
}
</style>

@ -0,0 +1,136 @@
<script setup lang="ts">
import { reactive, ref } from "vue";
import { message } from "@/utils/message";
const seachForm = reactive({
primarilyDiagnosisCriteria: "",
confirmDiagnosisCriteria: "",
patientSelfDesc: "",
differentialDiagnosisCriteria: "",
fullCheck: ""
});
const add = () => {};
const reset = () => {};
</script>
<template>
<div class="DiagnosticBasis">
<div class="header">
<div class="header_left">
<span>诊断依据</span>
</div>
<div class="header_right">
<el-button size="large" class="btn" @click="add" type="primary"
>保存</el-button
>
</div>
</div>
<el-form class="mt-4 mr-10" :model="seachForm" label-width="180px">
<el-row>
<el-col :span="24">
<el-form-item
label="初步诊断依据:"
prop="primarilyDiagnosisCriteria"
>
<el-input
:rows="4"
style="width: 100%"
type="textarea"
:maxLength="500"
placeholder="请输入描述"
v-model="seachForm.primarilyDiagnosisCriteria"
/>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="证实诊断依据:" prop="confirmDiagnosisCriteria">
<el-input
:rows="4"
style="width: 100%"
type="textarea"
:maxLength="500"
placeholder="请输入描述"
v-model="seachForm.confirmDiagnosisCriteria"
/>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="鉴别依据:" prop="differentialDiagnosisCriteria">
<el-input
:rows="4"
style="width: 100%"
type="textarea"
:maxLength="500"
placeholder="请输入描述"
v-model="seachForm.differentialDiagnosisCriteria"
/>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="处置诊断说明" prop="fullCheck">
<el-input
:rows="4"
style="width: 100%"
type="textarea"
:maxLength="500"
placeholder="请输入描述"
v-model="seachForm.fullCheck"
/>
</el-form-item>
</el-col>
</el-row>
</el-form>
</div>
</template>
<style lang="scss" scoped>
.DiagnosticBasis {
flex: 1;
:deep(.el-form-item__label) {
font-weight: 400;
color: #333;
}
.header {
display: flex;
align-items: center;
justify-content: space-between;
height: 88px;
padding: 0 40px;
margin-bottom: 24px;
border-bottom: 1px solid #d9d9d9;
.header_left {
font-size: 20px;
color: #333;
span {
padding-left: 8px;
border-left: 6px solid #4287ff;
}
}
.header_right {
display: flex;
.btn {
width: 112px;
font-size: 16px;
}
}
.reset_btn {
width: 112px;
height: 40px;
border-radius: 6px 6px 6px 6px;
border: 1px solid #4287ff;
line-height: 40px;
text-align: center;
font-size: 16px;
color: #4287ff;
margin-right: 24px;
cursor: pointer;
}
}
}
</style>

@ -0,0 +1,164 @@
<script setup lang="ts">
import { reactive, ref } from "vue";
import { message } from "@/utils/message";
const seachForm = reactive({
type: "",
name: "",
patientSelfDesc: "",
patientAge: "",
diseaseId: ""
});
const typeList = ref([]);
const dataList = ref([{}]);
const pagination = reactive<any>({
total: 0,
pageSize: 10,
currentPage: 1,
background: true
});
const columns = [
{
label: "检查项目",
prop: "toolName"
},
{
label: "检查部位",
prop: "locationName"
},
{
label: "初步诊断依据",
slot: "slot0"
},
{
label: "证实诊断依据",
slot: "slot1"
},
{
label: "鉴别依据",
slot: "slot2"
},
{
label: "全面依据",
slot: "slot3"
},
{
label: "是否必查",
prop: "requireCheckFlag",
slot: "requireCheckFlag"
}
];
const getData = () => {};
const search = () => {
pagination.currentPage = 1;
pagination.pageSize = 10;
getData();
};
const add = () => {};
const handleDelete = item => {};
const reset = () => {
seachForm.name = "";
seachForm.type = "";
search();
};
</script>
<template>
<div class="DisposalPlan">
<div class="header">
<div class="header_left">
<span>处置计划</span>
</div>
<div class="header_right">
<div class="reset_btn">重置</div>
<el-button size="large" class="btn" @click="add" type="primary"
>保存</el-button
>
</div>
</div>
<div style="padding: 0 40px">
<pure-table
ref="tableRef"
v-if="dataList.length > 0"
align-whole="center"
style="height: calc(100vh - 485px)"
showOverflowTooltip
class="mt-4"
:data="dataList"
:columns="columns"
:header-cell-style="{
background: 'var(--el-table-row-hover-bg-color)',
color: 'var(--el-text-color-primary)'
}"
>
<template #basisConfirm="{ row }">
<el-checkbox
:true-label="1"
:false-label="0"
v-model="row.basisConfirmFlag"
size="large"
/>
</template>
<template #basisIdentification="{ row }">
<el-checkbox
:true-label="1"
:false-label="0"
v-model="row.basisIdentificationFlag"
size="large"
/>
</template>
<template #operation="{ row }">
<el-button link type="danger" @click="handleDelete(row)">
删除
</el-button>
</template>
</pure-table>
</div>
</div>
</template>
<style lang="scss" scoped>
.DisposalPlan {
flex: 1;
:deep(.el-form-item__label) {
font-weight: 400;
color: #333;
}
.header {
display: flex;
align-items: center;
justify-content: space-between;
height: 88px;
padding: 0 40px;
margin-bottom: 24px;
border-bottom: 1px solid #d9d9d9;
.header_left {
font-size: 20px;
color: #333;
span {
padding-left: 8px;
border-left: 6px solid #4287ff;
}
}
.header_right {
display: flex;
.btn {
width: 112px;
font-size: 16px;
}
}
.reset_btn {
width: 112px;
height: 40px;
border-radius: 6px 6px 6px 6px;
border: 1px solid #4287ff;
line-height: 40px;
text-align: center;
font-size: 16px;
color: #4287ff;
margin-right: 24px;
cursor: pointer;
}
}
}
</style>

@ -0,0 +1,215 @@
<script setup lang="ts">
import { nextTick, ref } from "vue";
defineOptions({
name: "AddCase"
});
const isEditFlag = ref(false);
const dataList = ref([
{
url: "",
key: 1,
name: "虚拟人名称"
},
{
url: "",
key: 2,
name: "虚拟人名称"
},
{
url: "",
key: 3,
name: "虚拟人名称"
}
]);
const selectKey = ref(1);
const id = ref("");
const dialogVisible = ref(false);
defineExpose({
async open(item) {
dialogVisible.value = true;
}
});
const closeDialog = () => {
dialogVisible.value = false;
isEditFlag.value = false;
};
const emit = defineEmits(["update"]);
const reset = () => {};
const save = () => {};
</script>
<template>
<div>
<el-drawer
:size="650"
append-to-body
v-model="dialogVisible"
:show-close="false"
:with-header="false"
:before-close="closeDialog"
custom-class="SelectPeople"
>
<div class="SelectPeople">
<div class="header-title">
<div class="tip" />
<span>选择虚拟人形象</span>
</div>
<div class="line" />
<div class="img_list">
<div
class="img_list_item"
v-for="(item, index) in dataList"
:key="index"
>
<img :src="item.url" alt="" />
<div class="img_list_desc">{{ item.name }}</div>
<div class="no_select" v-if="selectKey !== item.key" />
<div class="selected" v-if="selectKey === item.key">
<span class="in_select" />
</div>
</div>
</div>
</div>
<template #footer>
<div class="footer_btn">
<div class="reset" @click="reset()"></div>
<div class="main" @click="save()"></div>
</div>
</template>
</el-drawer>
</div>
</template>
<style lang="scss" scoped>
.SelectPeople {
:deep(.el-form-item__label) {
font-weight: 400;
color: #333;
}
.header-title {
display: flex;
align-items: center;
// border-left: 6px solid #4287ff;
font-size: 20px;
font-weight: bold;
color: #2b3f54;
.tip {
width: 6px;
height: 20px;
margin-right: 10px;
line-height: 20px;
background: #4287ff;
}
}
.line {
position: relative;
left: -20px;
width: 650px;
height: 1px;
margin: 24px 0;
background: rgb(91 139 255 / 30%);
}
.img_list {
display: flex;
flex-wrap: wrap;
justify-content: space-between;
.img_list_item {
width: 190px;
position: relative;
box-shadow: 0px 2px 4px 0px rgba(0, 0, 0, 0.08);
// margin-right: 16px;
border-radius: 12px;
cursor: pointer;
img {
width: 100%;
height: 190px;
}
.img_list_item:last-child {
margin-right: 0px;
}
.img_list_desc {
width: 100%;
height: 40px;
background: #ffffff;
border-radius: 0px 0px 12px 12px;
font-size: 16px;
color: #333333;
line-height: 40px;
padding-left: 16px;
border-radius: 0 0 12px 12px;
}
.no_select {
width: 30px;
height: 30px;
background: #ffffff;
border-radius: 28px 28px 28px 28px;
border: 1px solid #d9d9d9;
position: absolute;
top: 12px;
right: 12px;
}
.selected {
width: 30px;
height: 30px;
background: #ffffff;
border-radius: 28px 28px 28px 28px;
border: 1px solid #4287ff;
position: absolute;
top: 12px;
right: 12px;
display: flex;
align-items: center;
justify-content: center;
.in_select {
width: 16px;
height: 16px;
background: #4287ff;
border-radius: 12px;
}
}
}
}
.footer_btn {
display: flex;
align-items: center;
justify-content: flex-end;
margin-top: 16px;
.reset {
width: 188px;
height: 48px;
margin-right: 24px;
font-size: 16px;
font-weight: 400;
line-height: 48px;
color: #4287ff;
text-align: center;
cursor: pointer;
background: #fff;
border: 1px solid #4287ff;
border-radius: 6px;
}
.main {
width: 188px;
height: 48px;
font-size: 16px;
line-height: 48px;
color: #fff;
text-align: center;
cursor: pointer;
background: #4287ff;
border: 1px solid #4287ff;
border-radius: 6px;
}
}
}
</style>

@ -1,16 +1,28 @@
<script setup lang="ts">
import { reactive, ref } from "vue";
import { onMounted, reactive, ref } from "vue";
import AddCase from "./AddCase.vue";
import SelectPeople from "./SelectPeople.vue";
import { queryMedicalRecBaseInfo } from "@/api/caseManagement";
import { useRoute } from "vue-router";
const AddCaseRef = ref();
const formData = reactive({
const SelectPeopleRef = ref();
let formData = reactive({
patientName: "",
patientGender: "",
patientMarriage: "",
nativePlace: "",
directoryDesc: "",
patientSelfDesc: "",
patientBirthplace: "",
patientPhone: "",
patientPostcode: "",
patientProfession: "",
patientAge: "",
diseaseId: ""
diseaseId: "",
medicalType: ""
});
const caseTypeList = ref([]);
const route = useRoute();
const medicalTypeList = ref([]);
const rules = {
patientGender: [{ required: true, message: "请选择", trigger: "change" }],
directoryDesc: [{ required: true, message: "请输入", trigger: "change" }]
@ -18,6 +30,18 @@ const rules = {
const add = () => {
AddCaseRef.value.open();
};
const openPeopleDialog = () => {
SelectPeopleRef.value.open();
};
const getDetail = async () => {
const res: any = await queryMedicalRecBaseInfo({
medicalRecId: route.query.medicalRecId
});
formData = res.data;
};
onMounted(() => {
getDetail();
});
</script>
<template>
<div class="ElectronicCase">
@ -32,10 +56,11 @@ const add = () => {
</div>
</div>
<el-form
style="padding-right: 40px"
ref="ruleFormRef"
:model="formData"
:rules="rules"
label-width="80px"
label-width="100px"
>
<el-row>
<el-col :span="8">
@ -45,22 +70,24 @@ const add = () => {
</el-col>
<el-col :span="8">
<el-form-item label="虚拟人" prop="patientGender">
<el-button type="primary" link> 请选择数字人 </el-button>
<el-button @click="openPeopleDialog" type="primary" link>
请选择数字人
</el-button>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="病历类型" prop="patientGender">
<el-form-item label="病历类型" prop="medicalType">
<el-select
size="large"
filterable
clearable
v-model="formData.diseaseId"
v-model="formData.medicalType"
class="form_select"
style="width: 100%"
placeholder="请选择选择类目"
>
<el-option
v-for="item in caseTypeList"
v-for="item in medicalTypeList"
:key="item.id"
:label="item.diseaseName"
:value="item.id"
@ -71,7 +98,103 @@ const add = () => {
</el-row>
<el-row>
<el-col :span="8">
<el-form-item label="姓名" prop="directoryDesc">
<el-form-item label="姓名" prop="patientName">
<el-input
size="large"
placeholder="请输入"
v-model="formData.patientName"
/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="性别" prop="patientGender">
<el-input
size="large"
placeholder="请输入"
v-model="formData.patientGender"
/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="年龄" prop="patientAge">
<el-input
size="large"
placeholder="请输入"
v-model="formData.patientAge"
/>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="8">
<el-form-item label="婚姻状态" prop="patientMarriage">
<el-input
size="large"
placeholder="请输入"
v-model="formData.patientMarriage"
/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="籍贯" prop="nativePlace">
<el-input
size="large"
placeholder="请输入"
v-model="formData.nativePlace"
/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="职业" prop="patientProfession">
<el-input
size="large"
placeholder="请输入"
v-model="formData.patientProfession"
/>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="8">
<el-form-item label="出生地" prop="patientBirthplace">
<el-input
size="large"
placeholder="请输入"
v-model="formData.patientBirthplace"
/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="电话" prop="patientPhone">
<el-input
size="large"
placeholder="请输入"
v-model="formData.patientPhone"
/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="邮编" prop="patientPostcode">
<el-input
size="large"
placeholder="请输入"
v-model="formData.patientPostcode"
/>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="8">
<el-form-item label="现住地" prop="directoryDesc">
<el-input
size="large"
placeholder="请输入"
v-model="formData.directoryDesc"
/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="长期居住地" prop="directoryDesc">
<el-input
size="large"
placeholder="请输入"
@ -80,7 +203,7 @@ const add = () => {
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="性别" prop="directoryDesc">
<el-form-item label="民族" prop="directoryDesc">
<el-input
size="large"
placeholder="请输入"
@ -88,8 +211,85 @@ const add = () => {
/>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="8">
<el-form-item label="年龄" prop="directoryDesc">
<el-form-item label="初步诊断" prop="directoryDesc">
<el-input
size="large"
placeholder="请输入"
v-model="formData.directoryDesc"
/>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="主诉" prop="directoryDesc">
<el-input
size="large"
placeholder="请输入"
v-model="formData.directoryDesc"
/>
</el-form-item>
</el-col>
</el-row>
<div class="desc">
主诉多于一项时应按发生的时间次序排列持续时间上一般从长到短排列
</div>
<el-row>
<el-col :span="24">
<el-form-item label="现病史" prop="directoryDesc">
<el-input
size="large"
placeholder="请输入"
v-model="formData.directoryDesc"
/>
</el-form-item>
</el-col>
</el-row>
<div class="desc">
可记录起病情况主要症状特点及演变情况诊治情况发病后的一般情况
</div>
<el-row>
<el-col :span="24">
<el-form-item label="过敏史" prop="directoryDesc">
<el-input
size="large"
placeholder="请输入"
v-model="formData.directoryDesc"
/>
</el-form-item>
</el-col>
</el-row>
<div class="desc">可记录药物或食物过敏史默认没有过敏反应</div>
<el-row>
<el-col :span="24">
<el-form-item label="个人史" prop="directoryDesc">
<el-input
size="large"
placeholder="请输入"
v-model="formData.directoryDesc"
/>
</el-form-item>
</el-col>
</el-row>
<div class="desc">可记录药物或食物过敏史默认没有过敏反应</div>
<el-row>
<el-col :span="24">
<el-form-item label="家族史" prop="directoryDesc">
<el-input
size="large"
placeholder="请输入"
v-model="formData.directoryDesc"
/>
</el-form-item>
</el-col>
</el-row>
<div class="desc">可记录家族遗传病情况默认没有家族遗传病</div>
<el-row>
<el-col :span="24">
<el-form-item label="既往史" prop="directoryDesc">
<el-input
size="large"
placeholder="请输入"
@ -98,14 +298,31 @@ const add = () => {
</el-form-item>
</el-col>
</el-row>
<div class="desc">可记录历史慢性疾病和长期服药情况</div>
<el-row>
<el-col :span="24">
<el-form-item label="手术史" prop="directoryDesc">
<el-input
size="large"
placeholder="请输入"
v-model="formData.directoryDesc"
/>
</el-form-item>
</el-col>
</el-row>
<div class="desc">可记录历史手术情况</div>
</el-form>
<AddCase ref="AddCaseRef" />
<SelectPeople ref="SelectPeopleRef" />
</div>
</template>
<style lang="scss" scoped>
.ElectronicCase {
flex: 1;
:deep(.el-form-item__label) {
font-weight: 400;
color: #333;
}
.header {
display: flex;
align-items: center;
@ -125,5 +342,12 @@ const add = () => {
}
}
}
.desc {
font-weight: 400;
font-size: 12px;
color: #a0a0a0;
padding-left: 100px;
margin-bottom: 24px;
}
}
</style>

@ -1,5 +1,9 @@
<script setup lang="ts">
import ElectronicCase from "./compontents/ElectronicCase/index.vue";
import ClinicalConsultation from "./compontents/ClinicalConsultation/index.vue";
import ClinicalDiagnosis from "./compontents/ClinicalDiagnosis/index.vue";
import DiagnosticBasis from "./compontents/DiagnosticBasis/index.vue";
import DisposalPlan from "./compontents/DisposalPlan/index.vue";
import { ref } from "vue";
const activedIndex = ref(0);
const navList = ref([
@ -19,6 +23,9 @@ const navList = ref([
name: "处置计划"
}
]);
const changeType = val => {
activedIndex.value = val;
};
</script>
<template>
@ -29,19 +36,24 @@ const navList = ref([
:class="[activedIndex === index ? 'actived' : '']"
v-for="(item, index) in navList"
:key="index"
@click="changeType(index)"
>
<div class="line" />
<span>{{ item.name }}</span>
</div>
</div>
<ElectronicCase v-if="activedIndex === 0" />
<ClinicalConsultation v-if="activedIndex === 1" />
<ClinicalDiagnosis v-if="activedIndex === 2" />
<DiagnosticBasis v-if="activedIndex === 3" />
<DisposalPlan v-if="activedIndex === 4" />
</div>
</template>
<style lang="scss" scoped>
.editCase {
display: flex;
flex-direction: row !important;
width: 100%;
padding: 0;
.editCase_nav {

@ -9,7 +9,9 @@ import {
import { onMounted } from "vue";
import { clearObject } from "@/utils/auth";
import { useCaseStoreHooks } from "@/store/modules/caseManagement";
import AddEdit from "./add.vue";
import { updateMedicalStatus } from "@/api/caseManagement";
import { message } from "@/utils/message";
defineOptions({
name: "CaseManagement"
});
@ -23,6 +25,7 @@ const seachForm = reactive({
selfDescKeyword: ""
});
const diseaseList = ref([]);
const AddEditRef = ref();
const pagination = reactive<PaginationProps>({
total: 0,
pageSize: 10,
@ -56,8 +59,10 @@ const columns: TableColumnList = [
minWidth: 150
},
{
label: "机构",
prop: "alarmTask"
label: "状态",
prop: "diagnosisPrimaryStr",
slot: "status",
minWidth: 150
},
{
label: "更新时间",
@ -90,8 +95,7 @@ const reset = () => {
search();
};
const add = () => {
router.push("/caseManagement/add");
useCaseStoreHooks().changeIsEditFlag(false);
AddEditRef.value.open(diseaseList.value);
};
const getDiseaseListByDropList = async () => {
const res: any = await queryDiseaseListByDropList();
@ -107,6 +111,16 @@ const getData = async () => {
dataList.value = res.data.records;
pagination.total = res.data.total;
};
const changeStatus = async item => {
const res: any = await updateMedicalStatus({
medicalRecId: item.medicalId,
status: item.medicalStatus
});
if (res.code === 200) {
message("修改成功", { type: "success" });
getData();
}
};
const openDetail = item => {
router.push({
path: "/caseManagement/detail",
@ -119,7 +133,7 @@ const handleEdit = item => {
router.push({
path: "/caseManagement/edit",
query: {
id: item.medicalId
medicalRecId: item.medicalId
}
});
};
@ -226,7 +240,16 @@ onMounted(() => {
删除
</el-button> -->
</template>
<template #status="{ row }">
<el-switch
@change="changeStatus(row)"
v-model="row.medicalStatus"
active-value="1"
inactive-value="0"
/>
</template>
</pure-table>
</div>
<AddEdit ref="AddEditRef" />
</div>
</template>

@ -125,7 +125,7 @@ const save = async data => {
if (res.code === 200) {
sessionStorage.setItem("inspectSatus", "1");
useConsultationStoreHooks().changeInspectSatus("1");
message("请配置处置计划", { type: "success" });
message("提交成功", { type: "success" });
emit("save");
}
};

@ -11,7 +11,6 @@ defineOptions({
name: "ConfirmInspect"
});
const route = useRoute();
const processId = ref();
const IdentificationBasisRef = ref();
const PreliminaryDiagnosisRef = ref();
const completed = () => {
@ -36,7 +35,6 @@ const saveOk = () => {
emit("saveOk");
};
onMounted(() => {
processId.value = route.query.processId;
useConsultationStoreHooks().getAskPrimaryList(route.query.processId);
});
//
@ -46,10 +44,9 @@ onBeforeUnmount(async () => {
if (list.length === 0) return;
const params = {
primaryConfirmList: list,
processId: route.query.processId ? route.query.processId : processId.value,
processId: route.query.processId,
tempSaveFlag: 1
};
await confirmPrimaryByAskEnd(params);
});
</script>

@ -101,7 +101,6 @@ const selectItem = item => {
formData.drugRoute = "";
formData.intervalDay = "";
formData.intervalHour = "";
formData.treatmentPlanId = "";
};
const clearData = () => {
formData.firstMeasures = "";
@ -229,11 +228,6 @@ const cancal = () => {
emit("save");
};
onMounted(() => {
if (useConsultationStoreHooks().planTypeFlag !== "") {
formData.disposalMethod = useConsultationStoreHooks().planTypeFlag;
getTree(formData.disposalMethod);
}
queryDrugList();
if (formData.disposalMethod) {
getTree(formData.disposalMethod);

@ -356,7 +356,7 @@ onMounted(() => {
.desc {
margin-top: 16px;
font-size: 16px;
font-size: 12px;
font-weight: 400;
color: #2b3f54;
}

@ -11,7 +11,6 @@ import { onMounted } from "vue";
import { useRoute } from "vue-router";
import { FormInstance } from "element-plus";
import { message } from "@/utils/message";
import { useConsultationStoreHooks } from "@/store/modules/consultation";
const formData = reactive({
evaluateLevel: undefined,
@ -57,12 +56,7 @@ const getData = async () => {
processId: route.query.processId
});
dataList.value = res.data.qaList;
if (res.data.evaluateLevel !== null && res.data.evaluateLevel !== undefined) {
formData.evaluateLevel = res.data.evaluateLevel;
} else {
formData.evaluateLevel = "";
}
formData.evaluateLevel = res.data.evaluateLevel || "";
formData.evaluateRemark = res.data.evaluateRemark;
};
const reset = () => {
@ -80,7 +74,6 @@ const save = (formEl: FormInstance | undefined) => {
const res: any = await saveFeedback(params);
if (res.code === 200) {
message("提交成功", { type: "success" });
useConsultationStoreHooks().changeActivedKey(4);
getData();
}
} else {
@ -198,7 +191,7 @@ onMounted(() => {
</div>
<el-input
v-model="item.feedbackRemark"
maxlength="100"
maxlength="20"
placeholder="请输入"
show-word-limit
type="textarea"
@ -254,11 +247,10 @@ onMounted(() => {
display: flex;
align-items: center;
justify-content: space-between;
padding-bottom: 16px;
height: 94px;
border-bottom: 1px solid #5b8bff;
.main_item_left {
flex: 1;
padding-top: 24px;
font-size: 16px;
color: #2b3f54;
@ -266,7 +258,6 @@ onMounted(() => {
.main_item_right {
display: flex;
width: 200px;
.main_item_right_item {
display: flex;

@ -54,11 +54,3 @@ const selectPostion = val => {
/>
</div>
</template>
<style lang="scss" scoped>
.positionDetails {
position: relative;
width: 720px;
height: 790px;
margin-left: 20px;
}
</style>

@ -190,14 +190,6 @@ const selectPostion = val => {
});
}
};
//
// const closedCard = () => {
// useConsultationStoreHooks().changeBodyResultInfo({
// name: "",
// value: "",
// postion: ""
// });
// };
</script>
<template>
@ -298,17 +290,16 @@ const selectPostion = val => {
v-show="selectToolInfo.toolName || bodyResultInfo.value"
class="result_card"
>
<div class="result_card_content">
<div v-show="bodyResultInfo.name" class="result_card_left">
<span>{{ bodyResultInfo.name }}</span>
<span style="margin-top: 16px" v-show="bodyResultInfo.postion">{{
bodyResultInfo.postion
}}</span>
</div>
<div v-show="bodyResultInfo.name" class="result_card_right">
<span :title="bodyResultInfo.value">{{ bodyResultInfo.value }}</span>
</div>
<!-- <div v-show="bodyResultInfo.name" class="result_card_item">
<div v-show="bodyResultInfo.name" class="result_card_left">
<span>{{ bodyResultInfo.name }}</span>
<span style="margin-top: 16px" v-show="bodyResultInfo.postion">{{
bodyResultInfo.postion
}}</span>
</div>
<div v-show="bodyResultInfo.name" class="result_card_right">
<span :title="bodyResultInfo.value">{{ bodyResultInfo.value }}</span>
</div>
<!-- <div v-show="bodyResultInfo.name" class="result_card_item">
{{ `体格检查项:${bodyResultInfo.name}` }}
</div>
<div v-show="bodyResultInfo.value" class="result_card_item">
@ -317,10 +308,8 @@ const selectPostion = val => {
<div v-show="bodyResultInfo.postion" class="result_card_item">
{{ `测量位置:${bodyResultInfo.postion}` }}
</div> -->
<div v-show="!bodyResultInfo.name" class="result_card_item">
请点击需要检查的身体部位
</div>
<!-- <el-icon class="closed"><Close @click="closedCard" /></el-icon> -->
<div v-show="!bodyResultInfo.name" class="result_card_item">
请点击需要检查的身体部位
</div>
</div>
@ -361,7 +350,7 @@ const selectPostion = val => {
flex: 1;
// align-items: center;
justify-content: center;
height: calc(100vh - 250px);
height: calc(100vh - 290px);
margin-left: 24px;
overflow-y: auto;
@ -560,12 +549,11 @@ const selectPostion = val => {
.result_card {
position: fixed;
bottom: 65px;
bottom: 40px;
left: 600px;
z-index: 1;
display: flex;
width: calc(100% - 1220px);
min-width: 730px;
width: calc(100vw - 1220px);
min-height: 105px;
padding: 24px;
font-size: 16px;
@ -577,19 +565,6 @@ const selectPostion = val => {
border-radius: 6px;
box-shadow: 0 0 8px 0 rgb(0 0 0 / 15%);
.result_card_content {
position: relative;
display: flex;
width: 100%;
.closed {
position: absolute;
top: -10px;
right: -10px;
cursor: pointer;
}
}
.result_card_left {
display: flex;
flex-direction: column;

@ -21,7 +21,6 @@ defineOptions({
flex-direction: row-reverse;
.voice_consultation {
position: relative;
width: 500px;
margin-left: 16px;
}

@ -17,7 +17,6 @@ defineOptions({
});
const route = useRoute();
const cardType = ref(0);
const isStartFlag = ref(false);
watch(
() => useConsultationStoreHooks().voiceFlag,
val => {
@ -26,19 +25,12 @@ watch(
}
}
);
watch(
() => useConsultationStoreHooks().voiceStartFlag,
val => {
isStartFlag.value = val;
}
);
const dialogVisible = ref(false);
const bodyDialogRef = ref(null);
const suppertDialogRef = ref(null);
const question = ref("");
const changeType = (val: number) => {
if (isStartFlag.value) return;
if (val === 2) {
cardType.value = val;
} else {
@ -78,7 +70,6 @@ const submit = async (val: string) => {
processId: route.query.processId,
text: val
};
useConsultationStoreHooks().changeVoiceFlag(true);
const { data } = await talkByVideo(params);
if (data.type === 2) {
openBodyDialog(data);
@ -152,8 +143,8 @@ onMounted(() => {
</template>
<style lang="scss" scoped>
.text_footer {
position: absolute;
bottom: 24px;
position: fixed;
bottom: 66px;
display: flex;
width: 500px;
height: 66px;
@ -178,9 +169,8 @@ onMounted(() => {
}
.main_footer {
position: absolute;
right: 0;
bottom: 24px;
position: fixed;
bottom: 66px;
display: flex;
width: 500px;
height: 66px;

@ -3,7 +3,6 @@ import { ref } from "vue";
import { downLoadUrl } from "@/utils/auth";
import { onMounted } from "vue";
import { loadFileBase64 } from "@/api/utils";
import { useConsultationStoreHooks } from "@/store/modules/consultation";
defineOptions({
name: "PeopleVideo"
@ -66,7 +65,6 @@ const changeVideo = async url => {
});
myAuto.addEventListener("ended", function () {
useConsultationStoreHooks().changeVoiceFlag(false);
videoFlag.value = false;
status.value = false;
video.remove();

@ -108,10 +108,8 @@ onBeforeUnmount(() => {
</template>
<style lang="scss" scoped>
.voiceInquiry {
position: absolute;
right: 0;
bottom: 24px;
z-index: 99999;
position: fixed;
bottom: 66px;
display: flex;
justify-content: center;
width: 500px;

@ -7,7 +7,6 @@ import ConfirmDiagnosis from "./ConfirmDiagnosis/index.vue";
import ConsultationReview from "./ConsultationReview/index.vue";
import ConsultationEvaluation from "./ConsultationEvaluation/index.vue";
import ConsultationRecords from "./ConsultationRecords/index.vue";
import TipIcon from "@/assets/tip.png";
// import Evaluate from "./Evaluate/index.vue";
import { useConsultationStoreHooks } from "@/store/modules/consultation";
import KnowledgeGraph from "./KnowledgeGraph/index.vue";
@ -85,7 +84,15 @@ onMounted(async () => {
<div class="first_item card_item_img" />
<span>问诊回顾 </span>
</div>
<div
@click="changeIndex(6)"
v-if="inspectSatus === '1'"
:class="[activedIndex === 6 ? 'actived' : '']"
class="card_item"
>
<div class="record_item card_item_img" />
<span>问诊记录</span>
</div>
<div
v-if="inspectSatus === '0'"
class="card_item"
@ -123,18 +130,8 @@ onMounted(async () => {
<div class="knowledge_graph card_item_img" />
<span>知识图谱</span>
</div>
<div
@click="changeIndex(6)"
v-if="inspectSatus === '2'"
:class="[activedIndex === 6 ? 'actived' : '']"
class="card_item record"
>
<div class="record_item card_item_img" />
<span>问诊反馈</span>
<img :src="TipIcon" alt="" />
</div>
</div>
<div :class="[activedIndex === 0 ? 'first_content' : 'main_content']">
<div class="main_content">
<FirstConsultation
v-if="inspectSatus === '0'"
v-show="activedIndex === 0"
@ -263,26 +260,6 @@ onMounted(async () => {
background-image: url("../../assets/newInquiry/main_bg.png");
background-size: 100% 100%;
}
.first_content {
flex: 1;
// min-width: 1760px;
margin-bottom: 24px;
background-image: url("../../assets/newInquiry/main_bg.png");
background-size: 100% 100%;
}
}
.record {
position: relative;
img {
position: absolute;
top: -14px;
right: -13px;
width: 50px;
height: 50px;
}
}
}
</style>

@ -5,6 +5,7 @@ import { Plus, Delete } from "@element-plus/icons-vue";
import { message } from "@/utils/message";
// import { useRoute } from "vue-router";
import { getToken } from "@/utils/auth";
import { createHuman, updateHuman } from "@/api/digitalHuman";
defineOptions({
name: "AddEdit"
});
@ -15,28 +16,30 @@ const id = ref("");
const dialogVisible = ref(false);
const formData = reactive({
iconBase64: "",
directoryDesc: ""
imageFileUrl: "",
imageName: "",
imageFileId: "",
description: ""
});
const ruleFormRef = ref<FormInstance>();
const rules = {
iconBase64: [{ required: true, message: "请选择", trigger: "change" }],
directoryDesc: [{ required: true, message: "请输入", trigger: "change" }]
imageFileUrl: [{ required: true, message: "请选择", trigger: "change" }],
imageName: [{ required: true, message: "请输入", trigger: "change" }],
description: [{ required: true, message: "请输入", trigger: "change" }]
};
const handleSuccess: UploadProps["onSuccess"] = response => {
formData.iconBase64 = `/virtual-patient-manage/fileManage/downloadFile?fileId=${response.data.id}`;
formData.imageFileId = response.data.id;
formData.imageFileUrl = `/virtual-patient-manage/fileManage/downloadFile?fileId=${response.data.id}`;
};
const handleRemove = () => {
formData.iconBase64 = "";
formData.imageFileUrl = "";
formData.imageFileId = "";
fileList.value = [];
};
const beforeUpload: UploadProps["beforeUpload"] = async rawFile => {
// png|jpg 10M
if (
rawFile.type !== "image/png" ||
rawFile.type == "image/jpg" ||
rawFile.type == "image/jpeg"
) {
const type = rawFile.type.split("/")[1];
if (!["png", "jpg", "jpeg"].includes(type)) {
ElMessage.error("上传文件格式务必PNG|JPG|JPEG");
return false;
} else if (rawFile.size / 1024 / 1024 > 10) {
@ -57,7 +60,14 @@ defineExpose({
formData[key] = item[key];
}
}
formData.imageFileUrl = `/virtual-patient-manage/fileManage/downloadFile?fileId=${formData.imageFileId}`;
isEditFlag.value = true;
fileList.value = [];
if (formData.imageFileUrl) {
fileList.value.push({
url: formData.imageFileUrl
});
}
id.value = item.id;
}
}
@ -72,44 +82,33 @@ const closeDialog = () => {
};
const emit = defineEmits(["update"]);
const reset = () => {
if (isEditFlag.value) {
ruleFormRef.value.resetFields([
"diagnosticCriteria",
"diagnosisAssessmentFlag",
"requireCheckFlag",
"expectedDiagnosisResult",
"normalResult"
]);
} else {
ruleFormRef.value.resetFields();
}
// refWangEditor.value.valueHtml = "";
ruleFormRef.value.resetFields();
fileList.value = [];
isEditFlag.value = false;
};
const save = (formEl: FormInstance | undefined) => {
formEl.validate(async (valid, fields) => {
if (valid) {
// formData.result = refWangEditor.value.valueHtml;
// const params = {
// ...formData,
// result: refWangEditor.value.valueHtml,
// diseaseId: route.query.id
// };
const params = {
...formData,
imageFileUrl: undefined
};
if (isEditFlag.value) {
// const res: any = await updateSupportInspect({
// ...params,
// id: id.value
// });
const res: any = await updateHuman({
...params,
id: id.value
});
if (res.code === 200) {
message("修改成功", { type: "success" });
id.value = "";
}
} else {
// const res: any = await addSupportInspect(params);
// if (res.code === 200) {
// message("", { type: "success" });
// }
const res: any = await createHuman(params);
if (res.code === 200) {
message("新增成功", { type: "success" });
}
}
dialogVisible.value = false;
emit("update");
@ -143,7 +142,7 @@ const save = (formEl: FormInstance | undefined) => {
:rules="rules"
label-width="120px"
>
<el-form-item label="选择数字人形象" prop="code">
<el-form-item label="选择数字人形象" prop="imageFileUrl">
<div class="upload_img">
<el-upload
:limit="1"
@ -155,7 +154,7 @@ const save = (formEl: FormInstance | undefined) => {
:file-list="fileList"
:on-success="handleSuccess"
:before-upload="beforeUpload"
:class="{ hide: formData.iconBase64 !== '' }"
:class="{ hide: formData.imageFileUrl !== '' }"
>
<el-icon><Plus /></el-icon>
@ -163,7 +162,7 @@ const save = (formEl: FormInstance | undefined) => {
<div>
<img
class="el-upload-list__item-thumbnail"
:src="formData.iconBase64"
:src="formData.imageFileUrl"
alt=""
/>
<span class="el-upload-list__item-actions">
@ -180,13 +179,22 @@ const save = (formEl: FormInstance | undefined) => {
<div class="tip">仅支持JPGPNG格式图片尺寸420*746</div>
</div>
</el-form-item>
<el-form-item label="说明 " prop="directoryDesc">
<el-form-item label="名称 " prop="imageName">
<el-input
:maxLength="10"
size="large"
placeholder="请输入"
v-model="formData.imageName"
/>
</el-form-item>
<el-form-item label="说明 " prop="description">
<el-input
:rows="4"
size="large"
:maxLength="500"
type="textarea"
placeholder="请输入"
v-model="formData.directoryDesc"
v-model="formData.description"
/>
</el-form-item>
</el-form>

@ -3,6 +3,9 @@ import { onMounted, ref } from "vue";
import AddEdit from "./addEdit.vue";
import { Edit, Delete } from "@element-plus/icons-vue";
import { downLoadUrl } from "@/utils/auth";
import moreIcon from "@/assets/svg/consultation/more.svg?component";
import { deleteHuman, queryPageList } from "@/api/digitalHuman";
import { message } from "@/utils/message";
const dataList = ref([]);
const activedId = ref("");
const AddEditRef = ref();
@ -16,20 +19,25 @@ const onMouseenter = id => {
const onMouseleave = () => {
activedId.value = "";
};
const handleCommand = async (e: any) => {
const handleCommand = async (e: any, item) => {
if (e === "edit") {
// EditMaterialsRef.value.open(0, item);
AddEditRef.value.open(item);
} else {
// const res: any = await deleteMaterial({
// id: item.id
// });
// if (res.code === 200) {
// message("", { type: "success" });
// getData();
// }
const res: any = await deleteHuman({
id: item.id
});
if (res.code === 200) {
message("删除成功", { type: "success" });
getData();
}
}
};
const getData = async () => {
const res: any = await queryPageList();
if (res.code === 200) {
dataList.value = res.data;
}
};
const getData = () => {};
onMounted(() => {
getData();
});
@ -57,10 +65,10 @@ onMounted(() => {
@mouseleave.prevent="onMouseleave()"
>
<div class="folder_img">
<img :src="downLoadUrl(item.fileResourceId)" alt="" />
<img :src="downLoadUrl(item.imageFileId)" alt="" />
</div>
<div :title="item.materialName" class="name">
{{ item.materialName }}
<div :title="item.imageName" class="name">
{{ item.imageName }}
</div>
<el-dropdown
@command="e => handleCommand(e, item)"
@ -81,7 +89,7 @@ onMounted(() => {
</el-dropdown>
</div>
</div>
<AddEdit ref="AddEditRef" />
<AddEdit @update="getData" ref="AddEditRef" />
</div>
</template>
<style lang="scss" scoped>
@ -115,8 +123,9 @@ onMounted(() => {
background: #f5f5f5;
img {
width: 130px;
height: 130px;
width: 190px;
height: 190px;
border-radius: 12px 12px 0 0;
}
}

@ -0,0 +1,149 @@
<script setup lang="ts">
import { PaginationProps } from "@pureadmin/table";
import { reactive, ref } from "vue";
import { queryPageList } from "@/api/generalRules";
import { onMounted } from "vue";
defineOptions({
name: "ConsultationResults"
});
const dataList = ref([{}]);
const loading = ref(false);
const AddEditRef = ref(null);
const seachForm = reactive({
description: ""
});
const pagination = reactive<PaginationProps>({
total: 0,
pageSize: 10,
currentPage: 1,
background: true
});
const columns: TableColumnList = [
{
label: "用户问题",
prop: "nameZhPath"
},
{
label: "回复",
prop: "description",
minWidth: 240
},
{
label: "问诊类目",
prop: "defaultAnswer"
},
{
label: "病历编号",
prop: "defaultAnswer"
},
{
label: "姓名",
prop: "defaultAnswer"
},
{
label: "阈值(%",
prop: "defaultAnswer"
},
{
label: "应答状态",
slot: "statusSlot"
},
{
label: "问诊时间",
prop: "defaultAnswer"
},
{
label: "操作",
fixed: "right",
slot: "operation"
}
];
const getData = async () => {
const params = {
pageNum: pagination.currentPage,
pageSize: pagination.pageSize,
description: seachForm.description
};
const res: any = await queryPageList(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 = "";
search();
};
const add = () => {
AddEditRef.value.open();
};
const del = item => {};
onMounted(() => {
getData();
});
</script>
<template>
<div class="app-main-content">
<div class="seach">
<el-form :model="seachForm">
<el-row>
<el-form-item label="问题:">
<el-input size="large" v-model="seachForm.description" />
</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="add" type="primary"
>批量删除</el-button
>
</el-row>
</div>
<pure-table
align-whole="center"
showOverflowTooltip
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="del(row)"></el-button>
</template>
</pure-table>
</div>
</div>
</template>

@ -160,8 +160,8 @@ const beforeUpload: UploadProps["beforeUpload"] = async rawFile => {
// png|jpg 10M
if (
rawFile.type !== "image/png" ||
rawFile.type == "image/jpg" ||
rawFile.type == "image/jpeg"
rawFile.type !== "image/jpg" ||
rawFile.type !== "image/jpeg"
) {
ElMessage.error("上传文件格式务必PNG|JPG|JPEG");
return false;

@ -13,14 +13,10 @@ import bg from "../../assets/login/login_bg.png";
import { useRenderIcon } from "@/components/ReIcon/src/hooks";
// import update from "./components/update.vue";
import { ref, reactive, onMounted, onBeforeUnmount, nextTick } from "vue";
import registerIcon from "@/assets/login/register.png";
import { getRegister, changePassWord } from "@/api/user";
import Lock from "@iconify-icons/icon-park-outline/lock";
import User from "@iconify-icons/icon-park-outline/user";
import PreviewClose from "@iconify-icons/icon-park-outline/preview-close";
import PreviewOpen from "@iconify-icons/icon-park-outline/preview-open";
import IdCard from "@iconify-icons/icon-park-outline/id-card";
// import InviteCode from "@iconify-icons/icon-park-outline/user-to-user-transmission";
defineOptions({
name: "Login"
@ -28,11 +24,11 @@ defineOptions({
const router = useRouter();
const loading = ref(false);
const ruleFormRef = ref<FormInstance>();
const registerFormRef = ref<FormInstance>();
const modifyFormRef = ref<FormInstance>();
const checked = ref(false);
// const currentPage = computed(() => {
// return useUserStoreHook().currentPage;
// });
const cardType = ref(1);
const { initStorage } = useLayout();
initStorage();
@ -44,18 +40,7 @@ const ruleForm = reactive({
username: "",
password: ""
});
const registerForm = reactive({
account: "",
name: "",
password: "",
newPassword: ""
});
const modifyForm = reactive({
account: "",
name: "",
password: "",
newPassword: ""
});
const onLogin = async (formEl: FormInstance | undefined) => {
loading.value = true;
if (!formEl) return;
@ -93,46 +78,6 @@ const onLogin = async (formEl: FormInstance | undefined) => {
}
});
};
const register = async (formEl: FormInstance | undefined) => {
loading.value = true;
if (!formEl) return;
await formEl.validate(async (valid, fields) => {
if (valid) {
const res: any = await getRegister({
account: registerForm.account,
name: registerForm.name,
password: registerForm.password
});
loading.value = false;
if (res.code === 200) {
changeCardType(4);
}
} else {
loading.value = false;
return fields;
}
});
};
const onModify = async (formEl: FormInstance | undefined) => {
loading.value = true;
if (!formEl) return;
await formEl.validate(async (valid, fields) => {
if (valid) {
const res: any = await changePassWord({
account: modifyForm.account,
name: modifyForm.name,
password: modifyForm.password
});
loading.value = false;
if (res.code === 200) {
changeCardType(5);
}
} else {
loading.value = false;
return fields;
}
});
};
const passwordType = ref("password");
const refInput = ref();
/** 使用公共函数,避免`removeEventListener`失效 */
@ -153,23 +98,6 @@ function showPass() {
});
}
const changeCardType = val => {
cardType.value = val;
};
const validateConfirmPassword = (rule, value, callback) => {
if (value !== registerForm.password) {
callback(new Error("请再次输入密码以确保一致,不能留空"));
} else {
callback();
}
};
const validatePassword = (rule, value, callback) => {
if (value !== modifyForm.password) {
callback(new Error("请再次输入密码以确保一致,不能留空"));
} else {
callback();
}
};
onMounted(() => {
window.document.addEventListener("keypress", onkeypress);
});
@ -188,7 +116,7 @@ onBeforeUnmount(() => {
<span class="systeam-name">虚拟病人系统</span>
<span class="desc">Welcome to the Virtual Patient System</span>
</div>
<div v-if="cardType === 1" class="login-box">
<div class="login-box">
<div class="login-form">
<div class="top">
<p class="title">欢迎登录虚拟病人系统</p>
@ -265,7 +193,6 @@ onBeforeUnmount(() => {
>
{{ "忘记密码?" }}
</el-button> -->
<div class="btn-color" @click="changeCardType(3)"></div>
</div>
<el-button
class="w-full mt-9 login-btn"
@ -279,273 +206,8 @@ onBeforeUnmount(() => {
</el-button>
</Motion>
</el-form>
<div @click="changeCardType(2)" class="desc">还没账号去注册</div>
</div>
</div>
<div v-if="cardType === 2" class="register-box">
<div class="login-form">
<div class="top">
<p class="title">注册账号</p>
<p class="top_desc">Sign up for an to account</p>
</div>
<el-form ref="registerFormRef" :model="registerForm" size="large">
<Motion :delay="100">
<el-form-item
:rules="[
{
required: true,
message: '请使用中文填写您的姓名6字以内',
trigger: 'blur'
},
{
pattern: /^[\u4e00-\u9fa5]+$/,
message: '请使用中文填写您的姓名6字以内',
trigger: 'change'
}
]"
prop="name"
>
<el-input
maxlength="6"
style="height: 60px; font-size: 16px"
v-model="registerForm.name"
placeholder="请输入姓名"
:prefix-icon="useRenderIcon(IdCard)"
/>
</el-form-item>
</Motion>
<Motion :delay="100">
<el-form-item
:rules="[
{
required: true,
message: '请输入账号',
trigger: 'blur'
},
{
pattern: /^[a-zA-Z0-9]{6,18}$/,
message: '使用6至18个英文字母或数字',
trigger: 'change'
}
]"
prop="account"
>
<el-input
autocomplete="off"
style="height: 60px; font-size: 16px"
v-model="registerForm.account"
placeholder="请输入账号"
:prefix-icon="useRenderIcon(User)"
/>
</el-form-item>
</Motion>
<Motion :delay="150">
<el-form-item
prop="password"
:rules="[
{
required: true,
message: '请输入密码',
trigger: 'blur'
},
{
pattern: /^(?![\u4e00-\u9fa5\s])[\x21-\x7e]{6,18}$/,
message: '密码6-18位 不包含中文特殊字符和空格',
trigger: 'change'
}
]"
>
<el-input
type="password"
autocomplete="new-password"
style="height: 60px; font-size: 16px"
v-model="registerForm.password"
placeholder="请输入密码"
:prefix-icon="useRenderIcon(Lock)"
/>
</el-form-item>
</Motion>
<Motion :delay="150">
<el-form-item
prop="newPassword"
:rules="[
{
required: true,
message: '请再次输入密码',
trigger: 'blur'
},
{
pattern: /^(?![\u4e00-\u9fa5\s])[\x21-\x7e]{6,18}$/,
message: '密码6-18位 不包含中文特殊字符和空格',
trigger: 'change'
},
{ validator: validateConfirmPassword, trigger: 'blur' }
]"
>
<el-input
style="height: 60px; font-size: 16px"
type="password"
autocomplete="new-password"
v-model="registerForm.newPassword"
placeholder="请再次输入密码"
:prefix-icon="useRenderIcon(Lock)"
/>
</el-form-item>
</Motion>
<Motion :delay="250">
<el-button
class="w-full mt-9 login-btn"
size="large"
type="primary"
color="rgba(66, 135, 255, 1)"
:loading="loading"
@click="register(registerFormRef)"
>
确定
</el-button>
</Motion>
</el-form>
<div @click="changeCardType(1)" class="desc">已有账号去登录</div>
</div>
</div>
<div v-if="cardType === 3" class="login-box" style="height: 560px">
<div class="login-form">
<div class="top">
<p class="title" style="margin-bottom: 52px">忘记密码</p>
<!-- <p class="top_desc" style="font-size: 14px">
为了您的账户安全请重新设置位数密码
</p> -->
</div>
<el-form ref="modifyFormRef" :model="modifyForm" size="large">
<Motion :delay="100">
<el-form-item
:rules="[
{
required: true,
message: '请输入账号',
trigger: 'blur'
}
]"
prop="account"
>
<el-input
style="height: 60px; font-size: 16px"
v-model="modifyForm.account"
placeholder="请输入账号"
:prefix-icon="useRenderIcon(User)"
/>
</el-form-item>
</Motion>
<Motion :delay="150">
<el-form-item
prop="password"
:rules="[
{
required: true,
message: '请输入新密码',
trigger: 'blur'
},
{
pattern: /^(?![\u4e00-\u9fa5\s])[\x21-\x7e]{6,18}$/,
message: '密码6-18位 不包含中文特殊字符和空格',
trigger: 'change'
}
]"
>
<el-input
type="password"
autocomplete="new-password"
style="height: 60px; font-size: 16px"
v-model="modifyForm.password"
placeholder="请输入密码"
:prefix-icon="useRenderIcon(Lock)"
/>
</el-form-item>
</Motion>
<Motion :delay="150">
<el-form-item
prop="newPassword"
:rules="[
{
required: true,
message: '请再次输入新密码',
trigger: 'blur'
},
{
pattern: /^(?![\u4e00-\u9fa5\s])[\x21-\x7e]{6,18}$/,
message: '密码6-18位 不包含中文特殊字符和空格',
trigger: 'change'
},
{ validator: validatePassword, trigger: 'blur' }
]"
>
<el-input
type="password"
autocomplete="new-password"
style="height: 60px; font-size: 16px"
v-model="modifyForm.newPassword"
placeholder="请再次输入新密码"
:prefix-icon="useRenderIcon(Lock)"
/>
</el-form-item>
</Motion>
<Motion :delay="250">
<el-button
class="w-full mt-9 login-btn"
size="large"
type="primary"
color="rgba(66, 135, 255, 1)"
:loading="loading"
@click="onModify(modifyFormRef)"
>
确定
</el-button>
</Motion>
</el-form>
<div @click="changeCardType(1)" class="desc">已有账号去登录</div>
</div>
</div>
<div v-if="cardType === 4" class="login-box" style="height: 546px">
<div class="content">
<img :src="registerIcon" alt="" />
<div class="content_top">
<p class="content_top_title">注册成功</p>
<p class="content_top_desc">
已注册成功您可以使用账号密码登录系统
</p>
</div>
<el-button
style="margin-top: 130px"
class="w-full login-btn"
size="large"
type="primary"
color="rgba(66, 135, 255, 1)"
@click="changeCardType(1)"
>
去登录
</el-button>
</div>
</div>
<div v-if="cardType === 5" class="login-box" style="height: 546px">
<div class="content">
<img :src="registerIcon" alt="" />
<div class="content_top">
<p class="content_top_title">重置成功</p>
<p class="content_top_desc">您可以重新登录系统验证您的新密码</p>
</div>
<el-button
style="margin-top: 130px"
class="w-full login-btn"
size="large"
type="primary"
color="rgba(66, 135, 255, 1)"
@click="changeCardType(1)"
>
重新登录
</el-button>
<!-- 忘记密码 -->
<!-- <update v-if="currentPage === 4" /> -->
</div>
</div>
</div>
@ -571,16 +233,12 @@ onBeforeUnmount(() => {
}
.btn-color {
font-size: 16px;
color: #4287ff;
cursor: pointer;
color: #1c0d82;
}
.desc {
margin-top: 16px;
font-size: 14px;
color: #787878;
cursor: pointer;
.btn-color:hover {
color: #1c0d82;
opacity: 0.5;
}
.el-input__icon {
@ -605,8 +263,7 @@ onBeforeUnmount(() => {
}
}
.login-box,
.register-box {
.login-box {
.top {
.title {
font-size: 24px;
@ -621,46 +278,5 @@ onBeforeUnmount(() => {
color: #666;
}
}
.content {
display: flex;
flex-direction: column;
align-items: center;
width: 100%;
padding: 35px 40px 0;
img {
width: 137px;
height: 94px;
margin-bottom: 40px;
}
.content_top {
.content_top_title {
font-size: 24px;
color: #333;
}
.content_top_desc {
margin-top: 8px;
font-size: 14px;
color: #666;
}
}
}
}
.register-box {
display: flex;
flex-direction: column;
align-items: center;
justify-content: space-between;
width: 500px;
height: 665px;
padding-top: 65px;
margin-left: 160px;
text-align: center;
background: #fff;
border-radius: 10px;
}
</style>

@ -29,7 +29,6 @@ const addCase = () => {
caseList.value = medicalRecList.value;
};
const goBack = () => {
console.log("111", userPagination);
addFlag.value = false;
caseList.value = diagnoseProcessList.value;
};
@ -115,7 +114,6 @@ const getMedicalRecPageList = async () => {
};
const handleUserChange = val => {
userPagination.currentPage = val;
console.log("111", userPagination);
getDiagnoseProcessPageList();
};
const handleCaseChange = val => {
@ -221,7 +219,6 @@ onMounted(() => {
</div>
<div class="footer">
<el-pagination
:current-page="userPagination.currentPage"
v-if="userPagination.total > 11 && !addFlag"
@current-change="handleUserChange"
:hide-on-single-page="true"
@ -232,7 +229,6 @@ onMounted(() => {
class="mt-4"
/>
<el-pagination
:current-page="casePagination.currentPage"
v-if="casePagination.total > 11 && addFlag"
@current-change="handleCaseChange"
:hide-on-single-page="true"
@ -319,8 +315,6 @@ onMounted(() => {
display: flex;
justify-content: center;
margin-top: 80px;
margin-bottom: 32px;
overflow: auto;
.content {
width: 1200px;

@ -46,7 +46,7 @@ export default ({ command, mode }: ConfigEnv): UserConfigExport => {
proxy: {
// 类型: Record<string, string | ProxyOp 为开发服务器配置自定义代理规则
"/virtual-patient-manage/": {
target: "http://192.168.10.137:8891/",
target: "http://192.168.10.25:8891/",
changeOrigin: true,
secure: false
// eslint-disable-next-line no-shadow

Loading…
Cancel
Save