fix: 二期代码提交

develop
xiangcongshuai 1 year ago
parent a546a88664
commit 6b540ef38e

@ -7,175 +7,78 @@ import { MockMethod } from "vite-plugin-mock";
* common * common
*/ */
// const permissionRouter = { const inquiryManagementRouter = {
// path: "/permission", path: "/inquiryManagement",
// meta: {
// title: "用户管理",
// icon: "lollipop",
// rank: 10
// },
// children: [
// {
// path: "/permission/page/index",
// name: "PermissionPage",
// meta: {
// title: "页面权限",
// roles: ["admin", "common"]
// }
// },
// {
// path: "/permission/button/index",
// name: "PermissionButton",
// meta: {
// title: "按钮权限",
// roles: ["admin", "common"],
// auths: ["btn_add", "btn_edit", "btn_delete"]
// }
// }
// ]
// };
// const projectRouter = {
// path: "/project",
// meta: {
// title: "项目管理",
// icon: "lollipop",
// rank: 11
// },
// children: [
// {
// path: "/project/list/index",
// name: "ProjectList",
// meta: {
// title: "项目列表",
// roles: ["admin", "common"]
// }
// },
// {
// path: "/project/details/index",
// name: "ProjectDetails",
// meta: {
// title: "项目详情",
// roles: ["admin", "common"]
// }
// }
// ]
// };
// const modelRouter = {
// path: "/aiModel",
// meta: {
// title: "模型管理",
// icon: "lollipop",
// rank: 12
// },
// children: [
// {
// path: "/aiModel",
// name: "AiModelPage",
// meta: {
// title: "模型管理",
// roles: ["admin", "common"]
// }
// }
// ]
// };
// const deviceRouter = {
// path: "/device",
// meta: {
// title: "设备管理",
// icon: "lollipop",
// rank: 13
// },
// children: [
// {
// path: "/device",
// name: "DevicePage",
// meta: {
// title: "设备管理",
// roles: ["admin", "common"]
// }
// }
// ]
// };
// const warningRouter = {
// path: "/warning",
// meta: {
// title: "告警管理",
// icon: "Alarm",
// rank: 14
// },
// children: [
// {
// path: "/warning/list/index",
// name: "WarningList",
// meta: {
// title: "告警列表",
// roles: ["admin", "common"]
// }
// }
// ]
// };
const enterpriseRouter = {
path: "/enterprise",
meta: { meta: {
title: "企业管理", title: "问诊管理",
icon: "buildingOne", icon: "projectIcon",
rank: 16 rank: 11
}, },
children: [ children: [
{ {
path: "/enterprise/index", path: "/inquiryManagement/bodyInspect",
name: "EnterpriseList", name: "BodyInspect",
meta: { meta: {
title: "企业管理", title: "体格检查",
roles: ["admin"] roles: ["admin", "common"]
} }
} },
]
};
const myAlgorithmRouter = {
path: "/myAlgorithm",
meta: {
title: "我的算法库",
icon: "terminal",
rank: 17
},
children: [
{ {
path: "/myAlgorithm/index", path: "/inquiryManagement/supportInspect",
name: "myAlgorithm", name: "SupportInspect",
meta: { meta: {
title: "我的算法库", title: "辅助检查",
roles: ["admin", "common"]
}
},
{
path: "/inquiryManagement/disposalPlan",
name: "DisposalPlan",
meta: {
title: "处置计划",
roles: ["admin", "common"] roles: ["admin", "common"]
} }
} }
] ]
}; };
const algorithmTestingRouter = { const caseManagement = {
path: "/algorithmTesting", path: "/caseManagement",
redirect: "/caseManagement/list",
meta: { meta: {
title: "算法实测", title: "病历管理",
icon: "camera", icon: "projectIcon",
rank: 18 rank: 11
}, },
children: [ children: [
{ {
path: "/algorithmTesting/index", path: "/caseManagement/diseaseType",
name: "algorithmTesting", name: "DiseaseType",
meta: { meta: {
title: "算法实测", title: "疾病分类",
roles: ["admin", "common"]
}
},
{
path: "/caseManagement/list",
name: "CaseManagement",
meta: {
title: "病历管理",
showLink: true,
roles: ["admin", "common"]
}
},
{
path: "/caseManagement/add",
name: "caseManagementAdd",
meta: {
title: "新建病历",
showLink: false,
roles: ["admin", "common"] roles: ["admin", "common"]
} }
} }
] ]
}; };
export default [ export default [
{ {
url: "/getAsyncRoutes", url: "/getAsyncRoutes",
@ -183,7 +86,8 @@ export default [
response: () => { response: () => {
return { return {
success: true, success: true,
data: [enterpriseRouter, myAlgorithmRouter, algorithmTestingRouter] code: 200,
data: [inquiryManagementRouter, caseManagement]
}; };
} }
} }

@ -35,6 +35,7 @@
"@vue/composition-api": "^1.7.2", "@vue/composition-api": "^1.7.2",
"@vueuse/core": "^10.2.0", "@vueuse/core": "^10.2.0",
"@vueuse/motion": "^2.0.0", "@vueuse/motion": "^2.0.0",
"@wangeditor/editor-for-vue": "^5.1.12",
"animate.css": "^4.1.1", "animate.css": "^4.1.1",
"axios": "^1.4.0", "axios": "^1.4.0",
"dayjs": "^1.11.8", "dayjs": "^1.11.8",
@ -57,7 +58,8 @@
"vue": "^3.3.4", "vue": "^3.3.4",
"vue-router": "^4.2.2", "vue-router": "^4.2.2",
"vue-types": "^5.1.0", "vue-types": "^5.1.0",
"vue3-seamless-scroll": "^2.0.1" "vue3-seamless-scroll": "^2.0.1",
"wangeditor": "^4.7.15"
}, },
"devDependencies": { "devDependencies": {
"@commitlint/cli": "^17.6.6", "@commitlint/cli": "^17.6.6",

File diff suppressed because it is too large Load Diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

After

Width:  |  Height:  |  Size: 4.2 KiB

@ -12,7 +12,7 @@
"Weak": false, "Weak": false,
"HideTabs": true, "HideTabs": true,
"SidebarStatus": true, "SidebarStatus": true,
"EpThemeColor": "rgba(28, 13, 130)", "EpThemeColor": "#4287ff",
"ShowLogo": true, "ShowLogo": true,
"ShowModel": "smart", "ShowModel": "smart",
"MenuArrowIconNoTransition": true, "MenuArrowIconNoTransition": true,

@ -0,0 +1,189 @@
import { http } from "@/utils/http";
/** 分页查询问诊流程列表 */
export const queryDiagnoseProcessPageList = (data?: object) => {
return http.request(
"get",
"/virtual-patient/diagnoseHall/queryDiagnoseProcessPageList",
{
params: data
}
);
};
/** 分页查询病例信息列表 */
export const queryMedicalRecPageList = (data?: object) => {
return http.request(
"get",
"/virtual-patient/diagnoseHall/queryMedicalRecPageList",
{
params: data
}
);
};
/** 通过流程id查询电子病例信息 */
export const findByProcessId = (data?: object) => {
return http.request("get", "/virtual-patient/medicalRecord/findByProcessId", {
params: data
});
};
/** 更新电子病例信息*/
export const updateCase = (data?: object) => {
return http.request("put", "/virtual-patient//medicalRecord/update", {
data
});
};
/** 查询选择初步诊断关联的问诊记录 */
export const queryRecordForPrimaryChoose = (data?: object) => {
return http.request(
"get",
"/virtual-patient/askPrimary/queryRecordForPrimaryChoose",
{
params: data
}
);
};
/** 新增初步诊断*/
export const savePrimary = (data?: object) => {
return http.request("post", "/virtual-patient/askPrimary/savePrimary", {
data
});
};
/** 批量进行辅助检查*/
export const execAskAncillaryBatch = (data?: object) => {
return http.request(
"post",
"/virtual-patient/askAncillary/execAskAncillaryBatch",
{
data
}
);
};
/** 查询初步诊断需要填写的诊断依据 */
export const queryDiagnosticBasisListForPrimary = (data?: object) => {
return http.request(
"get",
"/virtual-patient/askPrimary/queryDiagnosticBasisListForPrimary",
{
params: data
}
);
};
/** 保存初步诊断以及鉴别依据 */
export const confirmPrimaryByAskEnd = (data?: object) => {
return http.request(
"post",
"/virtual-patient/askPrimary/confirmPrimaryByAskEnd",
{
data
}
);
};
/** 查询处置计划树 */
export const queryTree = (data?: object) => {
return http.request("get", "/virtual-patient/treatmentPlan/queryTree", {
params: data
});
};
/** 新增处置计划记录 */
export const savePlan = (data?: object) => {
return http.request("post", "/virtual-patient/treatmentPlan/record/save", {
data
});
};
/** 查询处置计划记录列表 */
export const queryPlanRecord = (data?: object) => {
return http.request(
"get",
"/virtual-patient/treatmentPlan/record/queryRecord",
{
params: data
}
);
};
/** 查询药品列表 */
export const getDrugList = (data?: object) => {
return http.request("get", "/virtual-patient/treatmentPlan/getDrugList", {
params: data
});
};
// 删除处置计划记录;
export const deleteRecord = (data?: object) => {
return http.request(
"delete",
"/virtual-patient/treatmentPlan/record/delete",
{
params: data
}
);
};
/** 修改处置计划记录 */
export const updateRecord = (data?: object) => {
return http.request("put", "/virtual-patient/treatmentPlan/record/update", {
data
});
};
/** 查询处置计划详情 */
export const queryDetails = (data?: object) => {
return http.request(
"get",
"/virtual-patient/treatmentPlan/record/queryDetails",
{
params: data
}
);
};
/** 新增处置计划记录 */
export const confirmPlan = (data?: object) => {
return http.request("post", "/virtual-patient/treatmentPlan/confirm", {
data
});
};
/**
*/
export const resourceIsFree = (data?: object) => {
return http.request("get", "/virtual-patient//user/resourceIsFree", {
params: data
});
};
/** IP,websocket使
*/
export const queryWebSocketUrl = (data?: object) => {
return http.request("get", "/virtual-patient/user/queryWebSocketUrl", {
params: data
});
};
/**
*/
export const saveAncillaryAssessmentResult = (data?: object) => {
return http.request(
"post",
"/virtual-patient/askAncillary/saveAncillaryAssessmentResult",
{
data
}
);
};
/**
*/
export const queryPrimaryDetailInfo = (data?: object) => {
return http.request(
"get",
"/virtual-patient/askPrimary/queryPrimaryDetailInfo",
{
params: data
}
);
};
/** 使
*/
export const talkByVideo = (data?: object) => {
return http.request("post", "/virtual-patient/ask/talkByVideo", {
data
});
};

@ -0,0 +1,215 @@
import { http } from "@/utils/http";
/** 查询分页疾病列表 */
export const queryPageList = (data?: object) => {
return http.request("get", "/virtual-patient-manage/disease/queryPageList", {
params: data
});
};
/** 新增疾病 */
export const addSave = (data?: object) => {
return http.request("post", "/virtual-patient-manage/disease/save", {
data
});
};
/** 修改疾病信息 */
export const update = (data?: object) => {
return http.request("put", "/virtual-patient-manage/disease/update", {
data
});
};
/** 删除疾病信息 */
export const deleteItem = (data?: object) => {
return http.request("delete", "/virtual-patient-manage/disease/delete", {
params: data
});
};
/** 根据疾病id查询问题库信息列表 */
export const queryListByDiseaseId = (data?: object) => {
return http.request(
"get",
"/virtual-patient-manage/diseaseQuestion/queryListByDiseaseId",
{
params: data
}
);
};
export const diseaseQuestionDel = (data?: object) => {
return http.request(
"delete",
"/virtual-patient-manage/diseaseQuestion/delete",
{
params: data
}
);
};
/** 查询问题库列表 */
export const queryListAqLibrary = (data?: object) => {
return http.request(
"get",
"/virtual-patient-manage//aqLibrary/queryPageList",
{
params: data
}
);
};
/** 保存疾病问题信息 */
export const questionBatchSave = (data?: object) => {
return http.request(
"post",
"/virtual-patient-manage/diseaseQuestion/batchSave",
{
data
}
);
};
/** 查询问题类目编码列表 */
export const queryItemList = (data?: object) => {
return http.request(
"get",
"/virtual-patient-manage/aqLibrary/queryItemList",
{
params: data
}
);
};
/** 查询体格检查的工具列表 */
export const queryPhysicalToolList = (data?: object) => {
return http.request(
"get",
"/virtual-patient-manage//physicalTool/queryPhysicalToolList",
{
params: data
}
);
};
/** 根据疾病id查询体格检查列表 */
export const queryBodyListByDiseaseId = (data?: object) => {
return http.request(
"get",
"/virtual-patient-manage/diseasePhysical/queryListByDiseaseId",
{
params: data
}
);
};
/** 新增体格检查信息 */
export const addBodyInspect = (data?: object) => {
return http.request("post", "/virtual-patient-manage/diseasePhysical/save", {
data
});
};
/** 修改体格检查信息 */
export const updateBodyInspect = (data?: object) => {
return http.request("put", "/virtual-patient-manage/diseasePhysical/update", {
data
});
};
/** 删除体格检查 */
export const deleteBodyItem = (data?: object) => {
return http.request(
"delete",
"/virtual-patient-manage/diseasePhysical/delete",
{
params: data
}
);
};
/** 根据疾病id查询疾病处置信息列表 */
export const queryListBiseaseTreatmentPlan = (data?: object) => {
return http.request(
"get",
"/virtual-patient-manage/diseaseTreatmentPlan/queryListByDiseaseId",
{
params: data
}
);
};
/** 保存处置信息 */
export const addDiseaseTreatmentPlan = (data?: object) => {
return http.request(
"post",
"/virtual-patient-manage/diseaseTreatmentPlan/batchSave",
{
data
}
);
};
/** 查询处置计划树 */
export const queryTreeTreatmentPlan = (data?: object) => {
return http.request(
"get",
"/virtual-patient-manage/diseaseTreatmentPlan/queryTree",
{
params: data
}
);
};
/** 删除疾病处置计划 */
export const deleteTreatmentPlan = (data?: object) => {
return http.request(
"delete",
"/virtual-patient-manage/diseaseTreatmentPlan/delete",
{
params: data
}
);
};
/** 查询疾病身体部位树 */
export const queryTreeDiseasePhysical = (data?: object) => {
return http.request(
"get",
"/virtual-patient-manage/diseasePhysical/queryTree",
{
params: data
}
);
};
/** 新增辅助检查信息 */
export const addSupportInspect = (data?: object) => {
return http.request("post", "/virtual-patient-manage/diseaseAncillary/save", {
data
});
};
/** 修改体格检查信息 */
export const updateSupportInspect = (data?: object) => {
return http.request(
"put",
"/virtual-patient-manage/diseaseAncillary/update",
{
data
}
);
};
/** 删除体格检查 */
export const deleteSupportItem = (data?: object) => {
return http.request(
"delete",
"/virtual-patient-manage/diseaseAncillary/delete",
{
params: data
}
);
};
/** 查询疾病辅助检查项目列表 */
export const queryAncillaryItemList = (data?: object) => {
return http.request(
"get",
"/virtual-patient-manage/diseaseAncillary/queryAncillaryItemList",
{
params: data
}
);
};
/** 根据疾病id查询疾病辅助检查信息列表 */
export const querySupportLsit = (data?: object) => {
return http.request(
"get",
"/virtual-patient-manage/diseaseAncillary/queryListByDiseaseId",
{
params: data
}
);
};

@ -88,10 +88,10 @@ export const queryPhysicalToolList = (data?: object) => {
/** 查询体格检查的结果(执行体格检查) */ /** 查询体格检查的结果(执行体格检查) */
export const queryAskPhysicalResult = (data?: object) => { export const queryAskPhysicalResult = (data?: object) => {
return http.request( return http.request(
"get", "post",
"/virtual-patient/askPhysical/queryAskPhysicalResult", "/virtual-patient/askPhysical/queryAskPhysicalResult",
{ {
params: data data
} }
); );
}; };

@ -0,0 +1,112 @@
import { http } from "@/utils/http";
/** 初步诊断下拉列表联想 */
export const queryDiseaseListByDropList = (data?: object) => {
return http.request(
"get",
"/virtual-patient-manage/medicalRecManage/queryDiseaseListByDropList",
{
params: data
}
);
};
/** 病历管理分页查询 */
export const queryMedicalRecPage = (data?: object) => {
return http.request(
"get",
"/virtual-patient-manage/medicalRecManage/queryMedicalRecPage",
{
params: data
}
);
};
/** 创建疾病时的疾病列表 */
export const queryDiseaseListByCreat = (data?: object) => {
return http.request(
"get",
"/virtual-patient-manage/medicalRecManage/queryDiseaseListByCreat",
{
params: data
}
);
};
/** 创建病历时查看配置的体格检查项 */
export const queryDiseasePhysicalByCreat = (data?: object) => {
return http.request(
"get",
"/virtual-patient-manage/medicalRecManage/queryDiseasePhysicalByCreat",
{
params: data
}
);
};
/** 创建病历时查看配置的辅助检查项 */
export const queryDiseaseAncillaryByCreat = (data?: object) => {
return http.request(
"get",
"/virtual-patient-manage/medicalRecManage/queryDiseaseAncillaryByCreat",
{
params: data
}
);
};
/** 新增病历*/
export const createMedicalRec = (data?: object) => {
return http.request(
"post",
"/virtual-patient-manage/medicalRecManage/createMedicalRec",
{
data
}
);
};
/** 创建病历时, 应答策略查询问题(目前只支持单一疾病) */
export const queryQuestionListByCreat = (data?: object) => {
return http.request(
"get",
"/virtual-patient-manage/medicalRecManage/queryQuestionListByCreat",
{
params: data
}
);
};
/** 创建病历时查看配置的处置计划 */
export const queryDiseaseTreatmentPlanByCreat = (data?: object) => {
return http.request(
"get",
"/virtual-patient-manage/medicalRecManage/queryDiseaseTreatmentPlanByCreat",
{
params: data
}
);
};
/** 删除病历 */
export const deleteMedicalRec = (data?: object) => {
return http.request(
"get",
"/virtual-patient-manage/medicalRecManage/deleteMedicalRec",
{
params: data
}
);
};
/** 查询病例详细信息 */
export const queryMedicalRecInfo = (data?: object) => {
return http.request(
"get",
"/virtual-patient-manage/medicalRecManage/queryMedicalRecInfo",
{
params: data
}
);
};
/** 修改病历 */
export const modifyMedicalRec = (data?: object) => {
return http.request(
"post",
"/virtual-patient-manage/medicalRecManage/modifyMedicalRec",
{
data
}
);
};

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 MiB

After

Width:  |  Height:  |  Size: 1.4 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 42 KiB

After

Width:  |  Height:  |  Size: 113 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 MiB

After

Width:  |  Height:  |  Size: 1.6 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 MiB

After

Width:  |  Height:  |  Size: 1.7 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 MiB

After

Width:  |  Height:  |  Size: 1.1 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 649 KiB

After

Width:  |  Height:  |  Size: 583 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 792 KiB

After

Width:  |  Height:  |  Size: 671 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 654 KiB

After

Width:  |  Height:  |  Size: 598 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 794 KiB

After

Width:  |  Height:  |  Size: 670 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.9 KiB

After

Width:  |  Height:  |  Size: 4.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 213 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 594 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 131 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 88 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 921 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 844 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 782 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 925 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 807 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 689 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 463 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 665 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 771 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 693 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 753 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 730 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 502 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 544 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 534 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 701 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

@ -0,0 +1,8 @@
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
<g id="tianjia">
<rect id="Rectangle 1949" x="0.5" y="0.5" width="19" height="19" rx="3.5" fill="white" stroke="#D9D9D9"/>
<g id="&#230;&#183;&#187;&#229;&#138;&#160; 1">
<path id="Vector" d="M13.9926 9.39973H10.5945V6.00168C10.5945 5.84262 10.5313 5.69008 10.4189 5.57761C10.3064 5.46514 10.1539 5.40195 9.99481 5.40195C9.83576 5.40195 9.68321 5.46514 9.57074 5.57761C9.45828 5.69008 9.39509 5.84262 9.39509 6.00168V9.39973H5.99704C5.83798 9.39973 5.68544 9.46291 5.57297 9.57538C5.4605 9.68785 5.39731 9.84039 5.39731 9.99945C5.39731 10.1585 5.4605 10.311 5.57297 10.4235C5.68544 10.536 5.83798 10.5992 5.99704 10.5992H9.39509V13.9972C9.39509 14.1563 9.45828 14.3088 9.57074 14.4213C9.68321 14.5338 9.83576 14.5969 9.99481 14.5969C10.1539 14.5969 10.3064 14.5338 10.4189 14.4213C10.5313 14.3088 10.5945 14.1563 10.5945 13.9972V10.5992H13.9926C14.1516 10.5992 14.3042 10.536 14.4167 10.4235C14.5291 10.311 14.5923 10.1585 14.5923 9.99945C14.5923 9.84039 14.5291 9.68785 14.4167 9.57538C14.3042 9.46291 14.1516 9.39973 13.9926 9.39973Z" fill="#D9D9D9" stroke="#D9D9D9" stroke-width="0.2"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

@ -0,0 +1,11 @@
<svg width="18" height="18" viewBox="0 0 18 18" fill="none" xmlns="http://www.w3.org/2000/svg">
<g id="zhengque" clip-path="url(#clip0_351_1042)">
<path id="Vector" d="M9 16.5C11.071 16.5 12.946 15.6605 14.3033 14.3033C15.6605 12.946 16.5 11.071 16.5 9C16.5 6.92895 15.6605 5.05395 14.3033 3.6967C12.946 2.33947 11.071 1.5 9 1.5C6.92895 1.5 5.05395 2.33947 3.6967 3.6967C2.33947 5.05395 1.5 6.92895 1.5 9C1.5 11.071 2.33947 12.946 3.6967 14.3033C5.05395 15.6605 6.92895 16.5 9 16.5Z" fill="#0DB274" stroke="#0DB274" stroke-width="1.5" stroke-linejoin="round"/>
<path id="Vector_2" d="M6 9L8.25 11.25L12.75 6.75" stroke="white" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
</g>
<defs>
<clipPath id="clip0_351_1042">
<rect width="18" height="18" fill="white"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 809 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="guanbi" clip-path="url(#clip0_311_6682)">
<path id="Vector" d="M8.5 7L13.7 1.8C14.1 1.4 14.1 0.7 13.7 0.3C13.3 -0.1 12.6 -0.1 12.2 0.3L7 5.5L1.8 0.3C1.4 -0.1 0.7 -0.1 0.3 0.3C-0.1 0.7 -0.1 1.4 0.3 1.8L5.5 7L0.3 12.2C-0.1 12.6 -0.1 13.3 0.3 13.7C0.7 14.1 1.4 14.1 1.8 13.7L7 8.5L12.2 13.7C12.6 14.1 13.3 14.1 13.7 13.7C14.1 13.3 14.1 12.6 13.7 12.2L8.5 7Z" fill="#999999"/>
</g>
<defs>
<clipPath id="clip0_311_6682">
<rect width="14" height="14" fill="white"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 590 B

@ -0,0 +1,11 @@
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<g id="shanchu" clip-path="url(#clip0_351_973)">
<path id="Vector" d="M13.9465 4.01804H10.6743V3.23136C10.6743 2.27681 9.92672 1.5 9.0081 1.5H6.78521C5.86659 1.5 5.11903 2.27681 5.11903 3.23136V4.01804H2.05434C1.74787 4.01804 1.5 4.2756 1.5 4.59406C1.5 4.91252 1.74787 5.17008 2.05434 5.17008H2.96187V12.149C2.96187 13.4459 3.9771 14.5 5.22435 14.5H10.58C11.8281 14.5 12.8425 13.4451 12.8425 12.149V5.17008H13.9457C14.2521 5.17008 14.5 4.91252 14.5 4.59406C14.5 4.2756 14.2529 4.01804 13.9465 4.01804ZM6.2277 3.23136C6.2277 2.91208 6.47795 2.65204 6.78521 2.65204H9.00889C9.31615 2.65204 9.5664 2.91208 9.5664 3.23136V4.01804H6.2277V3.23136ZM11.7346 12.1482C11.7346 12.8098 11.2167 13.3471 10.5808 13.3471H5.22515C4.58845 13.3471 4.07133 12.809 4.07133 12.1482V5.17008H11.7354V12.1482H11.7346Z" fill="#FF3B39"/>
<path id="Vector_2" d="M6.55096 7C6.24636 7 6 7.27543 6 7.61598V11.384C6 11.7246 6.24636 12 6.55096 12C6.85557 12 7.10193 11.7246 7.10193 11.384V7.61598C7.10193 7.27543 6.85557 7 6.55096 7ZM9.44904 7C9.14443 7 8.89807 7.27543 8.89807 7.61598V11.384C8.89807 11.7246 9.14443 12 9.44904 12C9.75364 12 10 11.7246 10 11.384V7.61598C10 7.27543 9.75285 7 9.44904 7Z" fill="#FF3B39"/>
</g>
<defs>
<clipPath id="clip0_351_973">
<rect width="16" height="16" fill="white"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 1.4 KiB

@ -0,0 +1,5 @@
<svg width="11" height="6" viewBox="0 0 11 6" fill="none" xmlns="http://www.w3.org/2000/svg">
<g id="xiala">
<path id="xiala_2" d="M0.142313 0.827435L5.14686 5.85395C5.34073 6.04868 5.65927 6.04868 5.85315 5.85395L10.8577 0.827435C11.1644 0.51942 10.9427 0 10.5045 0H0.495464C0.0573317 0 -0.164358 0.51942 0.142313 0.827435Z" fill="#2B3F54"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 355 B

@ -0,0 +1,12 @@
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<g id="bianji">
<g id="xiugai" clip-path="url(#clip0_351_961)">
<path id="Vector" d="M0.924731 15.067L0.924392 15.0665L0.924395 15.0665C0.867743 14.9761 0.837695 14.8716 0.837695 14.7649C0.837695 14.6582 0.867743 14.5537 0.924395 14.4633L0.924468 14.4632C0.983266 14.37 1.06488 14.2933 1.16159 14.2404C1.25826 14.1876 1.36682 14.1602 1.47699 14.161H1.47676V14.211L1.47713 14.161L0.924731 15.067ZM0.924731 15.067C0.984177 15.1592 1.06605 15.2349 1.16269 15.2869C1.25925 15.3389 1.3674 15.3655 1.47705 15.3643M0.924731 15.067L1.47676 15.3143M14.7131 15.3643C14.8228 15.3655 14.9309 15.3389 15.0275 15.2869C15.1241 15.2349 15.206 15.1592 15.2655 15.067L15.2234 15.0399L15.2656 15.0667C15.3234 14.9757 15.354 14.8702 15.3537 14.7624C15.3535 14.6547 15.3225 14.5492 15.2644 14.4585L15.2644 14.4584C15.205 14.3661 15.1231 14.2903 15.0265 14.2383C14.9299 14.1863 14.8217 14.1597 14.712 14.161L1.47676 15.3143M14.7131 15.3643C14.7131 15.3643 14.713 15.3643 14.7129 15.3643L14.7134 15.3143V15.3643H14.7131ZM14.7131 15.3643H1.47705M1.47705 15.3643C1.47713 15.3643 1.47722 15.3643 1.47731 15.3643L1.47676 15.3143M1.47705 15.3643H1.47676V15.3143M8.50934 10.7868L8.50938 10.7869L8.51099 10.7853L13.791 5.50859L13.7911 5.50853C14.1093 5.18944 14.2879 4.7572 14.2879 4.30656C14.2879 3.85593 14.1093 3.42368 13.7911 3.10459L13.791 3.10453L12.0054 1.32008L12.0055 1.32007L12.0045 1.31917C11.6792 1.01065 11.2479 0.838672 10.7995 0.838672C10.3512 0.838672 9.91991 1.01065 9.59458 1.31917L9.59457 1.31916L9.59365 1.32008L4.31365 6.59452L4.31361 6.59448L4.31205 6.59619C3.74161 7.22119 3.37721 8.00653 3.26829 8.84568L3.26824 8.84567L3.26805 8.84795L3.14805 10.2813L3.14804 10.2813L3.14723 10.2911C3.09185 10.9595 3.0636 11.3004 3.07321 11.4964C3.0781 11.5962 3.09291 11.6641 3.12226 11.7205C3.15053 11.7749 3.19063 11.8148 3.23531 11.8592L3.23818 11.862L3.23829 11.8621C3.35271 11.9751 3.507 12.0386 3.66781 12.0388H3.66787C3.73193 12.0388 4.02332 12.015 4.53964 11.9728C4.62727 11.9656 4.72137 11.9579 4.82193 11.9497L4.82204 11.9497L6.25759 11.8297L6.2576 11.8298L6.25984 11.8295C7.09888 11.7209 7.88423 11.3569 8.50934 10.7868ZM4.7226 10.749L4.31692 10.782L4.34992 10.3763L4.34993 10.3762L4.4709 8.94555C4.55122 8.38617 4.79384 7.86263 5.16872 7.43976L10.4451 2.16782C10.4451 2.16777 10.4452 2.16771 10.4453 2.16766C10.5397 2.07513 10.6667 2.02331 10.799 2.02331C10.9312 2.02331 11.0582 2.07514 11.1527 2.16768C11.1528 2.16773 11.1528 2.16778 11.1529 2.16782L12.8669 3.87975L12.9378 3.95166C13.0307 4.0459 13.083 4.17281 13.0833 4.30514C13.0837 4.43736 13.0323 4.56447 12.9401 4.65921C12.94 4.65929 12.9399 4.65936 12.9398 4.65944L7.66248 9.93124C7.23936 10.3057 6.71593 10.5483 6.15667 10.6291L4.72271 10.7489L4.7226 10.749Z" fill="#4287FF" stroke="#4287FF" stroke-width="0.1"/>
</g>
</g>
<defs>
<clipPath id="clip0_351_961">
<rect width="16" height="16" fill="white"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 2.9 KiB

@ -0,0 +1,110 @@
<script setup lang="ts">
import { useNav } from "@/layout/hooks/useNav";
import IconParkOutline from "@iconify-icons/icon-park-outline/logout";
import { computed, onMounted, ref } from "vue";
import downImg from "@/assets/newInquiry/down.png";
const { logout, userAvatar, avatarsStyle } = useNav();
import { getUserInfo } from "@/utils/auth";
import { useConsultationStoreHooks } from "@/store/modules/consultation";
import router from "@/router";
import { useRoute } from "vue-router";
const route = useRoute();
const userName = ref("");
const inspectSatus = computed(() => {
return useConsultationStoreHooks().inspectSatus;
});
onMounted(() => {
const userInfo: any = getUserInfo();
userName.value = JSON.parse(userInfo).name;
});
const changeCase = () => {
router.push({
path: "/selectCase"
});
};
</script>
<template>
<div class="NavBar">
<div class="btn" @click="changeCase" v-if="inspectSatus === '2'">
更换病历
</div>
<!-- 退出登录 -->
<el-dropdown trigger="click" class="mr-6">
<span class="el-dropdown-link navbar-bg-hover select-none">
<img class="head" :src="userAvatar" :style="avatarsStyle" />
<p>{{ userName }}</p>
<img :src="downImg" alt="" />
</span>
<template #dropdown>
<el-dropdown-menu class="logout">
<el-dropdown-item
v-if="route.name !== 'SelectCase'"
@click="changeCase"
>
<IconifyIconOffline :icon="IconParkOutline" style="margin: 5px" />
返回问诊大厅
</el-dropdown-item>
<el-dropdown-item @click="logout">
<IconifyIconOffline :icon="IconParkOutline" style="margin: 5px" />
退出系统
</el-dropdown-item>
</el-dropdown-menu>
</template>
</el-dropdown>
</div>
</template>
<style lang="scss" scoped>
.NavBar {
display: flex;
align-items: center;
justify-content: flex-end;
min-width: 280px;
height: 48px;
margin-top: 22px;
color: #000000d9;
.btn {
width: 80px;
height: 32px;
font-size: 14px;
// font-family: Inter, Inter;
font-weight: 400;
line-height: 32px;
color: #fff;
text-align: center;
cursor: pointer;
background: #4287ff;
border-radius: 6px;
}
.el-dropdown-link {
display: flex;
align-items: center;
justify-content: space-around;
height: 48px;
padding: 10px;
color: #000000d9;
cursor: pointer;
p {
margin-left: 8px;
font-size: 14px;
font-weight: 400;
color: #2b3f54;
}
.head {
width: 36px;
height: 36px;
border-radius: 50%;
}
img {
width: 11px;
height: 6px;
margin-left: 8px;
}
}
}
</style>

@ -0,0 +1,129 @@
<template>
<div>
<div style="margin-top: 10px; border: 1px solid #ccc">
<Toolbar
:editor="editorRef"
:defaultConfig="toolbarConfig"
:mode="mode"
style="border-bottom: 1px solid #ccc"
/>
<Editor
:defaultConfig="editorConfig"
:mode="mode"
v-model="valueHtml"
style="height: 400px; overflow-y: auto"
@onCreated="handleCreated"
@onChange="handleChange"
@onDestroyed="handleDestroyed"
@onFocus="handleFocus"
@onBlur="handleBlur"
@customAlert="customAlert"
@customPaste="customPaste"
/>
</div>
</div>
</template>
<script>
import "@wangeditor/editor/dist/css/style.css";
import { onBeforeUnmount, ref, shallowRef, onMounted, nextTick } from "vue";
import { Editor, Toolbar } from "@wangeditor/editor-for-vue";
export default {
components: { Editor, Toolbar },
setup() {
// shallowRef
const editorRef = shallowRef();
// HTML
const valueHtml = ref("");
// ajax
onMounted(() => {
nextTick(() => {
const editor = editorRef.value;
console.log("12121", editor);
});
});
const toolbarConfig = {
excludeKeys: ["headerSelect", "italic", "group-more-style"]
};
const editorConfig = { placeholder: "请输入内容..." };
//
onBeforeUnmount(() => {
const editor = editorRef.value;
if (editor == null) return;
editor.destroy();
});
//
const handleCreated = editor => {
console.log("created", editor);
editorRef.value = editor; // editor
};
const handleChange = editor => {
console.log("change:", editor.getHtml());
};
const handleDestroyed = editor => {
console.log("destroyed", editor);
};
const handleFocus = editor => {
console.log("focus", editor);
};
const handleBlur = editor => {
console.log("blur", editor);
};
const customAlert = (info, type) => {
alert(`【自定义提示】${type} - ${info}`);
};
const customPaste = (editor, event, callback) => {
console.log("ClipboardEvent 粘贴事件对象", event);
//
// editor.insertText("xxx");
// vue return
// callback(false); // false
callback(true); // true
};
const insertText = val => {
const editor = editorRef.value;
if (editor == null) return;
editor.insertText(val);
};
const printHtml = () => {
const editor = editorRef.value;
if (editor == null) return;
console.log(editor.getHtml());
};
const disable = () => {
const editor = editorRef.value;
if (editor == null) return;
editor.disable();
};
return {
editorRef,
mode: "default",
valueHtml,
toolbarConfig,
editorConfig,
handleCreated,
handleChange,
handleDestroyed,
handleFocus,
handleBlur,
customAlert,
customPaste,
insertText,
printHtml,
disable
};
}
};
</script>

@ -134,6 +134,7 @@ const transitionMain = defineComponent({
width: 100%; width: 100%;
height: 100vh; height: 100vh;
overflow-x: hidden; overflow-x: hidden;
background: #fff;
} }
.app-main-nofixed-header { .app-main-nofixed-header {

@ -1,35 +1,35 @@
<script setup lang="ts"> <script setup lang="ts">
import { isEqual } from "@pureadmin/utils"; // import { isEqual } from "@pureadmin/utils";
import { ref, watch, onMounted, toRaw } from "vue"; import { ref, watch, onMounted } from "vue";
import { getParentPaths, findRouteByPath } from "@/router/utils"; import { getParentPaths, findRouteByPath } from "@/router/utils";
import { useMultiTagsStoreHook } from "@/store/modules/multiTags"; // import { useMultiTagsStoreHook } from "@/store/modules/multiTags";
import { useRoute, useRouter, RouteLocationMatched } from "vue-router"; import { useRoute, useRouter, RouteLocationMatched } from "vue-router";
const route = useRoute(); const route = useRoute();
const levelList = ref([]); const levelList = ref([]);
const router = useRouter(); const router = useRouter();
const routes: any = router.options.routes; const routes: any = router.options.routes;
const multiTags: any = useMultiTagsStoreHook().multiTags; // const multiTags: any = useMultiTagsStoreHook().multiTags;
const getBreadcrumb = (): void => { const getBreadcrumb = (): void => {
// //
let currentRoute; let currentRoute;
if (Object.keys(route.query).length > 0) { // if (Object.keys(route.query).length > 0) {
multiTags.forEach(item => { // multiTags.forEach(item => {
if (isEqual(route.query, item?.query)) { // if (isEqual(route.query, item?.query)) {
currentRoute = toRaw(item); // currentRoute = toRaw(item);
} // }
}); // });
} else if (Object.keys(route.params).length > 0) { // } else if (Object.keys(route.params).length > 0) {
multiTags.forEach(item => { // multiTags.forEach(item => {
if (isEqual(route.params, item?.params)) { // if (isEqual(route.params, item?.params)) {
currentRoute = toRaw(item); // currentRoute = toRaw(item);
} // }
}); // });
} else { // } else {
currentRoute = findRouteByPath(router.currentRoute.value.path, routes); // }
} // currentRoute = findRouteByPath(router.currentRoute.value.path, routes);
// //
const parentRoutes = getParentPaths( const parentRoutes = getParentPaths(
@ -46,7 +46,6 @@ const getBreadcrumb = (): void => {
}); });
matched.push(currentRoute); matched.push(currentRoute);
matched.forEach((item, index) => { matched.forEach((item, index) => {
if (currentRoute?.query || currentRoute?.params) return; if (currentRoute?.query || currentRoute?.params) return;
if (item?.children) { if (item?.children) {

@ -23,9 +23,7 @@ const { device, pureApp, isCollapse, menuSelect, toggleSideBar } = useNav();
const subMenuData = ref([]); const subMenuData = ref([]);
const menuData = computed(() => { const menuData = computed(() => {
return pureApp.layout === "mix" && device.value !== "mobile" return usePermissionStoreHook().wholeMenus;
? subMenuData.value
: usePermissionStoreHook().wholeMenus;
}); });
const loading = computed(() => const loading = computed(() =>
@ -83,10 +81,7 @@ onBeforeUnmount(() => {
:class="['sidebar-container', showLogo ? 'has-logo' : '']" :class="['sidebar-container', showLogo ? 'has-logo' : '']"
> >
<Logo v-if="showLogo" :collapse="isCollapse" /> <Logo v-if="showLogo" :collapse="isCollapse" />
<el-scrollbar <el-scrollbar wrap-class="scrollbar-wrapper" class="pc">
wrap-class="scrollbar-wrapper"
:class="[device === 'mobile' ? 'mobile' : 'pc']"
>
<el-menu <el-menu
router router
unique-opened unique-opened

@ -1,7 +1,7 @@
// import "@/utils/sso"; // import "@/utils/sso";
import { getConfig } from "@/config"; import { getConfig } from "@/config";
import NProgress from "@/utils/progress"; import NProgress from "@/utils/progress";
import { sessionKey, type DataInfo } from "@/utils/auth"; // import { getToken } from "@/utils/auth";
import { useMultiTagsStoreHook } from "@/store/modules/multiTags"; import { useMultiTagsStoreHook } from "@/store/modules/multiTags";
import { usePermissionStoreHook } from "@/store/modules/permission"; import { usePermissionStoreHook } from "@/store/modules/permission";
import { import {
@ -36,7 +36,6 @@ const modules: Record<string, any> = import.meta.glob(
eager: true eager: true
} }
); );
/** 原始静态路由(未做任何处理) */ /** 原始静态路由(未做任何处理) */
const routes = []; const routes = [];
@ -58,7 +57,6 @@ export const constantMenus: Array<RouteComponent> = ascending(
export const remainingPaths = Object.keys(remainingRouter).map(v => { export const remainingPaths = Object.keys(remainingRouter).map(v => {
return remainingRouter[v].path; return remainingRouter[v].path;
}); });
/** 创建路由实例 */ /** 创建路由实例 */
export const router: Router = createRouter({ export const router: Router = createRouter({
history: getHistoryMode(import.meta.env.VITE_ROUTER_HISTORY), history: getHistoryMode(import.meta.env.VITE_ROUTER_HISTORY),
@ -101,97 +99,99 @@ const whiteList = ["/login"];
const { VITE_HIDE_HOME } = import.meta.env; const { VITE_HIDE_HOME } = import.meta.env;
router.beforeEach((to: ToRouteType, _from, next) => { router.beforeEach((to: ToRouteType, _from, next) => {
// if (to.meta?.keepAlive) { if (to.meta?.keepAlive) {
// handleAliveRoute(to, "add"); handleAliveRoute(to, "add");
// // 页面整体刷新和点击标签页刷新 // 页面整体刷新和点击标签页刷新
// if (_from.name === undefined || _from.name === "Redirect") { if (_from.name === undefined || _from.name === "Redirect") {
// handleAliveRoute(to); handleAliveRoute(to);
// } }
// } }
// const userInfo = storageSession().getItem<DataInfo<number>>(sessionKey); const userInfoStr = storageSession().getItem("userInfo");
// NProgress.start();
// const externalLink = isUrl(to?.name as string); const userInfo = JSON.parse(userInfoStr);
// if (!externalLink) { // const token = getToken();
// to.matched.some(item => { NProgress.start();
// if (!item.meta.title) return ""; const externalLink = isUrl(to?.name as string);
// const Title = getConfig().Title; if (!externalLink) {
// if (Title) document.title = `${item.meta.title} | ${Title}`; to.matched.some(item => {
// else document.title = item.meta.title as string; if (!item.meta.title) return "";
// }); const Title = getConfig().Title;
// } if (Title) document.title = `${item.meta.title} | ${Title}`;
// /** 如果已经登录并存在登录信息后不能跳转到路由白名单,而是继续保持在当前页面 */ else document.title = item.meta.title as string;
// function toCorrectRoute() { });
// whiteList.includes(to.fullPath) ? next(_from.fullPath) : next(); }
// } /** 如果已经登录并存在登录信息后不能跳转到路由白名单,而是继续保持在当前页面 */
// if (userInfo) { function toCorrectRoute() {
// // 无权限跳转403页面 whiteList.includes(to.fullPath) ? next(_from.fullPath) : next();
// if (to.meta?.roles && !isOneOfArray(to.meta?.roles, userInfo?.roles)) { }
// next({ path: "/error/403" }); if (userInfo?.roleCode === "1") {
// } // 无权限跳转403页面
// // 开启隐藏首页后在浏览器地址栏手动输入首页welcome路由则跳转到404页面 if (to.meta?.roles && !isOneOfArray(to.meta?.roles, userInfo?.roles)) {
// if (VITE_HIDE_HOME === "true" && to.fullPath === "/welcome") { next({ path: "/error/403" });
// next({ path: "/error/404" }); }
// } // 开启隐藏首页后在浏览器地址栏手动输入首页welcome路由则跳转到404页面
// if (_from?.name) { if (VITE_HIDE_HOME === "true" && to.fullPath === "/welcome") {
// // name为超链接 next({ path: "/error/404" });
// if (externalLink) { }
// openLink(to?.name as string); if (_from?.name) {
// NProgress.done(); // name为超链接
// } else { if (externalLink) {
// toCorrectRoute(); openLink(to?.name as string);
// } NProgress.done();
// } else { } else {
// // 刷新 toCorrectRoute();
// if ( }
// usePermissionStoreHook().wholeMenus.length === 0 && } else {
// to.path !== "/login" // 刷新
// ) { if (
// initRouter().then((router: Router) => { usePermissionStoreHook().wholeMenus.length === 0 &&
// if (!useMultiTagsStoreHook().getMultiTagsCache) { to.path !== "/login"
// const { path } = to; ) {
// const route = findRouteByPath( initRouter().then((router: Router) => {
// path, if (!useMultiTagsStoreHook().getMultiTagsCache) {
// router.options.routes[0].children const { path } = to;
// ); const route = findRouteByPath(
// getTopMenu(true); path,
// // query、params模式路由传参数的标签页不在此处处理 router.options.routes[0].children
// if (route && route.meta?.title) { );
// if (isAllEmpty(route.parentId) && route.meta?.backstage) { getTopMenu(true);
// // 此处为动态顶级路由(目录) // query、params模式路由传参数的标签页不在此处处理
// const { path, name, meta } = route.children[0]; if (route && route.meta?.title) {
// useMultiTagsStoreHook().handleTags("push", { if (isAllEmpty(route.parentId) && route.meta?.backstage) {
// path, // 此处为动态顶级路由(目录)
// name, const { path, name, meta } = route.children[0];
// meta useMultiTagsStoreHook().handleTags("push", {
// }); path,
// } else { name,
// const { path, name, meta } = route; meta
// useMultiTagsStoreHook().handleTags("push", { });
// path, } else {
// name, const { path, name, meta } = route;
// meta useMultiTagsStoreHook().handleTags("push", {
// }); path,
// } name,
// } meta
// } });
// // 确保动态路由完全加入路由列表并且不影响静态路由注意动态路由刷新时router.beforeEach可能会触发两次第一次触发动态路由还未完全添加第二次动态路由才完全添加到路由列表如果需要在router.beforeEach做一些判断可以在to.name存在的条件下去判断这样就只会触发一次 }
// if (isAllEmpty(to.name)) router.push(to.fullPath); }
// }); }
// } // 确保动态路由完全加入路由列表并且不影响静态路由注意动态路由刷新时router.beforeEach可能会触发两次第一次触发动态路由还未完全添加第二次动态路由才完全添加到路由列表如果需要在router.beforeEach做一些判断可以在to.name存在的条件下去判断这样就只会触发一次
// toCorrectRoute(); if (isAllEmpty(to.name)) router.push(to.fullPath);
// } });
// } else { }
// if (to.path !== "/login") { toCorrectRoute();
// if (whiteList.indexOf(to.path) !== -1) { }
// next(); } else {
// } else { if (to.path !== "/login") {
// next({ path: "/login" }); if (whiteList.indexOf(to.path) !== -1) {
// } next();
// } else { } else {
// next(); next({ path: "/login" });
// } }
// } } else {
next(); next();
}
}
}); });
router.afterEach(() => { router.afterEach(() => {

@ -0,0 +1,121 @@
export default {
path: "/caseManagement",
redirect: "/caseManagement/diseaseType",
meta: {
title: "病例管理",
icon: "projectIcon",
rank: 11
},
children: [
{
path: "/caseManagement/diseaseType",
name: "DiseaseType",
component: () => import("@/views/caseManagement/diseaseType/index.vue"),
meta: {
title: "疾病分类",
showLink: true,
showParent: true,
roles: ["admin", "common"]
},
children: [
{
path: "/caseManagement/diseaseType/inquiry",
name: "diseaseTypeInquiry",
component: () =>
import("@/views/caseManagement/diseaseType/inquiry/index.vue"),
meta: {
title: "问诊",
showLink: false,
activePath: "/caseManagement/diseaseType",
roles: ["admin", "common"]
}
},
{
path: "/caseManagement/diseaseType/bodyInspect",
name: "diseaseTypeBodyInspect",
component: () =>
import("@/views/caseManagement/diseaseType/bodyInspect/index.vue"),
meta: {
title: "体格检查",
showLink: false,
activePath: "/caseManagement/diseaseType",
roles: ["admin", "common"]
}
},
{
path: "/caseManagement/diseaseType/supportInspect",
name: "diseaseTypeSupportInspect",
component: () =>
import(
"@/views/caseManagement/diseaseType/supportInspect/index.vue"
),
meta: {
title: "辅助检查",
showLink: false,
activePath: "/caseManagement/diseaseType",
roles: ["admin", "common"]
}
},
{
path: "/caseManagement/diseaseType/disposalPlan",
name: "diseaseTypeDisposalPlan",
component: () =>
import("@/views/caseManagement/diseaseType/disposalPlan/index.vue"),
meta: {
title: "处置计划",
showLink: false,
activePath: "/caseManagement/diseaseType",
roles: ["admin", "common"]
}
}
]
},
{
path: "/caseManagement/list",
name: "CaseManagement",
component: () => import("@/views/caseManagement/list/index.vue"),
meta: {
title: "病历管理",
showLink: true,
showParent: true,
roles: ["admin", "common"]
},
children: [
{
path: "/caseManagement/add",
name: "caseManagementAdd",
component: () => import("@/views/caseManagement/list/add.vue"),
meta: {
title: "新建病历",
showLink: false,
activePath: "/caseManagement/list",
roles: ["admin", "common"]
}
},
{
path: "/caseManagement/edit",
name: "caseManagementEdit",
component: () => import("@/views/caseManagement/list/edit.vue"),
meta: {
title: "编辑病历",
showLink: false,
activePath: "/caseManagement/list",
roles: ["admin", "common"]
}
},
{
path: "/caseManagement/detail",
name: "caseManagementDetail",
component: () =>
import("@/views/caseManagement/list/details/index.vue"),
meta: {
title: "病历详情",
showLink: false,
activePath: "/caseManagement/list",
roles: ["admin", "common"]
}
}
]
}
]
} as RouteConfigsTable;

@ -0,0 +1,26 @@
const { VITE_HIDE_HOME } = import.meta.env;
const Layout = () => import("@/layout/index.vue");
import HomeFill from "@/assets/svg/home.svg?component";
export default {
path: "/",
name: "Home",
component: Layout,
redirect: "/welcome",
meta: {
icon: HomeFill,
title: "首页",
showLink: false
// rank: 0
},
children: [
{
path: "/welcome",
name: "Welcome",
component: () => import("@/views/welcome/index.vue"),
meta: {
title: "首页",
showLink: VITE_HIDE_HOME === "true" ? false : true
}
}
]
} as RouteConfigsTable;

@ -0,0 +1,58 @@
export default {
path: "/inquiryManagement",
redirect: "/inquiryManagement/list",
meta: {
title: "问诊管理",
icon: "projectIcon",
rank: 11
},
children: [
{
path: "/inquiryManagement/bodyInspect",
name: "BodyInspect",
component: () =>
import("@/views/inquiryManagement/bodyInspect/list/index.vue"),
meta: {
title: "体格检查",
showLink: true,
showParent: true,
roles: ["admin", "common"]
}
// children: [
// {
// path: "/project/details",
// name: "ProjectDetails",
// component: () => import("@/views/project/details/index.vue"),
// meta: {
// title: "项目详情",
// // showLink: false,
// showParent: true,
// roles: ["admin", "common"]
// }
// }
// ]
}
// {
// path: "/inquiryManagement/supportInspect",
// name: "SupportInspect",
// component: () =>
// import("@/views/inquiryManagement/supportInspect/list/index.vue"),
// meta: {
// title: "辅助检查",
// showLink: false,
// roles: ["admin", "common"]
// }
// },
// {
// path: "/inquiryManagement/disposalPlan",
// name: "DisposalPlan",
// component: () =>
// import("@/views/inquiryManagement/disposalPlan/list/index.vue"),
// meta: {
// title: "处置计划",
// showLink: false,
// roles: ["admin", "common"]
// }
// }
]
} as RouteConfigsTable;

@ -27,6 +27,26 @@ export default [
} }
] ]
}, },
{
path: "/selectCase",
name: "SelectCase",
component: () => import("@/views/selectCase/index.vue"),
meta: {
title: "选择实例",
showLink: false,
rank: 101
}
},
{
path: "/consultation",
name: "Consultation",
component: () => import("@/views/consultation/index.vue"),
meta: {
title: "问诊大厅",
showLink: false,
rank: 103
}
},
{ {
path: "/inquiry", path: "/inquiry",
name: "Inquiry", name: "Inquiry",

@ -0,0 +1,33 @@
export default {
path: "/systemManagement",
redirect: "/systemManagement/accountManagement",
meta: {
title: "系统管理",
icon: "projectIcon",
rank: 12
},
children: [
{
path: "/systemManagement/accountManagement",
name: "systemManagement",
component: () =>
import("@/views/systemManagement/accountManagement/index.vue"),
meta: {
title: "账号管理",
showLink: true,
showParent: true,
roles: ["admin", "common"]
}
},
{
path: "/systemManagement/loginStatus",
name: "LoginStatus",
component: () => import("@/views/systemManagement/loginStatus/index.vue"),
meta: {
title: "登录状态",
showLink: true,
roles: ["admin", "common"]
}
}
]
} as RouteConfigsTable;

@ -158,7 +158,7 @@ function handleAsyncRoutes(routeList) {
(v: RouteRecordRaw) => { (v: RouteRecordRaw) => {
// 防止重复添加路由 // 防止重复添加路由
if ( if (
router.options.routes[0].children.findIndex( router.options.routes[0].children?.findIndex(
value => value.path === v.path value => value.path === v.path
) !== -1 ) !== -1
) { ) {

@ -0,0 +1,47 @@
import { defineStore } from "pinia";
import { store } from "@/store";
export const useCaseStore = defineStore({
id: "case",
state: () => ({
activedStep: 0, // 当前步骤
basicInfo: {
name: "",
gender: "",
age: "",
diseaseName: "",
diseaseId: "",
patientSelfDesc: "",
address: ""
},
diagnosticBasisInfo: {
primarilyDiagnosisCriteria: "",
confirmDiagnosisCriteria: "",
differentialDiagnosisCriteria: "",
fullCheck: ""
},
qaList: [],
patientId: "",
isEditFlag: false
}),
actions: {
changeActivedStep(data) {
this.activedStep = data;
},
changeBasicInfo(data) {
this.basicInfo = data;
},
changeDiagnosticBasisInfo(data) {
this.diagnosticBasisInfo = data;
},
changeQaList(data) {
this.qaList = data;
},
changeIsEditFlag(data) {
this.isEditFlag = data;
}
}
});
export function useCaseStoreHooks() {
return useCaseStore(store);
}

@ -0,0 +1,152 @@
import { defineStore } from "pinia";
import { store } from "@/store";
import {
queryAskPrimaryList,
queryAskPhysicalHistory,
queryAskAncillaryHistory
} from "@/api/inquiry";
import { clearObject } from "@/utils/auth";
export const useConsultationStore = defineStore({
id: "consultation",
state: () => ({
activedKey: 0, // 选中的tab
activedTabKey: 0,
inspectSatus: "", //诊断状态
processId: "", //流程id
// 选中的工具
selectToolInfo: {
toolName: "",
img: "",
id: "",
requireLocation: 0
},
bodyPositionType: "", // 身体部位类别
// 体格检查结果
bodyResultInfo: {
name: "",
label: "",
value: "",
postion: ""
},
primaryIdList: [], //初步诊断id
selectSupportId: "", // 选中的辅助检查id
firstInspectList: [], // 初步检查列表
bodyInspectList: [], // 体格检查列表
suppertInspectList: [], // 辅助检查列表
uuid: "",
exhalationFlag: false, //呼出服务
voiceFlag: true,
planTypeFlag: "", // 处置计划类型
supportActionId: [] // 呼出辅助检查
}),
actions: {
changeActivedKey(data) {
this.activedKey = data;
if (data !== 1) {
clearObject(this.selectToolInfo);
clearObject(this.bodyResultInfo);
}
if (data === 0) {
this.exhalationFlag = false;
this.voiceFlag = true;
} else {
this.voiceFlag = false;
}
},
changeActivedTabKey(data) {
this.activedTabKey = data;
if (data !== 1) {
clearObject(this.selectToolInfo);
clearObject(this.bodyResultInfo);
}
if (data === 0) {
this.exhalationFlag = false;
this.voiceFlag = true;
} else {
this.voiceFlag = false;
}
},
changeSelectToolInfo(data) {
this.selectToolInfo = data;
},
changeBodyPositionType(data) {
this.bodyPositionType = data;
},
changeBodyResultInfo(data) {
this.bodyResultInfo = data;
},
changeProcessId(data) {
this.processId = data;
},
changeSelectSupportId(data) {
this.selectSupportId = data;
},
changeUUID(data) {
this.uuid = data;
},
changeExhalationFlag(data) {
this.exhalationFlag = data;
},
changeInspectSatus(data) {
this.inspectSatus = data;
},
changePrimaryIdList(data) {
this.primaryIdList = data;
},
/** 获取初步诊断列表 */
async getAskPrimaryList(id) {
return new Promise((resolve, reject) => {
queryAskPrimaryList({
processId: id
})
.then((res: any) => {
if (res.code === 200) {
this.firstInspectList = res.data;
resolve(res);
}
})
.catch(error => {
reject(error);
});
});
},
/** 获取体格检查列表 */
async getyAskPhysicalHistory(id) {
return new Promise((resolve, reject) => {
queryAskPhysicalHistory({
processId: id
})
.then((res: any) => {
if (res.code === 200) {
this.bodyInspectList = res.data;
resolve(res);
}
})
.catch(error => {
reject(error);
});
});
},
/** 获取辅助检查列表 */
async getAskAncillaryHistory() {
return new Promise((resolve, reject) => {
queryAskAncillaryHistory({
processId: this.processId
})
.then((res: any) => {
if (res.code === 200) {
this.suppertInspectList = res.data;
resolve(res);
}
})
.catch(error => {
reject(error);
});
});
}
}
});
export function useConsultationStoreHooks() {
return useConsultationStore(store);
}

@ -0,0 +1,20 @@
import { defineStore } from "pinia";
import { store } from "@/store";
export const useDiseaseStore = defineStore({
id: "disease",
state: () => ({
diseaseInfo: {
id: "",
diseaseName: ""
}
}),
actions: {
changeDiseaseInfo(data) {
this.diseaseInfo = data;
}
}
});
export function useDiseaseStoreHooks() {
return useDiseaseStore(store);
}

@ -4,7 +4,7 @@ import { cacheType } from "./types";
import { constantMenus } from "@/router"; import { constantMenus } from "@/router";
import { useMultiTagsStoreHook } from "./multiTags"; import { useMultiTagsStoreHook } from "./multiTags";
import { debounce, getKeyList } from "@pureadmin/utils"; import { debounce, getKeyList } from "@pureadmin/utils";
import { ascending, filterTree, filterNoPermissionTree } from "@/router/utils"; import { ascending, filterTree } from "@/router/utils";
export const usePermissionStore = defineStore({ export const usePermissionStore = defineStore({
id: "pure-permission", id: "pure-permission",
@ -18,10 +18,11 @@ export const usePermissionStore = defineStore({
}), }),
actions: { actions: {
/** 组装整体路由生成的菜单 */ /** 组装整体路由生成的菜单 */
handleWholeMenus(routes: any[]) { handleWholeMenus() {
this.wholeMenus = filterNoPermissionTree( this.wholeMenus = filterTree(ascending(this.constantMenus));
filterTree(ascending(this.constantMenus.concat(routes)))
); // this.wholeMenus = routes;
console.log("2323", this.wholeMenus);
}, },
cacheOperate({ mode, name }: cacheType) { cacheOperate({ mode, name }: cacheType) {
const delIndex = this.cachePageList.findIndex(v => v === name); const delIndex = this.cachePageList.findIndex(v => v === name);

@ -5,9 +5,15 @@ import { routerArrays } from "@/layout/types";
import { router, resetRouter } from "@/router"; import { router, resetRouter } from "@/router";
import { storageSession } from "@pureadmin/utils"; import { storageSession } from "@pureadmin/utils";
import { getLogin, refreshTokenApi } from "@/api/user"; import { getLogin, refreshTokenApi } from "@/api/user";
import { UserResult, RefreshTokenResult } from "@/api/user"; import { RefreshTokenResult } from "@/api/user";
import { useMultiTagsStoreHook } from "@/store/modules/multiTags"; import { useMultiTagsStoreHook } from "@/store/modules/multiTags";
import { type DataInfo, setToken, removeToken, sessionKey } from "@/utils/auth"; import {
type DataInfo,
setToken,
removeToken,
sessionKey,
setUserInfo
} from "@/utils/auth";
export const useUserStore = defineStore({ export const useUserStore = defineStore({
id: "pure-user", id: "pure-user",
@ -39,7 +45,8 @@ export const useUserStore = defineStore({
getLogin(data) getLogin(data)
.then(data => { .then(data => {
if (data) { if (data) {
setToken(data.data); setToken(data.data.token);
setUserInfo(data.data);
resolve(data); resolve(data);
} }
}) })

@ -71,16 +71,16 @@
.login-box { .login-box {
width: 500px; width: 500px;
height: 546px; height: 546px;
background: #FFFFFF; background: #ffffff;
border-radius: 10px 10px 10px 10px; border-radius: 10px 10px 10px 10px;
display: flex; display: flex;
flex-direction: column; flex-direction: column;
justify-content: space-between; justify-content: space-between;
align-items: center; align-items: center;
text-align: center; text-align: center;
margin-left:160px; margin-left: 160px;
padding-top:50px padding-top: 65px;
} }
.login-form { .login-form {

@ -258,8 +258,8 @@ div:focus {
} }
.footer-btn { .footer-btn {
width: 188px; width: 188px;
height: 48px; height: 48px;
margin-bottom: 24px; margin-bottom: 24px;
} }
.el-dialog { .el-dialog {
border-radius: 20px 20px 20px 20px !important; border-radius: 20px 20px 20px 20px !important;
@ -269,4 +269,34 @@ margin-bottom: 24px;
} }
.el-dialog__footer { .el-dialog__footer {
text-align: center !important; text-align: center !important;
} }
.step-footer-btn {
width: 100%;
display: flex;
justify-content: center;
margin-top: 36px;
}
.el-form-item__label {
font-weight: 700;
}
.header_title {
display: flex;
align-items: center;
border-bottom: 1px solid rgba(91, 139, 255, 0.3);
.title {
border-bottom: 4px solid #4287ff;
display: flex;
padding-bottom: 8px;
img {
width: 20px;
height: 20px;
margin-right: 8px;
}
font-size: 16px;
font-weight: bold;
color: #2b3f54;
}
}
.el-table__row {
cursor: pointer;
}

@ -1,6 +1,6 @@
import Cookies from "js-cookie"; import Cookies from "js-cookie";
import { storageSession } from "@pureadmin/utils"; import { storageSession } from "@pureadmin/utils";
import { useUserStoreHook } from "@/store/modules/user"; // import { useUserStoreHook } from "@/store/modules/user";
export interface DataInfo<T> { export interface DataInfo<T> {
/** token */ /** token */
@ -37,6 +37,13 @@ export function setToken(data: any) {
storageSession().setItem("token", data); storageSession().setItem("token", data);
} }
export function setUserInfo(data: any) {
storageSession().setItem("userInfo", JSON.stringify(data));
}
export function getUserInfo() {
const data = storageSession().getItem("userInfo");
return data;
}
/** 删除`token`以及key值为`user-info`的session信息 */ /** 删除`token`以及key值为`user-info`的session信息 */
export function removeToken() { export function removeToken() {
Cookies.remove(TokenKey); Cookies.remove(TokenKey);

@ -12,7 +12,7 @@ import {
import { stringify } from "qs"; import { stringify } from "qs";
import NProgress from "../progress"; import NProgress from "../progress";
import { getToken, formatToken } from "@/utils/auth"; import { getToken, formatToken } from "@/utils/auth";
import { useUserStoreHook } from "@/store/modules/user"; // import { useUserStoreHook } from "@/store/modules/user";
import { message } from "../message"; import { message } from "../message";
import router from "@/router"; import router from "@/router";
@ -201,6 +201,22 @@ class PureHttp {
): Promise<P> { ): Promise<P> {
return this.request<P>("get", url, params, config); return this.request<P>("get", url, params, config);
} }
/** 单独抽离的put工具函数 */
public put<T, P>(
url: string,
params?: AxiosRequestConfig<T>,
config?: PureHttpRequestConfig
): Promise<P> {
return this.request<P>("post", url, params, config);
}
/** 单独抽离的delete工具函数 */
public delete<T, P>(
url: string,
params?: AxiosRequestConfig<T>,
config?: PureHttpRequestConfig
): Promise<P> {
return this.request<P>("delete", url, params, config);
}
} }
export const http = new PureHttp(); export const http = new PureHttp();

@ -0,0 +1,343 @@
<script setup lang="ts">
import { onMounted, ref, reactive } from "vue";
import WangEditor from "@/components/WangEditor/index.vue";
import {
queryPhysicalToolList,
queryBodyListByDiseaseId,
deleteBodyItem,
queryTreeDiseasePhysical,
addBodyInspect,
updateBodyInspect
} from "@/api/disease";
import { ElMessageBox, FormInstance } from "element-plus";
import { message } from "@/utils/message";
import { useRoute } from "vue-router";
const isEditFlag = ref(false);
const id = ref("");
const formData = reactive({
toolIdPath: [],
diagnosticCriteria: [],
locationId: "",
locationIdPath: [],
locationDiagnosisFlag: "",
trait: "",
diagnosticRes: "",
result: "",
requireCheckFlag: "",
diagnosisAssessmentFlag: "",
expectedDiagnosisResult: "",
toolId: ""
});
const props = {
value: "id",
label: "toolName",
children: "toolList",
disabled: "flag",
expandTrigger: "hover" as const
};
const bodyProps = {
value: "id",
label: "locationName",
children: "child",
disabled: "flag"
};
const route = useRoute();
const selectBodyInspectList = ref([]);
const bodyTreeList = ref([]);
const refWangEditor = ref(null);
const columns: TableColumnList = [
{
label: "体格检查项目",
prop: "toolName"
},
{
label: "固定检查位",
prop: "locationName"
},
{
label: "诊断判读",
prop: "diagnosisAssessmentFlag",
formatter: ({ diagnosisAssessmentFlag }) => {
return diagnosisAssessmentFlag === 0 ? "不需要" : "需要";
}
},
{
label: "是否必查",
prop: "requireCheckFlag",
formatter: ({ requireCheckFlag }) => {
return requireCheckFlag === 0 ? "否" : "是";
}
},
{
label: "预期诊断结果",
prop: "expectedDiagnosisResult",
formatter: ({ expectedDiagnosisResult }) => {
return expectedDiagnosisResult === 0 ? "正常" : "异常";
}
},
{
label: "操作",
width: 150,
slot: "operation"
}
];
defineOptions({
name: "BodyInspect"
});
const diagnosticResList = [
{
label: "正常",
value: 0
},
{
label: "异常",
value: 1
}
];
const rules = {
toolIdPath: [
{ required: true, message: "请选择体格检查项", trigger: "change" }
],
diagnosisAssessmentFlag: [
{ required: true, message: "请选择诊断判读", trigger: "change" }
],
requireCheckFlag: [
{ required: true, message: "请选择是否必查", trigger: "change" }
],
expectedDiagnosisResult: [
{ required: true, message: "请选择预期诊断结果", trigger: "change" }
]
};
const ruleFormRef = ref<FormInstance>();
const bodyToolList = ref([]);
const handleChange = item => {
formData.toolId = item[item.length - 1];
getBodyTree();
formData.locationIdPath = [];
formData.locationId = "";
formData.result = "";
formData.locationDiagnosisFlag = "";
};
const handleLocationChange = item => {
formData.locationId = item[item.length - 1];
formData.result = "";
formData.locationDiagnosisFlag = "";
};
const getPhysicalToolList = async () => {
const res: any = await queryPhysicalToolList();
bodyToolList.value = res.data;
};
onMounted(() => {
getPhysicalToolList();
getBodyListByDiseaseId();
});
//
const getBodyTree = async () => {
const res: any = await queryTreeDiseasePhysical({
diseaseId: route.query.id,
toolId: formData.toolId
});
bodyTreeList.value = res.data;
};
const getBodyListByDiseaseId = async () => {
const res: any = await queryBodyListByDiseaseId({
diseaseId: route.query.id
});
selectBodyInspectList.value = res.data;
};
const edit = item => {
for (const key in item) {
// eslint-disable-next-line no-prototype-builtins
if (formData.hasOwnProperty(key)) {
formData[key] = item[key];
}
}
getBodyTree();
isEditFlag.value = true;
id.value = item.id;
refWangEditor.value.valueHtml = item.trait;
};
const del = item => {
ElMessageBox.confirm(item ? `是否删除` : "", "提示", {
type: "warning"
})
.then(async () => {
const res = await deleteBodyItem({ id: item.id });
if (res.code === 200) {
getBodyListByDiseaseId();
message("删除成功", { type: "success" });
}
})
.catch(() => {});
};
const reset = (formEl: FormInstance | undefined) => {
if (!formEl) return;
formEl.resetFields();
formData.result = "";
formData.locationDiagnosisFlag = "";
isEditFlag.value = false;
refWangEditor.value.valueHtml = "";
};
const save = (formEl: FormInstance | undefined) => {
console.log(refWangEditor.value.valueHtml);
formEl.validate(async (valid, fields) => {
if (valid) {
formData.trait = refWangEditor.value.valueHtml;
const params = {
...formData,
diseaseId: route.query.id
};
if (isEditFlag.value) {
const res: any = await updateBodyInspect({
...params,
id: id.value
});
if (res.code === 200) {
message("修改成功", { type: "success" });
reset(ruleFormRef.value);
id.value = "";
getBodyListByDiseaseId();
}
} else {
const res: any = await addBodyInspect(params);
if (res.code === 200) {
message("新增成功", { type: "success" });
reset(ruleFormRef.value);
getBodyListByDiseaseId();
}
}
} else {
return fields;
}
});
};
</script>
<template>
<div class="body-inspect">
<el-form
ref="ruleFormRef"
:model="formData"
:rules="rules"
label-width="150px"
>
<el-form-item label="疾病名称:" prop="code">
<span>{{ route.query.diseaseName }}</span>
</el-form-item>
<el-form-item label="体格检查项:" prop="toolIdPath">
<el-cascader
size="large"
v-model="formData.toolIdPath"
:options="bodyToolList"
:props="props"
@change="handleChange"
/>
</el-form-item>
<el-row>
<el-form-item label="部位检查结果:" prop="locationIdPath">
<el-cascader
size="large"
v-model="formData.locationIdPath"
:options="bodyTreeList"
:props="bodyProps"
@change="handleLocationChange"
/>
</el-form-item>
<el-select
size="large"
filterable
v-model="formData.locationDiagnosisFlag"
style="width: 150px"
placeholder="诊断结果"
>
<el-option
v-for="item in diagnosticResList"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
<el-input
size="large"
style="width: 800px; height: 40px"
v-model="formData.result"
placeholder="请输入诊断部位结果"
/>
</el-row>
<el-form-item label="诊断依据:" prop="diagnosticCriteria">
<el-checkbox-group v-model="formData.diagnosticCriteria">
<el-checkbox :label="0">初步诊断依据</el-checkbox>
<el-checkbox :label="1">证实诊断依据</el-checkbox>
<el-checkbox :label="2">鉴别依据</el-checkbox>
<el-checkbox :label="3">全面依据</el-checkbox>
</el-checkbox-group>
</el-form-item>
<el-row>
<el-form-item label="诊断判读:" prop="diagnosisAssessmentFlag">
<el-radio-group v-model="formData.diagnosisAssessmentFlag">
<el-radio :label="0" size="large">不需要</el-radio>
<el-radio :label="1" size="large">需要</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="是否必查:" prop="requireCheckFlag">
<el-radio-group v-model="formData.requireCheckFlag">
<el-radio :label="0" size="large"></el-radio>
<el-radio :label="1" size="large"></el-radio>
</el-radio-group>
</el-form-item>
</el-row>
<el-form-item label="预期诊断结果:" prop="expectedDiagnosisResult">
<el-radio-group v-model="formData.expectedDiagnosisResult">
<el-radio :label="0" size="large">正常</el-radio>
<el-radio :label="1" size="large">异常</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="诊断结果:" prop="trait">
<WangEditor ref="refWangEditor" />
</el-form-item>
</el-form>
<div class="btn-list">
<el-button size="large" @click="save(ruleFormRef)" type="primary"
>确定</el-button
>
<el-button size="large" @click="reset(ruleFormRef)"></el-button>
</div>
<div class="footer">
<div class="top">
{{ `已选体格检查项目【${selectBodyInspectList.length}个】` }}
</div>
<pure-table
border
adaptive
ref="tableRef"
style="width: 1600px"
align-whole="center"
showOverflowTooltip
:data="selectBodyInspectList"
: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="primary" @click="edit(row)"></el-button>
<el-button link type="danger" @click="del(row)"> </el-button>
</template></pure-table
>
</div>
</div>
</template>
<style lang="scss" scoped>
.body-inspect {
display: flex;
flex-direction: column;
overflow: hidden;
.footer {
flex: 1;
}
}
</style>

@ -0,0 +1,155 @@
<script setup lang="ts">
import { reactive, ref } from "vue";
import { addSave, update } from "@/api/disease";
import { FormInstance } from "element-plus";
import { message } from "@/utils/message";
defineOptions({
name: "AddEdit"
});
const dialogVisible = ref(false);
const title = ref("");
const formData = reactive({
diseaseName: "",
diseaseNameAlias: "",
code: "",
symptom: "",
id: undefined
});
const ruleFormRef = ref<FormInstance>();
const rules = {
code: [{ required: true, message: "请输入类目编码", trigger: "change" }],
diseaseNameAlias: [
{ required: true, message: "请输入疾病分类别名", trigger: "change" }
],
diseaseName: [
{ required: true, message: "请输入疾病分类名称", trigger: "change" }
]
};
defineExpose({
open(type, item) {
resetForm();
if (type === "add") {
title.value = "新增疾病";
} else {
title.value = "编辑疾病";
// formData = JSON.parse(JSON.stringify(item));
formData.diseaseName = item.diseaseName;
formData.diseaseNameAlias = item.diseaseNameAlias;
formData.code = item.code;
formData.symptom = item.symptom;
formData.id = item.id;
}
dialogVisible.value = true;
}
});
const resetForm = () => {
if (!ruleFormRef.value) return;
ruleFormRef.value.resetFields();
};
const closeDialog = () => {
dialogVisible.value = false;
resetForm();
};
const emit = defineEmits(["update"]);
const save = (formEl: FormInstance | undefined) => {
formEl.validate(async (valid, fields) => {
if (valid) {
if (title.value === "编辑疾病") {
const { code, diseaseName, diseaseNameAlias, symptom, id } = formData;
const res: any = await update({
code,
diseaseName,
diseaseNameAlias,
symptom,
id
});
if (res.code === 200) {
closeDialog();
emit("update");
message("编辑成功", { type: "success" });
}
} else {
const { code, diseaseName, diseaseNameAlias, symptom } = formData;
const res: any = await addSave({
code,
diseaseName,
diseaseNameAlias,
symptom
});
if (res.code === 200) {
closeDialog();
emit("update");
message("新增成功", { type: "success" });
}
}
} else {
return fields;
}
});
};
</script>
<template>
<div>
<el-dialog
width="800"
append-to-body
:title="title"
v-model="dialogVisible"
:show-close="false"
:before-close="closeDialog"
custom-class="AddEdit"
>
<div>
<el-form
ref="ruleFormRef"
:model="formData"
:rules="rules"
label-width="150px"
>
<el-form-item label="类目编码:" prop="code">
<el-input
size="large"
v-model="formData.code"
placeholder="请输入类目编码"
/>
</el-form-item>
<el-form-item label="疾病分类别名:" prop="diseaseNameAlias">
<el-input
v-model="formData.diseaseNameAlias"
size="large"
placeholder="请输入疾病分类别名"
/>
</el-form-item>
<el-form-item label="疾病分类名称:" prop="diseaseName">
<el-input
size="large"
v-model="formData.diseaseName"
placeholder="请输入疾病分类名称"
/>
</el-form-item>
<el-form-item label="症状:" prop="symptom">
<el-input
size="large"
v-model="formData.symptom"
placeholder="请输入症状"
/>
</el-form-item>
</el-form>
</div>
<template #footer>
<el-button
size="large"
@click="save(ruleFormRef)"
class="footer-btn"
type="primary"
>确定</el-button
>
<el-button size="large" class="footer-btn" @click="closeDialog"
>取消</el-button
>
</template>
</el-dialog>
</div>
</template>

@ -0,0 +1,162 @@
<script setup lang="ts">
import { reactive, ref } from "vue";
import { PaginationProps } from "@pureadmin/table";
import { queryListAqLibrary, queryItemList } from "@/api/disease";
import { message } from "@/utils/message";
defineOptions({
name: "ProblemBase"
});
const dialogVisible = ref(false);
const seachForm = reactive({
code: ""
});
const multipleSelection = ref([]);
const pagination = reactive<PaginationProps>({
total: 0,
pageSize: 10,
currentPage: 1,
background: true
});
const selectColumns: TableColumnList = [
{
type: "selection",
align: "left"
},
{
label: "问题类目",
prop: "nameZhPath"
},
{
label: "问题",
prop: "question"
},
{
label: "回复",
prop: "defaultAnswer"
}
];
const dataList = ref([
{
question: "dsdsdsdsd"
},
{
question: "dsdsdsdsd"
}
]);
const codeList = ref([]);
const getItemList = async () => {
const res: any = await queryItemList();
codeList.value = res.data;
};
defineExpose({
open() {
dialogVisible.value = true;
getData();
getItemList();
}
});
const getData = async () => {
const res: any = await queryListAqLibrary({
code: seachForm.code,
pageNum: pagination.currentPage,
pageSize: pagination.pageSize
});
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();
}
function handleSelectionChange(val) {
multipleSelection.value = val;
}
const search = () => {
pagination.currentPage = 1;
pagination.pageSize = 10;
getData();
};
const reset = () => {
seachForm.code = "";
search();
};
const emit = defineEmits(["select"]);
const save = () => {
if (multipleSelection.value.length > 0) {
emit("select", multipleSelection.value);
dialogVisible.value = false;
} else {
message("请至少选择一条数据", { type: "warning" });
}
};
</script>
<template>
<div>
<el-dialog
width="1200"
append-to-body
title="问题库"
v-model="dialogVisible"
custom-class="ProblemBase"
>
<div>
<div class="seach">
<el-form :model="seachForm" label-width="120px">
<el-row>
<el-form-item label="类目:">
<el-select
size="large"
filterable
v-model="seachForm.code"
placeholder="请选择"
>
<el-option
v-for="item in codeList"
:key="item.code"
:label="item.nameZh"
:value="item.code"
/>
</el-select>
</el-form-item>
<el-button size="large" @click="search" type="primary"
>搜索</el-button
>
<el-button size="large" @click="reset"></el-button>
</el-row>
<el-row>
<el-button size="large" @click="save" type="primary"
>保存</el-button
>
</el-row>
</el-form>
</div>
<pure-table
border
align-whole="center"
showOverflowTooltip
table-layout="auto"
row-key="id"
adaptive
:data="dataList"
:columns="selectColumns"
:pagination="pagination"
:header-cell-style="{
background: 'var(--el-table-row-hover-bg-color)',
color: 'var(--el-text-color-primary)'
}"
@selection-change="handleSelectionChange"
@page-size-change="handleSizeChange"
@page-current-change="handleCurrentChange"
/>
</div>
</el-dialog>
</div>
</template>

@ -0,0 +1,255 @@
<script setup lang="ts">
import { onMounted, ref, reactive } from "vue";
import CustomDialogHeader from "@/components/CustomDialogHeader/index.vue";
import {
queryTreeTreatmentPlan,
queryListBiseaseTreatmentPlan,
addDiseaseTreatmentPlan,
deleteTreatmentPlan
} from "@/api/disease";
import { useRoute } from "vue-router";
import { ElMessageBox, FormInstance } from "element-plus";
import { message } from "@/utils/message";
const formData = reactive({
id: "",
planId: [],
disposalMethod: ""
});
const visible = ref(false);
const route = useRoute();
const props = {
multiple: true,
value: "id",
label: "name",
children: "child",
disabled: "flag"
};
const selectDisposalPlanList = ref([]);
const ruleFormRef = ref<FormInstance>();
const columns: TableColumnList = [
{
label: "处置计划",
prop: "disposalPlan"
},
{
label: "一级措施",
prop: "firstMeasures"
},
{
label: "二级措施",
prop: "secondMeasures"
},
{
label: "处置方式",
prop: "disposalMethod",
formatter: ({ disposalMethod }) => {
return disposalMethod === 0 ? "门诊收治" : "入院治疗";
}
},
{
label: "操作",
width: 150,
slot: "operation"
}
];
defineOptions({
name: "DisposalPlan"
});
const getTree = async val => {
const res: any = await queryTreeTreatmentPlan({
diseaseId: route.query.id,
disposalMethod: val
});
disposalPlanList.value = res.data;
};
let disposalPlanInfo = reactive({
disposalPlan: "",
firstMeasures: "",
secondMeasures: "",
disposalMethod: 0,
description: ""
});
const rules = {
disposalMethod: [{ required: true, message: "请选择", trigger: "change" }],
planId: [{ required: true, message: "请选择", trigger: "change" }]
};
const disposalPlanList = ref([]);
const handleChange = () => {};
const getData = async () => {
const res: any = await queryListBiseaseTreatmentPlan({
diseaseId: route.query.id
});
selectDisposalPlanList.value = res.data;
};
const selectType = val => {
getTree(val);
};
onMounted(() => {
getData();
});
const submit = (formEl: FormInstance | undefined) => {
formEl.validate(async (valid, fields) => {
if (valid) {
const arry = [];
formData.planId.forEach(res => {
arry.push({
diseaseId: route.query.id,
planId: res[res.length - 1]
});
});
const res: any = await addDiseaseTreatmentPlan(arry);
if (res.code === 200) {
message("提交成功", { type: "success" });
formData.disposalMethod = "";
formData.planId = [];
resetForm(ruleFormRef.value);
getData();
}
} else {
return fields;
}
});
};
const resetForm = (formEl: FormInstance | undefined) => {
if (!formEl) return;
formEl.resetFields();
};
const openDetail = item => {
visible.value = true;
disposalPlanInfo = item;
};
const del = item => {
ElMessageBox.confirm(item ? `是否删除` : "", "提示", {
type: "warning"
})
.then(async () => {
const res = await deleteTreatmentPlan({ id: item.id });
if (res.code === 200) {
getData();
getTree(formData.disposalMethod);
message("删除成功", { type: "success" });
}
})
.catch(() => {});
};
</script>
<template>
<div class="disposal-plan">
<el-form
ref="ruleFormRef"
:model="formData"
:rules="rules"
label-width="150px"
>
<el-form-item label="处置方式:" prop="disposalMethod">
<el-radio-group v-model="formData.disposalMethod" @change="selectType">
<el-radio :label="0" size="large">门诊收治</el-radio>
<el-radio :label="1" size="large">入院治疗</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="处置计划:" prop="planId">
<el-cascader
size="large"
style="width: 800px"
v-model="formData.planId"
:options="disposalPlanList"
:props="props"
@change="handleChange"
/>
</el-form-item>
</el-form>
<div>
<div class="top">
{{ `已选处置计划【${selectDisposalPlanList.length}个】` }}
</div>
<pure-table
border
style="width: 1600px"
align-whole="center"
showOverflowTooltip
:data="selectDisposalPlanList"
: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="primary" @click="openDetail(row)"
>详情</el-button
>
<el-button link type="danger" @click="del(row)"> </el-button>
</template></pure-table
>
</div>
<div class="btn-list">
<el-button size="large" @click="submit(ruleFormRef)" type="primary"
>确定</el-button
>
<el-button size="large" @click="resetForm(ruleFormRef)"></el-button>
</div>
<!-- 处置计划详情 -->
<el-dialog
width="800"
append-to-body
v-model="visible"
:center="true"
:show-close="false"
custom-class="disposal-plan-dialog"
><!-- 使用自定义头部组件 -->
<template v-slot:header>
<custom-dialog-header title="处置计划详情" />
</template>
<div class="disposal-plan-dialog">
<el-row>
<el-col class="mb-10" :span="12">
<label>处置计划</label>
<span>{{ disposalPlanInfo.disposalPlan }}</span>
</el-col>
<el-col class="mb-10" :span="12">
<label>处置方式</label>
<span>{{
disposalPlanInfo.disposalMethod === 1 ? "入院治疗" : "门诊收治"
}}</span>
</el-col>
</el-row>
<el-row>
<el-col class="mb-10" :span="12">
<label>一级措施</label>
<span>{{ disposalPlanInfo.firstMeasures }}</span>
</el-col>
</el-row>
<el-row>
<el-col class="mb-10" :span="24">
<label>说明</label>
<span>{{ disposalPlanInfo.description }}</span>
</el-col>
</el-row>
<div style="text-align: center">
<el-button
class="footer_btn"
size="large"
@click="visible = false"
type="primary"
>知道了</el-button
>
</div>
</div>
</el-dialog>
</div>
</template>
<style lang="scss" scoped>
.disposal-plan {
.btn-list {
margin-top: 16px;
}
}
.disposal-plan-dialo {
.dialog-item {
height: 40px;
}
}
</style>

@ -0,0 +1,192 @@
<script setup lang="ts">
import router from "@/router";
import { PaginationProps } from "@pureadmin/table";
import AddEdit from "./compontents/addEdit.vue";
import ProblemBase from "./compontents/problemBase.vue";
import { reactive, ref } from "vue";
import { queryPageList, deleteItem } from "@/api/disease";
import { onMounted } from "vue";
import { message } from "@/utils/message";
import { ElMessageBox } from "element-plus";
defineOptions({
name: "DiseaseType"
});
const dataList = ref([{}]);
const loading = ref(false);
const addEditRef = ref(null);
const problemBaseRef = ref(null);
const seachForm = reactive({
diseaseName: ""
});
const pagination = reactive<PaginationProps>({
total: 0,
pageSize: 10,
currentPage: 1,
background: true
});
const columns: TableColumnList = [
{
label: "类目编码",
prop: "code",
minWidth: 150
},
{
label: "疾病分类名称",
prop: "diseaseName",
minWidth: 240
},
{
label: "操作",
fixed: "right",
width: 400,
slot: "operation"
}
];
const getData = async () => {
const params = {
pageNum: pagination.currentPage,
pageSize: pagination.pageSize,
diseaseName: seachForm.diseaseName
};
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.diseaseName = "";
search();
};
const add = () => {
addEditRef.value.open("add");
};
const edit = item => {
addEditRef.value.open("edit", JSON.parse(JSON.stringify(item)));
};
//
const inspect = item => {
router.push({
name: "diseaseTypeInquiry",
query: {
id: item.id
}
});
};
const openBodyInspect = item => {
router.push({
path: "/caseManagement/diseaseType/bodyInspect",
query: {
id: item.id,
diseaseName: item.diseaseName
}
});
};
const openSupportInspect = item => {
router.push({
path: "/caseManagement/diseaseType/supportInspect",
query: {
id: item.id,
diseaseName: item.diseaseName
}
});
};
const openDisposalPlan = item => {
router.push({
name: "diseaseTypeDisposalPlan",
query: {
id: item.id
}
});
};
const handleDelete = item => {
ElMessageBox.confirm(
item ? `确认删除后${item.diseaseName}的所有信息将被清空, 且无法恢复` : "",
"提示",
{
type: "warning"
}
)
.then(async () => {
const res = await deleteItem({ id: item.id });
if (res.code === 200) {
getData();
message("删除成功", { type: "success" });
}
})
.catch(() => {});
};
onMounted(() => {
getData();
});
</script>
<template>
<div class="diseaseType">
<div class="seach">
<el-form :model="seachForm" label-width="120px">
<el-row>
<el-form-item label="疾病分类:">
<el-input size="large" v-model="seachForm.diseaseName" />
</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-row class="mb-10">
<el-button size="large" @click="add" type="primary">新增</el-button>
</el-row>
</el-form>
</div>
<pure-table
border
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="edit(row)"> </el-button>
<el-button link type="primary" @click="inspect(row)"> </el-button>
<el-button link type="primary" @click="openBodyInspect(row)">
体格检查
</el-button>
<el-button link type="primary" @click="openSupportInspect(row)">
辅助检查
</el-button>
<el-button link type="primary" @click="openDisposalPlan(row)">
处置计划
</el-button>
<el-button link type="primary" @click="handleDelete(row)">
删除
</el-button>
</template>
</pure-table>
<AddEdit @update="getData" ref="addEditRef" />
<ProblemBase ref="problemBaseRef" />
</div>
</template>

@ -0,0 +1,106 @@
<script setup lang="ts">
import { onMounted, ref } from "vue";
import {
queryListByDiseaseId,
diseaseQuestionDel,
questionBatchSave
} from "@/api/disease";
import { ElMessageBox } from "element-plus";
import { message } from "@/utils/message";
import ProblemBase from "../compontents/problemBase.vue";
import { useRoute } from "vue-router";
defineOptions({
name: "DiseaseTypeInquiry"
});
const columns: TableColumnList = [
{
label: "序号",
type: "index",
width: 80
},
{
label: "问题类目",
prop: "itemName"
},
{
label: "问题",
prop: "questionList",
formatter: ({ questionList }) => `${questionList[0]}`
},
{
label: "回复",
prop: "answer"
},
{
label: "操作",
width: 150,
slot: "operation"
}
];
const route = useRoute();
const selectDataList = ref([]);
const problemBaseRef = ref(null);
const add = () => {
problemBaseRef.value.open();
};
onMounted(() => {
getData();
});
const getData = async () => {
const res: any = await queryListByDiseaseId({
diseaseId: route.query.id
});
selectDataList.value = res.data;
};
const handleDelete = item => {
ElMessageBox.confirm(item ? `是否删除` : "", "提示", {
type: "warning"
})
.then(async () => {
const res = await diseaseQuestionDel({ id: item.id });
if (res.code === 200) {
getData();
message("删除成功", { type: "success" });
}
})
.catch(() => {});
};
const selectOk = async (data: any) => {
const arry = [];
data.forEach(e => {
arry.push({
diseaseId: route.query.id,
questionId: e.id
});
});
await questionBatchSave(arry);
getData();
};
</script>
<template>
<div class="diseaseType-inquiry">
<el-button size="large" @click="add" type="primary">问题库</el-button>
<div class="title">
{{ `已选疾病补充问题【${selectDataList.length}` }}
</div>
<pure-table
border
align-whole="center"
showOverflowTooltip
:data="selectDataList"
: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
>
<ProblemBase @select="selectOk" ref="problemBaseRef" />
</div>
</template>

@ -0,0 +1,270 @@
<script setup lang="ts">
import { onMounted, ref, reactive } from "vue";
import WangEditor from "@/components/WangEditor/index.vue";
import {
querySupportLsit,
queryAncillaryItemList,
deleteSupportItem,
addSupportInspect,
updateSupportInspect
} from "@/api/disease";
import { ElMessageBox, FormInstance } from "element-plus";
import { message } from "@/utils/message";
import { useRoute } from "vue-router";
const isEditFlag = ref(false);
const id = ref("");
const formData = reactive({
itemIdPath: [],
diagnosticCriteria: [],
locationDiagnosisFlag: "",
result: "",
requireCheckFlag: "",
diagnosisAssessmentFlag: "",
expectedDiagnosisResult: "",
itemId: ""
});
const props = {
value: "id",
label: "itemName",
children: "itemList",
disabled: "flag",
expandTrigger: "hover" as const
};
const route = useRoute();
const selectSupportInspectList = ref([]);
const refWangEditor = ref(null);
const columns: TableColumnList = [
{
label: "辅助检查项目",
prop: "itemName"
},
{
label: "固定检查位",
prop: "locationName",
formatter: () => `不需要`
},
{
label: "诊断判读",
prop: "diagnosisAssessmentFlag",
formatter: ({ diagnosisAssessmentFlag }) => {
return diagnosisAssessmentFlag === 0 ? "不需要" : "需要";
}
},
{
label: "是否必查",
prop: "requireCheckFlag",
formatter: ({ requireCheckFlag }) => {
return requireCheckFlag === 0 ? "否" : "是";
}
},
{
label: "预期诊断结果",
prop: "expectedDiagnosisResult",
formatter: ({ expectedDiagnosisResult }) => {
return expectedDiagnosisResult === 0 ? "正常" : "异常";
}
},
{
label: "操作",
width: 150,
slot: "operation"
}
];
defineOptions({
name: "SupportInspect"
});
const rules = {
itemIdPath: [
{ required: true, message: "请选择辅助检查项", trigger: "change" }
],
diagnosisAssessmentFlag: [
{ required: true, message: "请选择诊断判读", trigger: "change" }
],
requireCheckFlag: [
{ required: true, message: "请选择是否必查", trigger: "change" }
],
expectedDiagnosisResult: [
{ required: true, message: "请选择预期诊断结果", trigger: "change" }
]
};
const ruleFormRef = ref<FormInstance>();
const supportToolList = ref([]);
const handleChange = item => {
formData.itemId = item[item.length - 1];
};
const getPhysicalToolList = async () => {
const res: any = await queryAncillaryItemList({
diseaseId: route.query.id
});
supportToolList.value = res.data;
};
onMounted(() => {
getPhysicalToolList();
getsupportListByDiseaseId();
});
const getsupportListByDiseaseId = async () => {
const res: any = await querySupportLsit({
diseaseId: route.query.id
});
selectSupportInspectList.value = res.data;
};
const edit = 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;
refWangEditor.value.valueHtml = item.result;
};
const del = item => {
ElMessageBox.confirm(item ? `是否删除` : "", "提示", {
type: "warning"
})
.then(async () => {
const res = await deleteSupportItem({ id: item.id });
if (res.code === 200) {
getsupportListByDiseaseId();
message("删除成功", { type: "success" });
}
})
.catch(() => {});
};
const reset = (formEl: FormInstance | undefined) => {
if (!formEl) return;
formEl.resetFields();
isEditFlag.value = false;
refWangEditor.value.valueHtml = "";
};
const save = (formEl: FormInstance | undefined) => {
console.log(refWangEditor.value.valueHtml);
formEl.validate(async (valid, fields) => {
if (valid) {
formData.result = refWangEditor.value.valueHtml;
const params = {
...formData,
diseaseId: route.query.id
};
if (isEditFlag.value) {
const res: any = await updateSupportInspect({
...params,
id: id.value
});
if (res.code === 200) {
message("修改成功", { type: "success" });
reset(ruleFormRef.value);
id.value = "";
}
} else {
const res: any = await addSupportInspect(params);
if (res.code === 200) {
message("新增成功", { type: "success" });
reset(ruleFormRef.value);
}
}
getsupportListByDiseaseId();
getPhysicalToolList();
} else {
return fields;
}
});
};
</script>
<template>
<div class="support-inspect">
<el-form
ref="ruleFormRef"
:model="formData"
:rules="rules"
label-width="150px"
>
<el-form-item label="疾病名称:" prop="code">
<span>{{ route.query.diseaseName }}</span>
</el-form-item>
<el-form-item label="辅助查项:" prop="itemIdPath">
<el-cascader
size="large"
v-model="formData.itemIdPath"
:options="supportToolList"
:props="props"
@change="handleChange"
/>
</el-form-item>
<el-form-item label="诊断依据:" prop="diagnosticCriteria">
<el-checkbox-group v-model="formData.diagnosticCriteria">
<el-checkbox :label="0">初步诊断依据</el-checkbox>
<el-checkbox :label="1">证实诊断依据</el-checkbox>
<el-checkbox :label="2">鉴别依据</el-checkbox>
<el-checkbox :label="3">全面依据</el-checkbox>
</el-checkbox-group>
</el-form-item>
<el-row>
<el-form-item label="诊断判读:" prop="diagnosisAssessmentFlag">
<el-radio-group v-model="formData.diagnosisAssessmentFlag">
<el-radio :label="0" size="large">不需要</el-radio>
<el-radio :label="1" size="large">需要</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="是否必查:" prop="requireCheckFlag">
<el-radio-group v-model="formData.requireCheckFlag">
<el-radio :label="0" size="large"></el-radio>
<el-radio :label="1" size="large"></el-radio>
</el-radio-group>
</el-form-item>
</el-row>
<el-form-item label="预期诊断结果:" prop="expectedDiagnosisResult">
<el-radio-group v-model="formData.expectedDiagnosisResult">
<el-radio :label="0" size="large">正常</el-radio>
<el-radio :label="1" size="large">异常</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="诊断结果:" prop="result">
<WangEditor ref="refWangEditor" />
</el-form-item>
</el-form>
<div class="btn-list">
<el-button size="large" @click="save(ruleFormRef)" type="primary"
>确定</el-button
>
<el-button size="large" @click="reset(ruleFormRef)"></el-button>
</div>
<div class="footer">
<div class="top">
{{ `已选体格检查项目【${selectSupportInspectList.length}个】` }}
</div>
<pure-table
border
adaptive
style="width: 1600px"
align-whole="center"
showOverflowTooltip
:data="selectSupportInspectList"
: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="primary" @click="edit(row)"></el-button>
<el-button link type="danger" @click="del(row)"> </el-button>
</template></pure-table
>
</div>
</div>
</template>
<style lang="scss" scoped>
.support-inspect {
display: flex;
flex-direction: column;
overflow: hidden;
.footer {
flex: 1;
}
}
</style>

@ -0,0 +1,15 @@
<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>

@ -0,0 +1,47 @@
<script setup lang="ts">
defineOptions({
name: "DisposalPlan"
});
defineProps({
dataList: {
type: Array,
default: () => []
}
});
const columns: TableColumnList = [
{
label: "处置计划",
prop: "disposalPlan"
},
{
label: "一级措施",
prop: "firstMeasures"
},
{
label: "二级措施",
prop: "secondMeasures"
},
{
label: "处置方式",
prop: "disposalMethod",
formatter: ({ disposalMethod }) => {
return disposalMethod === 0 ? "门诊收治" : "入院治疗";
}
}
];
</script>
<template>
<div class="DisposalPlan">
<div class="title">{{ `处置计划【${dataList.length}` }}</div>
<pure-table
border
style="width: 1000px; height: 500px"
align-whole="center"
showOverflowTooltip
adaptive
:data="dataList"
:columns="columns"
/>
</div>
</template>

@ -0,0 +1,97 @@
<script setup lang="ts">
import InspectTable from "../../../list/page/compontents/inspectTable.vue";
import { ref } from "vue";
import type { TabsPaneContext } from "element-plus";
defineOptions({
name: "AskInquiry"
});
defineProps({
bodyList: {
type: Array,
default: () => []
},
supportList: {
type: Array,
default: () => []
}
});
const activeName = ref("body");
const handleClick = (tab: TabsPaneContext, event: Event) => {
console.log(tab, event);
};
const bodyColumns: 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 supportColumns: TableColumnList = [
{
label: "检查项目",
prop: "itemName",
width: 300
},
{
label: "初步诊断依据",
slot: "slot0"
},
{
label: "证实诊断依据",
slot: "slot1"
},
{
label: "鉴别依据",
slot: "slot2"
},
{
label: "全面依据",
slot: "slot3"
},
{
label: "是否必查",
prop: "requireCheckFlag",
minWidth: 150,
slot: "requireCheckFlag"
}
];
</script>
<template>
<div class="AskInquiry">
<el-tabs v-model="activeName" class="demo-tabs" @tab-click="handleClick">
<el-tab-pane label="体格检查" name="body">
<InspectTable :columns="bodyColumns" :dataList="bodyList" />
</el-tab-pane>
<el-tab-pane label="辅助检查" name="support">
<InspectTable :columns="supportColumns" :dataList="supportList" />
</el-tab-pane>
</el-tabs>
</div>
</template>

@ -0,0 +1,80 @@
<script setup lang="ts">
defineOptions({
name: "BasicInfo"
});
defineProps({
dataInfo: {
type: Object,
default: () => ({
name: "",
gender: "",
age: "",
profession: "",
patientSelfDesc: "",
marriage: "",
diseaseId: "",
diseaseName: "",
address: ""
})
},
diseaseName: {
type: String,
default: ""
}
});
</script>
<template>
<div class="BasicInfo">
<el-form :model="dataInfo" label-width="280px">
<el-row>
<el-col :span="12">
<el-form-item label="姓名:" prop="name">
<span>{{ dataInfo.name }}</span>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-form-item label="性别:" prop="gender">
<span>{{ dataInfo.gender }}</span>
</el-form-item>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="年龄:" prop="age">
<span>{{ dataInfo.age }}</span>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="职业:" prop="profession">
<span>{{ dataInfo.profession }}</span>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="主诉:" prop="patientSelfDesc">
<span>{{ dataInfo.patientSelfDesc }}</span>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="婚姻状态:" prop="marriage">
<span>{{ dataInfo.marriage }}</span>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="地址:" prop="address">
<span>{{ dataInfo.address }}</span>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="疾病分类:" prop="diseaseName">
<span>{{ diseaseName }}</span>
</el-form-item>
</el-col>
</el-row>
</el-form>
</div>
</template>

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save