diff --git a/virtual-patient-common/src/main/java/com/supervision/config/WebConfig.java b/virtual-patient-common/src/main/java/com/supervision/config/WebConfig.java
index 1b9715e6..07c3102c 100644
--- a/virtual-patient-common/src/main/java/com/supervision/config/WebConfig.java
+++ b/virtual-patient-common/src/main/java/com/supervision/config/WebConfig.java
@@ -48,6 +48,8 @@ public class WebConfig implements WebMvcConfigurer {
         paths.add("/fileManage/downloadFile");
         paths.add("/aqLibrary/downloadQuestionLibraryTemplate");
         paths.add("/medicalRecManage/downloadMedicalAnswerTemplate");
+        //下载病例知识库接口
+        paths.add("/medicalRecManage/downloadMedicalTemplate");
         paths.add("/qaKnowledge/**");
         // 开发环境,放开不校验token.每次修改这里需要重启(热部署不行)
 //        paths.add("/**");
diff --git a/virtual-patient-graph/src/main/resources/nebulaMapper/MedicalRecDao.xml b/virtual-patient-graph/src/main/resources/nebulaMapper/AskTemplateQuestionLibraryManageService.xml
similarity index 100%
rename from virtual-patient-graph/src/main/resources/nebulaMapper/MedicalRecDao.xml
rename to virtual-patient-graph/src/main/resources/nebulaMapper/AskTemplateQuestionLibraryManageService.xml
diff --git a/virtual-patient-manage/pom.xml b/virtual-patient-manage/pom.xml
index 90bebfcb..918135f7 100644
--- a/virtual-patient-manage/pom.xml
+++ b/virtual-patient-manage/pom.xml
@@ -85,11 +85,11 @@
 			<version>${project.version}</version>
 		</dependency>
 
-		<dependency>
-			<groupId>com.supervision</groupId>
-			<artifactId>virtual-patient-common</artifactId>
-			<version>${project.version}</version>
-		</dependency>
+<!--		<dependency>-->
+<!--			<groupId>com.supervision</groupId>-->
+<!--			<artifactId>virtual-patient-common</artifactId>-->
+<!--			<version>${project.version}</version>-->
+<!--		</dependency>-->
 		<dependency>
 			<groupId>org.projectlombok</groupId>
 			<artifactId>lombok</artifactId>
diff --git a/virtual-patient-manage/src/main/java/com/supervision/manage/controller/diseasemanage/DiseaseAncillaryManageController.java b/virtual-patient-manage/src/main/java/com/supervision/manage/controller/diseasemanage/DiseaseAncillaryManageController.java
index 5a9b65b7..b9cd2a31 100644
--- a/virtual-patient-manage/src/main/java/com/supervision/manage/controller/diseasemanage/DiseaseAncillaryManageController.java
+++ b/virtual-patient-manage/src/main/java/com/supervision/manage/controller/diseasemanage/DiseaseAncillaryManageController.java
@@ -21,7 +21,7 @@ import java.util.List;
 @RequiredArgsConstructor
 public class DiseaseAncillaryManageController {
 
-    private final DiseaseAncillaryManageService diseaseAncillaryManageService;
+   private final DiseaseAncillaryManageService diseaseAncillaryManageService;
 
     @Operation(summary = "新增辅助检查信息")
     @PostMapping("/save")
diff --git a/virtual-patient-manage/src/main/java/com/supervision/manage/controller/diseasemanage/DiseaseManageController.java b/virtual-patient-manage/src/main/java/com/supervision/manage/controller/diseasemanage/DiseaseManageController.java
index a6b86579..687bbff6 100644
--- a/virtual-patient-manage/src/main/java/com/supervision/manage/controller/diseasemanage/DiseaseManageController.java
+++ b/virtual-patient-manage/src/main/java/com/supervision/manage/controller/diseasemanage/DiseaseManageController.java
@@ -1,15 +1,19 @@
 package com.supervision.manage.controller.diseasemanage;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.supervision.manage.pojo.vo.UploadDiseaseResVo;
 import com.supervision.manage.service.DiseaseManageService;
+import com.supervision.manage.service.MedicalRecManageService;
 import com.supervision.model.Disease;
 import com.supervision.vo.manage.DiseaseReqVo;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.Parameter;
 import io.swagger.v3.oas.annotations.media.SchemaProperty;
 import io.swagger.v3.oas.annotations.tags.Tag;
+import jakarta.servlet.http.HttpServletResponse;
 import lombok.RequiredArgsConstructor;
 import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
 
 @Tag(name = "疾病管理")
 @RestController
@@ -19,6 +23,7 @@ public class DiseaseManageController {
 
 
     private final DiseaseManageService diseaseManageService;
+    private final MedicalRecManageService medicalRecManageService;
 
 
     @PostMapping("/save")
@@ -56,11 +61,4 @@ public class DiseaseManageController {
 
     }
 
-
-
-
-
-
-
-
 }
diff --git a/virtual-patient-manage/src/main/java/com/supervision/manage/controller/medicalrec/MedicalRecManageController.java b/virtual-patient-manage/src/main/java/com/supervision/manage/controller/medicalrec/MedicalRecManageController.java
index 23d5bed1..e9a1e95b 100644
--- a/virtual-patient-manage/src/main/java/com/supervision/manage/controller/medicalrec/MedicalRecManageController.java
+++ b/virtual-patient-manage/src/main/java/com/supervision/manage/controller/medicalrec/MedicalRecManageController.java
@@ -1,10 +1,7 @@
 package com.supervision.manage.controller.medicalrec;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
-import com.supervision.manage.pojo.vo.MedicalAnswerVideoResVo;
-import com.supervision.manage.pojo.vo.MedicalRecInfoVO;
-import com.supervision.manage.pojo.vo.MedicalRecManageVO;
-import com.supervision.manage.pojo.vo.MedicalRecQaVO;
+import com.supervision.manage.pojo.vo.*;
 import com.supervision.manage.service.MedicalRecManageService;
 import com.supervision.model.Disease;
 import com.supervision.vo.manage.DiseaseAncillaryResVo;
@@ -141,4 +138,30 @@ public class MedicalRecManageController {
     }
 
 
+    @Operation(summary = "下载病例导入模板")
+    @GetMapping("/downloadMedicalTemplate")
+    public void downloadDiseaseTemplate(HttpServletResponse response) throws Exception {
+        medicalRecManageService.downloadMedicalTemplate(response);
+    }
+
+
+    @Operation(summary = "导入病例信息")
+    @PostMapping("/uploadMedical")
+    public UploadDiseaseResVo uploadDisease(@Parameter(name = "file", description = "文件") MultipartFile multipartFile) throws Exception {
+        return medicalRecManageService.uploadMedical(multipartFile);
+    }
+
+
+
+    @Operation(summary = "生成数字人")
+    @PostMapping("/generateDigitalHuman")
+    public UploadDiseaseResVo uploadDisease() throws Exception {
+//        数字人状态才可以生成数字人
+        // 1.判断病例是否存在
+        // 2.判断是否已经创建数字人
+        // 3.创建数字人 :数字人创建返回 sid  绑定sid和病例id
+        // 4.查询数字人生成状态
+        return null;
+    }
+
 }
diff --git a/virtual-patient-manage/src/main/java/com/supervision/manage/enums/DiseasePhysicalEnum.java b/virtual-patient-manage/src/main/java/com/supervision/manage/enums/DiseasePhysicalEnum.java
new file mode 100644
index 00000000..9dd02481
--- /dev/null
+++ b/virtual-patient-manage/src/main/java/com/supervision/manage/enums/DiseasePhysicalEnum.java
@@ -0,0 +1,41 @@
+package com.supervision.manage.enums;
+
+import lombok.Getter;
+
+/**
+ * @Author:longbao
+ * @Date:2024/10/30 10:02
+ * @Description: 体格检查 枚举
+ */
+@Getter
+public enum DiseasePhysicalEnum {
+
+    PRELIMINARY_DIAGNOSTIC_BASIS("初步诊断依据", 1, 0),
+    DIAGNOSTIC_CONFIRMATION_BASIS("证实诊断依据", 1, 0),
+    COMPREHENSIVE_BASIS_FOR_DIAGNOSIS("全面依据", 1, 0),
+    DIFFERENTIAL_DIAGNOSTIC_BASIS("鉴别依据", 1, 0),
+    ;
+
+    private String description;
+    private int yes;
+    private int no;
+
+    DiseasePhysicalEnum(String description, int yes, int no) {
+        this.description = description;
+        this.yes = yes;
+        this.no = no;
+    }
+
+
+    public static int fromCode(String description) {
+        for (DiseasePhysicalEnum status : DiseasePhysicalEnum.values()) {
+            if (status.getDescription().equals(description)) {
+                return status.getYes();
+            } else {
+                return status.getNo();
+            }
+        }
+        throw new IllegalArgumentException("Invalid status code: " + description);
+    }
+
+}
diff --git a/virtual-patient-manage/src/main/java/com/supervision/manage/enums/DiseaseTypeEnum.java b/virtual-patient-manage/src/main/java/com/supervision/manage/enums/DiseaseTypeEnum.java
new file mode 100644
index 00000000..00fe7e17
--- /dev/null
+++ b/virtual-patient-manage/src/main/java/com/supervision/manage/enums/DiseaseTypeEnum.java
@@ -0,0 +1,37 @@
+package com.supervision.manage.enums;
+
+import lombok.Getter;
+
+/**
+ * @Author:longbao
+ * @Date:2024/10/30 10:02
+ * @Description:
+ */
+@Getter
+public enum DiseaseTypeEnum {
+
+    SINGLE_DISEASE("单一疾病", 0),
+    CONFORMING_DISEASE("复合疾病", 1),
+    ;
+
+    private String description;
+    private int code;
+
+    DiseaseTypeEnum(String description, int code) {
+        this.description = description;
+        this.code = code;
+    }
+
+
+    public static DiseaseTypeEnum fromCode(String description) {
+        for (DiseaseTypeEnum status : DiseaseTypeEnum.values()) {
+            if (status.getDescription().equals(description)) {
+                return status;
+            } else {
+                return null;
+            }
+        }
+        throw new IllegalArgumentException("Invalid status code: " + description);
+    }
+
+}
diff --git a/virtual-patient-manage/src/main/java/com/supervision/manage/enums/MedicalStatusEnum.java b/virtual-patient-manage/src/main/java/com/supervision/manage/enums/MedicalStatusEnum.java
new file mode 100644
index 00000000..80b4e0ed
--- /dev/null
+++ b/virtual-patient-manage/src/main/java/com/supervision/manage/enums/MedicalStatusEnum.java
@@ -0,0 +1,27 @@
+package com.supervision.manage.enums;
+
+import lombok.Getter;
+
+/**
+ * @Author:longbao
+ * @Date:2024/11/1 17:44
+ * @Description:
+ */
+@Getter
+public enum MedicalStatusEnum {
+
+    CREATE("病例生成状态","00"),
+    CREATE_MEDICAL("病例生成状态","01"),
+    CREATE_DATA_HUMAN("病例生成状态","02"),
+    CREATE_DATA_HUMAN_OVER("病例生成状态","03"),
+    OVER("病例生成状态","00"),
+    ;
+
+    private String description;
+    private String code;
+
+    MedicalStatusEnum(String description, String code) {
+        this.description = description;
+        this.code = code;
+    }
+}
diff --git a/virtual-patient-manage/src/main/java/com/supervision/manage/enums/MedicalTypeEnum.java b/virtual-patient-manage/src/main/java/com/supervision/manage/enums/MedicalTypeEnum.java
new file mode 100644
index 00000000..891a3ceb
--- /dev/null
+++ b/virtual-patient-manage/src/main/java/com/supervision/manage/enums/MedicalTypeEnum.java
@@ -0,0 +1,24 @@
+package com.supervision.manage.enums;
+
+import lombok.Getter;
+
+/**
+ * @Author:longbao
+ * @Date:2024/11/1 17:44
+ * @Description:
+ */
+@Getter
+public enum MedicalTypeEnum {
+
+    SYSTEM_CREATE("系统创建","00"),
+    TEMPLATE_IMPORT("v3.0病例模板导入","01"),
+    ;
+
+    private String description;
+    private String code;
+
+    MedicalTypeEnum(String description, String code) {
+        this.description = description;
+        this.code = code;
+    }
+}
diff --git a/virtual-patient-manage/src/main/java/com/supervision/manage/enums/VirtualSheetNameEnum.java b/virtual-patient-manage/src/main/java/com/supervision/manage/enums/VirtualSheetNameEnum.java
new file mode 100644
index 00000000..f115373e
--- /dev/null
+++ b/virtual-patient-manage/src/main/java/com/supervision/manage/enums/VirtualSheetNameEnum.java
@@ -0,0 +1,37 @@
+package com.supervision.manage.enums;
+
+import lombok.Getter;
+
+/**
+ * @Author:longbao
+ * @Date:2024/11/1 11:36
+ * @Description: 虚拟病人模板sheet名
+ */
+@Getter
+public enum VirtualSheetNameEnum {
+
+    BASIC_INFO("基本信息"),
+    CLINICAL_INTERVIEW("临床问诊"),
+    PHYSICAL_EXAMINATION("体格检查"),
+    AUXILIARY_EXAMINATION("辅助检查"),
+    TREATMENT_PLAN("处置计划"),
+    SUMMARY_OF_EVALUATION_RESULTS("评估结果概述"),
+    ;
+
+    private String description;
+
+    VirtualSheetNameEnum(String description) {
+        this.description = description;
+    }
+
+    public static String fromCode(String description) {
+        for (VirtualSheetNameEnum status : VirtualSheetNameEnum.values()) {
+            if (status.getDescription().equals(description)) {
+                return status.description;
+            } else {
+                continue;
+            }
+        }
+        throw new IllegalArgumentException("Invalid status code: " + description);
+    }
+}
diff --git a/virtual-patient-manage/src/main/java/com/supervision/manage/pojo/vo/UploadDiseaseResVo.java b/virtual-patient-manage/src/main/java/com/supervision/manage/pojo/vo/UploadDiseaseResVo.java
new file mode 100644
index 00000000..852d47c0
--- /dev/null
+++ b/virtual-patient-manage/src/main/java/com/supervision/manage/pojo/vo/UploadDiseaseResVo.java
@@ -0,0 +1,19 @@
+package com.supervision.manage.pojo.vo;
+
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+@Data
+public class UploadDiseaseResVo {
+
+    @Schema(description = "总数据条数")
+    private int totalCount;
+
+    @Schema(description = "失败数据条数")
+    private int failCount;
+
+    @Schema(description = "文件id")
+    private String fileId;
+
+}
diff --git a/virtual-patient-manage/src/main/java/com/supervision/manage/service/AskTemplateQuestionLibraryManageService.java b/virtual-patient-manage/src/main/java/com/supervision/manage/service/AskTemplateQuestionLibraryManageService.java
new file mode 100644
index 00000000..809bbb0e
--- /dev/null
+++ b/virtual-patient-manage/src/main/java/com/supervision/manage/service/AskTemplateQuestionLibraryManageService.java
@@ -0,0 +1,24 @@
+package com.supervision.manage.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.supervision.dto.ClinicalInterviewDTO;
+import com.supervision.model.AskTemplateQuestionLibrary;
+
+import java.util.List;
+
+/**
+* @author flevance
+* @description 针对表【vp_ask_template_question_library(诊断问询意图问题库)】的数据库操作Service
+* @createDate 2023-11-03 11:13:26
+*/
+public interface AskTemplateQuestionLibraryManageService extends IService<AskTemplateQuestionLibrary> {
+
+
+    public String queryByName(String nameZh);
+
+    /**
+     * 保存问题
+     * @param code
+     */
+    void saveSimilarityQuestion(List<ClinicalInterviewDTO> code);
+}
diff --git a/virtual-patient-manage/src/main/java/com/supervision/manage/service/DiseaseAncillaryManageService.java b/virtual-patient-manage/src/main/java/com/supervision/manage/service/DiseaseAncillaryManageService.java
index 619ff224..f49488bb 100644
--- a/virtual-patient-manage/src/main/java/com/supervision/manage/service/DiseaseAncillaryManageService.java
+++ b/virtual-patient-manage/src/main/java/com/supervision/manage/service/DiseaseAncillaryManageService.java
@@ -1,5 +1,7 @@
 package com.supervision.manage.service;
 
+import com.supervision.dto.SupplementaryTestDto;
+import com.supervision.model.Disease;
 import com.supervision.model.DiseaseAncillary;
 import com.supervision.vo.ask.AncillaryItemReqVo;
 import com.supervision.vo.ask.ConfigAncillaryItemResVO;
@@ -27,4 +29,10 @@ public interface DiseaseAncillaryManageService {
     List<ConfigAncillaryItemResVO> queryAncillaryItemList(AncillaryItemReqVo ancillaryItemReqVo);
 
 
+    /**
+     * 保存辅助检查
+     * @param disease
+     * @param supplementaryTestDtos
+     */
+    void batchSaveAncillaryExaminationList(Disease disease, List<SupplementaryTestDto> supplementaryTestDtos);
 }
diff --git a/virtual-patient-manage/src/main/java/com/supervision/manage/service/DiseasePhysicalManageService.java b/virtual-patient-manage/src/main/java/com/supervision/manage/service/DiseasePhysicalManageService.java
index 6c12b40c..81473658 100644
--- a/virtual-patient-manage/src/main/java/com/supervision/manage/service/DiseasePhysicalManageService.java
+++ b/virtual-patient-manage/src/main/java/com/supervision/manage/service/DiseasePhysicalManageService.java
@@ -1,10 +1,11 @@
 package com.supervision.manage.service;
 
+import com.supervision.dto.UploadPhysicalExaminationDTO;
+import com.supervision.model.Disease;
 import com.supervision.model.DiseasePhysical;
 import com.supervision.vo.manage.DiseasePhysicalLocationNodeVo;
 import com.supervision.vo.manage.DiseasePhysicalResVo;
 import com.supervision.vo.manage.DiseasePhysicalStrResVo;
-import com.supervision.vo.manage.PhysicalLocationNode;
 
 import java.util.List;
 
@@ -28,4 +29,11 @@ public interface DiseasePhysicalManageService {
     boolean deleteByDiseaseId(String diseaseId);
 
     List<DiseasePhysicalLocationNodeVo> queryTree(String diseaseId, String toolId);
+
+    /**
+     * 保存体格检查
+     * @param diseaseList 疾病信息
+     * @param uploadPhysicalExaminationDTOS 体格检查信息
+     */
+    void batchSavePhysicalExaminationList(Disease diseaseList, List<UploadPhysicalExaminationDTO> uploadPhysicalExaminationDTOS);
 }
diff --git a/virtual-patient-manage/src/main/java/com/supervision/manage/service/MedicalRecManageService.java b/virtual-patient-manage/src/main/java/com/supervision/manage/service/MedicalRecManageService.java
index d4b66086..3e2ac6bf 100644
--- a/virtual-patient-manage/src/main/java/com/supervision/manage/service/MedicalRecManageService.java
+++ b/virtual-patient-manage/src/main/java/com/supervision/manage/service/MedicalRecManageService.java
@@ -1,10 +1,7 @@
 package com.supervision.manage.service;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
-import com.supervision.manage.pojo.vo.MedicalAnswerVideoResVo;
-import com.supervision.manage.pojo.vo.MedicalRecInfoVO;
-import com.supervision.manage.pojo.vo.MedicalRecManageVO;
-import com.supervision.manage.pojo.vo.MedicalRecQaVO;
+import com.supervision.manage.pojo.vo.*;
 import com.supervision.model.Disease;
 import com.supervision.vo.manage.DiseaseAncillaryResVo;
 import com.supervision.vo.manage.DiseasePhysicalResVo;
@@ -50,4 +47,10 @@ public interface MedicalRecManageService {
     void downloadMedicalAnswerTemplate(HttpServletResponse response) throws Exception;
 
     Boolean updateMedicalStatus(String medicalRecId, Integer status);
+
+    void downloadMedicalTemplate(HttpServletResponse response) throws Exception;
+
+    UploadDiseaseResVo uploadMedical(MultipartFile multipartFile) throws Exception;
+
+
 }
diff --git a/virtual-patient-manage/src/main/java/com/supervision/manage/service/impl/AskQuestionLibraryManageServiceImpl.java b/virtual-patient-manage/src/main/java/com/supervision/manage/service/impl/AskQuestionLibraryManageServiceImpl.java
index 46dd0180..732e3051 100644
--- a/virtual-patient-manage/src/main/java/com/supervision/manage/service/impl/AskQuestionLibraryManageServiceImpl.java
+++ b/virtual-patient-manage/src/main/java/com/supervision/manage/service/impl/AskQuestionLibraryManageServiceImpl.java
@@ -30,7 +30,6 @@ import jakarta.servlet.ServletOutputStream;
 import jakarta.servlet.http.HttpServletResponse;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
-import org.apache.commons.lang3.StringUtils;
 import org.springframework.core.io.Resource;
 import org.springframework.core.io.ResourceLoader;
 import org.springframework.stereotype.Service;
@@ -197,7 +196,7 @@ public class AskQuestionLibraryManageServiceImpl implements AskQuestionLibraryMa
         log.info("uploadQuestionLibrary : 读取文件耗时:{} s" , timer.intervalSecond());
 
         // 校验模板是否正确
-        assertTitle(reader);
+         assertTitle(reader);
 
         List<UploadQuestionLibraryDTO> uploadQuestionLibraryDTOS = reader.readAll(UploadQuestionLibraryDTO.class);
 
diff --git a/virtual-patient-manage/src/main/java/com/supervision/manage/service/impl/AskTemplateQuestionLibraryManageServiceImpl.java b/virtual-patient-manage/src/main/java/com/supervision/manage/service/impl/AskTemplateQuestionLibraryManageServiceImpl.java
new file mode 100644
index 00000000..d517d2c1
--- /dev/null
+++ b/virtual-patient-manage/src/main/java/com/supervision/manage/service/impl/AskTemplateQuestionLibraryManageServiceImpl.java
@@ -0,0 +1,128 @@
+package com.supervision.manage.service.impl;
+
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.lang.Assert;
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.supervision.dto.ClinicalInterviewDTO;
+import com.supervision.dto.QaKnowledgeDTO;
+import com.supervision.manage.service.AskTemplateQuestionLibraryManageService;
+import com.supervision.manage.service.QaKnowledgeManageService;
+import com.supervision.mapper.AskTemplateQuestionLibraryMapper;
+import com.supervision.model.AskTemplateQuestionLibrary;
+import com.supervision.model.AskTemplateQuestionSimilarity;
+import com.supervision.model.ConfigAncillaryItem;
+import com.supervision.model.ConfigPhysicalTool;
+import com.supervision.service.*;
+import com.supervision.util.RedisSequenceUtil;
+import com.supervision.vo.manage.AskQuestionLibraryReqVo;
+import com.supervision.vo.manage.AskQuestionLibraryResVo;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+
+/**
+ * @author flevance
+ * @description 针对表【vp_ask_template_question_library(诊断问询意图问题库)】的数据库操作Service实现
+ * @createDate 2023-11-03 11:13:26
+ */
+@Slf4j
+@Service
+@RequiredArgsConstructor
+public class AskTemplateQuestionLibraryManageServiceImpl extends ServiceImpl<AskTemplateQuestionLibraryMapper, AskTemplateQuestionLibrary>
+        implements AskTemplateQuestionLibraryManageService {
+
+    private final ConfigPhysicalToolService configPhysicalToolService;
+
+    private final ConfigAncillaryItemService configAncillaryItemService;
+
+    private final AskTemplateQuestionSimilarityService askTemplateQuestionSimilarityService;
+
+    @Autowired
+    private CommonDicService commonDicService;
+
+    private QaKnowledgeManageService qaKnowledgeService;
+
+
+    @Override
+    public String queryByName(String nameZh) {
+        return this.baseMapper.queryByName(nameZh);
+    }
+
+    public String getMaxCode() {
+        AskTemplateQuestionLibrary askTemplateQuestionLibrary = super.getBaseMapper()
+                .selectOne(new QueryWrapper<AskTemplateQuestionLibrary>().select("max(code) as code"));
+        if (Objects.isNull(askTemplateQuestionLibrary)) {
+            return null;
+        }
+        return askTemplateQuestionLibrary.getCode();
+    }
+
+    /**
+     * 模板导入-相似问题
+     *
+     * @param clinicalInterviewDTOS
+     */
+    @Override
+    public void saveSimilarityQuestion(List<ClinicalInterviewDTO> clinicalInterviewDTOS) {
+        // 1.判定条件集合是否存在
+        ArrayList<String> consultationList = new ArrayList();
+        for (ClinicalInterviewDTO clinicalInterviewDTO : clinicalInterviewDTOS) {
+            String consultationI = clinicalInterviewDTO.getConsultationI().trim();
+            String consultationII = clinicalInterviewDTO.getConsultationII().trim();
+            String consultation = "'" + consultationI + "/" + consultationII + "'";
+            consultationList.add(consultation);
+        }
+        Long queryCommonDictTreeByCode = commonDicService.queryCommonDictTreeByCode(consultationList);
+        Assert.isTrue(queryCommonDictTreeByCode != clinicalInterviewDTOS.size(), "请检查临床问诊中的问诊1和2是否存在");
+
+        // 2.插入问题
+        // 标准问题存在:增加问题为相似问题
+        // 标准问题不存在:增加问题为标准问题并更新问题库
+        for (ClinicalInterviewDTO clinicalInterviewDTO : clinicalInterviewDTOS) {
+            String consultationII = clinicalInterviewDTO.getConsultationII().trim();
+            String questionIntentRecognition = clinicalInterviewDTO.getQuestionIntentRecognition();
+            if (StringUtils.isNotEmpty(questionIntentRecognition)) {
+                String libraryId = queryByName(questionIntentRecognition);
+                if (StringUtils.isNotEmpty(libraryId)) {
+                    AskTemplateQuestionSimilarity askTemplateQuestionSimilarity = askTemplateQuestionSimilarityService.querySimilarityQuestionByNameZhAndSimilarityQuestion(consultationII, questionIntentRecognition);
+                    if (null == askTemplateQuestionSimilarity) {
+                        AskTemplateQuestionSimilarity similarity = new AskTemplateQuestionSimilarity();
+                        similarity.setSimilarityQuestion(questionIntentRecognition);
+                        similarity.setLibraryId(libraryId);
+                        askTemplateQuestionSimilarityService.save(similarity);
+                    }
+                } else {
+                    // 获取nexCode  获取的是redis中的问题库
+                    String nextCode = RedisSequenceUtil.getQuestionLibraryCode(() -> {
+                        String maxCode = getMaxCode();
+                        if (StrUtil.isNotEmpty(maxCode)) {
+                            return Long.parseLong(StrUtil.removePrefix(maxCode, "Q"));
+                        }
+                        return null;
+                    });
+                    AskTemplateQuestionLibrary askTemplateQuestionLibrary = new AskTemplateQuestionLibrary();
+                    askTemplateQuestionLibrary.setCode(nextCode);
+                    askTemplateQuestionLibrary.setStandardQuestion(questionIntentRecognition);
+                    save(askTemplateQuestionLibrary);
+                    qaKnowledgeService.saveOrUpdateQuestionLibrary(CollUtil.newArrayList(askTemplateQuestionLibrary.getId()));
+                }
+            }
+
+        }
+    }
+
+}
+
+
+
+
diff --git a/virtual-patient-manage/src/main/java/com/supervision/manage/service/impl/DiseaseAncillaryManageServiceImpl.java b/virtual-patient-manage/src/main/java/com/supervision/manage/service/impl/DiseaseAncillaryManageServiceImpl.java
index e631b2a7..35c6e23b 100644
--- a/virtual-patient-manage/src/main/java/com/supervision/manage/service/impl/DiseaseAncillaryManageServiceImpl.java
+++ b/virtual-patient-manage/src/main/java/com/supervision/manage/service/impl/DiseaseAncillaryManageServiceImpl.java
@@ -5,10 +5,14 @@ import cn.hutool.core.lang.Assert;
 import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.conditions.update.LambdaUpdateChainWrapper;
+import com.supervision.dto.SupplementaryTestDto;
 import com.supervision.manage.service.DiseaseAncillaryManageService;
+import com.supervision.model.ConfigAncillaryItem;
+import com.supervision.model.Disease;
 import com.supervision.model.DiseaseAncillary;
 import com.supervision.service.ConfigAncillaryItemService;
 import com.supervision.service.DiseaseAncillaryService;
+import com.supervision.util.UserUtil;
 import com.supervision.vo.ask.AncillaryItemReqVo;
 import com.supervision.vo.ask.ConfigAncillaryItemResVO;
 import com.supervision.vo.manage.DiseaseAncillaryResVo;
@@ -17,10 +21,13 @@ import com.supervision.vo.result.ConfigAncillaryItemVo;
 import lombok.RequiredArgsConstructor;
 import org.springframework.stereotype.Service;
 
+import java.util.ArrayList;
 import java.util.List;
 import java.util.Objects;
 import java.util.stream.Collectors;
 
+import static cn.hutool.core.lang.Assert.isTrue;
+
 @Service
 @RequiredArgsConstructor
 public class DiseaseAncillaryManageServiceImpl implements DiseaseAncillaryManageService {
@@ -32,7 +39,7 @@ public class DiseaseAncillaryManageServiceImpl implements DiseaseAncillaryManage
     @Override
     public List<DiseaseAncillaryResVo> queryListByDiseaseId(String diseaseId) {
 
-        Assert.isTrue(StrUtil.isNotEmpty(diseaseId),"diseaseId不能为空");
+        Assert.isTrue(StrUtil.isNotEmpty(diseaseId), "diseaseId不能为空");
         List<DiseaseAncillaryResVo> diseaseAncillaryResVos = diseaseAncillaryService.queryListByDiseaseId(diseaseId);
         diseaseAncillaryResVos.forEach(DiseaseAncillaryResVo::populateOther);
         return diseaseAncillaryResVos;
@@ -40,7 +47,7 @@ public class DiseaseAncillaryManageServiceImpl implements DiseaseAncillaryManage
 
     @Override
     public List<DiseaseAncillaryStrResVo> queryListStrByDiseaseId(String diseaseId) {
-        Assert.isTrue(StrUtil.isNotEmpty(diseaseId),"diseaseId不能为空");
+        Assert.isTrue(StrUtil.isNotEmpty(diseaseId), "diseaseId不能为空");
         List<DiseaseAncillaryStrResVo> diseaseAncillaryResVos = diseaseAncillaryService.queryListStrByDiseaseId(diseaseId);
         diseaseAncillaryResVos.forEach(DiseaseAncillaryStrResVo::populateOther);
         return diseaseAncillaryResVos;
@@ -51,7 +58,7 @@ public class DiseaseAncillaryManageServiceImpl implements DiseaseAncillaryManage
 
         assertDiseaseAncillary(diseaseAncillary);
 
-        Assert.isFalse(checkIfPresent(diseaseAncillary),"数据已存在!");
+        Assert.isFalse(checkIfPresent(diseaseAncillary), "数据已存在!");
 
         diseaseAncillaryService.save(diseaseAncillary);
 
@@ -61,7 +68,7 @@ public class DiseaseAncillaryManageServiceImpl implements DiseaseAncillaryManage
     @Override
     public boolean deleteDiseaseAncillary(String id) {
 
-        Assert.isTrue(StrUtil.isNotEmpty(id),"id 不允许为空");
+        Assert.isTrue(StrUtil.isNotEmpty(id), "id 不允许为空");
 
         return diseaseAncillaryService.removeById(id);
     }
@@ -69,14 +76,14 @@ public class DiseaseAncillaryManageServiceImpl implements DiseaseAncillaryManage
     @Override
     public boolean updateAncillary(DiseaseAncillary diseaseAncillary) {
 
-        Assert.isTrue(StrUtil.isNotEmpty(diseaseAncillary.getId()),"id 不允许为空");
+        Assert.isTrue(StrUtil.isNotEmpty(diseaseAncillary.getId()), "id 不允许为空");
 
         return diseaseAncillaryService.updateById(diseaseAncillary);
     }
 
     @Override
     public boolean deleteByDiseaseId(String diseaseId) {
-        Assert.notEmpty(diseaseId,"疾病id不能为空");
+        Assert.notEmpty(diseaseId, "疾病id不能为空");
 
         return diseaseAncillaryService.lambdaUpdate().eq(DiseaseAncillary::getDiseaseId, diseaseId).remove();
     }
@@ -84,17 +91,17 @@ public class DiseaseAncillaryManageServiceImpl implements DiseaseAncillaryManage
     @Override
     public List<ConfigAncillaryItemResVO> queryAncillaryItemList(AncillaryItemReqVo ancillaryItemReqVo) {
         List<ConfigAncillaryItemResVO> configAncillaryItemResVOS = configAncillaryItemService.queryAncillaryItemList(ancillaryItemReqVo);
-        if (CollUtil.isEmpty(configAncillaryItemResVOS) || StrUtil.isEmpty(ancillaryItemReqVo.getDiseaseId())){
+        if (CollUtil.isEmpty(configAncillaryItemResVOS) || StrUtil.isEmpty(ancillaryItemReqVo.getDiseaseId())) {
             return configAncillaryItemResVOS;
         }
 
         List<DiseaseAncillaryResVo> diseaseAncillaryResVos = diseaseAncillaryService.queryListByDiseaseId(ancillaryItemReqVo.getDiseaseId());
-        if (CollUtil.isEmpty(diseaseAncillaryResVos)){
+        if (CollUtil.isEmpty(diseaseAncillaryResVos)) {
             return configAncillaryItemResVOS;
         }
         List<String> itemIds = diseaseAncillaryResVos.stream().map(DiseaseAncillary::getItemId).distinct().collect(Collectors.toList());
         for (ConfigAncillaryItemResVO configAncillaryItemResVO : configAncillaryItemResVOS) {
-            if (CollUtil.isEmpty(configAncillaryItemResVO.getItemList())){
+            if (CollUtil.isEmpty(configAncillaryItemResVO.getItemList())) {
                 continue;
             }
             for (ConfigAncillaryItemVo itemVo : configAncillaryItemResVO.getItemList()) {
@@ -106,42 +113,96 @@ public class DiseaseAncillaryManageServiceImpl implements DiseaseAncillaryManage
     }
 
 
-    private void assertDiseaseAncillary(DiseaseAncillary diseaseAncillary){
+    private void assertDiseaseAncillary(DiseaseAncillary diseaseAncillary) {
 
-        Assert.isNull(diseaseAncillary.getId(),"id不为空");
+        Assert.isNull(diseaseAncillary.getId(), "id不为空");
 
-        Assert.isTrue(StrUtil.isNotEmpty(diseaseAncillary.getDiseaseId()),"疾病id不能为空");
+        Assert.isTrue(StrUtil.isNotEmpty(diseaseAncillary.getDiseaseId()), "疾病id不能为空");
 
-        Assert.notNull(diseaseAncillary.getPrimarilyDiagnosisCriteriaFlag(),"初步诊断依据不能为空");
+        Assert.notNull(diseaseAncillary.getPrimarilyDiagnosisCriteriaFlag(), "初步诊断依据不能为空");
 
-        Assert.notNull(diseaseAncillary.getBasisConfirmFlag(),"证实诊断依据不能为空");
+        Assert.notNull(diseaseAncillary.getBasisConfirmFlag(), "证实诊断依据不能为空");
 
-        Assert.notNull(diseaseAncillary.getBasisIdentificationFlag(),"鉴别诊断依据不能为空");
+        Assert.notNull(diseaseAncillary.getBasisIdentificationFlag(), "鉴别诊断依据不能为空");
 
-        Assert.notNull(diseaseAncillary.getFullCheckFlag(),"全面诊断不能为空");
+        Assert.notNull(diseaseAncillary.getFullCheckFlag(), "全面诊断不能为空");
 
-        Assert.notNull(diseaseAncillary.getDiagnosisAssessmentFlag(),"判断不能为空");
+        Assert.notNull(diseaseAncillary.getDiagnosisAssessmentFlag(), "判断不能为空");
 
-        Assert.notNull(diseaseAncillary.getRequireCheckFlag(),"是否必查不能为空");
+        Assert.notNull(diseaseAncillary.getRequireCheckFlag(), "是否必查不能为空");
 
-        Assert.notNull(diseaseAncillary.getDiagnosisAssessmentFlag(),"判断不能为空");
+        Assert.notNull(diseaseAncillary.getDiagnosisAssessmentFlag(), "判断不能为空");
 
-        Assert.notNull(diseaseAncillary.getExpectedDiagnosisResult(),"预期诊断结果不能为空");
+        Assert.notNull(diseaseAncillary.getExpectedDiagnosisResult(), "预期诊断结果不能为空");
 
     }
 
 
-    private boolean checkIfPresent(DiseaseAncillary diseaseAncillary){
+    private boolean checkIfPresent(DiseaseAncillary diseaseAncillary) {
 
         return !Objects.isNull(findByDiseaseIdAndItemId(diseaseAncillary.getDiseaseId(), diseaseAncillary.getItemId()));
     }
 
 
-    private DiseaseAncillary findByDiseaseIdAndItemId(String diseaseId,String itemId){
+    private DiseaseAncillary findByDiseaseIdAndItemId(String diseaseId, String itemId) {
         List<DiseaseAncillary> list = diseaseAncillaryService.lambdaQuery().eq(DiseaseAncillary::getDiseaseId, diseaseId).eq(DiseaseAncillary::getItemId, itemId).list();
-        if (CollUtil.isEmpty(list)){
+        if (CollUtil.isEmpty(list)) {
             return null;
         }
         return list.get(0);
     }
+
+
+    /**
+     * 保存辅助检查
+     *
+     * @param disease
+     * @param supplementaryTestDtos
+     */
+    @Override
+    public void batchSaveAncillaryExaminationList(Disease disease, List<SupplementaryTestDto> supplementaryTestDtos) {
+        List<DiseaseAncillary> diseaseAncillaries = new ArrayList<>();
+        for (SupplementaryTestDto supplementaryTestDto : supplementaryTestDtos) {
+
+            String firstLevelCategory = supplementaryTestDto.getFirstLevelCategory();
+            String secondLevelCategory = supplementaryTestDto.getSecondLevelCategory();
+            int preliminaryDiagnosisBasis = supplementaryTestDto.getPreliminaryDiagnosisBasis().equals("否") ? 0 : 1;
+            int confirmedDiagnosisBasis = supplementaryTestDto.getConfirmedDiagnosisBasis().equals("否") ? 0 : 1;
+            int differentialDiagnosisBasis = supplementaryTestDto.getDifferentialDiagnosisBasis().equals("否") ? 0 : 1;
+            int status = supplementaryTestDto.getStatus().equals("正常") ? 0 : 1;
+            int isRequiredCheck = supplementaryTestDto.getIsRequiredCheck().equals("否") ? 0 : 1;
+            String normalTestResult = supplementaryTestDto.getNormalTestResult();
+            String patientTestResult = supplementaryTestDto.getPatientTestResult();
+
+            ConfigAncillaryItem configAncillaryItem = configAncillaryItemService.queryAncillaryItem(firstLevelCategory, secondLevelCategory);
+
+            Assert.isTrue((null != configAncillaryItem), "辅助检查工具未找到:{}", secondLevelCategory);
+
+            DiseaseAncillary diseaseAncillary = new DiseaseAncillary();
+            diseaseAncillary.setDiseaseId(disease.getId());
+            // 工具id
+            diseaseAncillary.setItemId(configAncillaryItem.getId());
+            // 初步诊断依据
+            diseaseAncillary.setPrimarilyDiagnosisCriteriaFlag(preliminaryDiagnosisBasis);
+
+            // 证实诊断依据
+            diseaseAncillary.setBasisConfirmFlag(confirmedDiagnosisBasis);
+
+            //鉴别依据
+            diseaseAncillary.setBasisIdentificationFlag(differentialDiagnosisBasis);
+
+            diseaseAncillary.setExpectedDiagnosisResult(status);
+
+            diseaseAncillary.setRequireCheckFlag(isRequiredCheck);
+
+            diseaseAncillary.setNormalResult(normalTestResult);
+
+            diseaseAncillary.setResult(patientTestResult);
+
+            diseaseAncillary.setCreateUserId(UserUtil.getUser().getCreateUserId());
+            diseaseAncillary.setUpdateUserId(UserUtil.getUser().getCreateUserId());
+            diseaseAncillaries.add(diseaseAncillary);
+        }
+        diseaseAncillaryService.saveBatch(diseaseAncillaries);
+    }
 }
diff --git a/virtual-patient-manage/src/main/java/com/supervision/manage/service/impl/DiseaseManageServiceImpl.java b/virtual-patient-manage/src/main/java/com/supervision/manage/service/impl/DiseaseManageServiceImpl.java
index 0b4f450a..f97957b1 100644
--- a/virtual-patient-manage/src/main/java/com/supervision/manage/service/impl/DiseaseManageServiceImpl.java
+++ b/virtual-patient-manage/src/main/java/com/supervision/manage/service/impl/DiseaseManageServiceImpl.java
@@ -16,15 +16,14 @@ import com.supervision.util.RedisSequenceUtil;
 import com.supervision.vo.manage.DiseaseReqVo;
 import com.supervision.vo.manage.DiseaseResVo;
 import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
+import java.util.*;
 import java.util.stream.Collectors;
 
+@Slf4j
 @Service
 @RequiredArgsConstructor
 public class DiseaseManageServiceImpl implements DiseaseManageService {
@@ -46,10 +45,10 @@ public class DiseaseManageServiceImpl implements DiseaseManageService {
         assertDisease(disease);
 
         // 如果包含疾病id不为空,则为复合疾病
-        if (CollUtil.isNotEmpty(disease.getContainDiseaseIds())){
+        if (CollUtil.isNotEmpty(disease.getContainDiseaseIds())) {
             disease.setDiseaseType(1);
         }
-        if (StrUtil.isEmpty(disease.getCode())){
+        if (StrUtil.isEmpty(disease.getCode())) {
             disease.setCode(RedisSequenceUtil.getComplexDiseaseNo());
         }
         disease.setStatus(0);
@@ -62,7 +61,7 @@ public class DiseaseManageServiceImpl implements DiseaseManageService {
     @Override
     public boolean updateDisease(Disease disease) {
 
-        Assert.isTrue(StrUtil.isNotEmpty(disease.getId()),"id is not allow empty");
+        Assert.isTrue(StrUtil.isNotEmpty(disease.getId()), "id is not allow empty");
 
         return diseaseService.updateById(disease);
 
@@ -73,10 +72,10 @@ public class DiseaseManageServiceImpl implements DiseaseManageService {
     public boolean deleteDisease(String id) {
 
         Disease disease = diseaseService.getById(id);
-        if (Objects.isNull(disease)){
+        if (Objects.isNull(disease)) {
             return true;
         }
-        Assert.isFalse(disease.getDiseaseType()==0,"单一疾病不允许被删除");
+        Assert.isFalse(disease.getDiseaseType() == 0, "单一疾病不允许被删除");
         assertDiseaseIsUsed(id);
         // 1. 删除疾病信息
         diseaseService.removeById(id);
@@ -117,15 +116,15 @@ public class DiseaseManageServiceImpl implements DiseaseManageService {
                 .filter(disease -> CollUtil.isNotEmpty(disease.getContainDiseaseIds()))
                 .flatMap(disease -> disease.getContainDiseaseIds().stream()).distinct().collect(Collectors.toList());
         Map<String, Disease> diseaseMap = new HashMap<>();
-        if (CollUtil.isNotEmpty(containDiseaseIds)){
+        if (CollUtil.isNotEmpty(containDiseaseIds)) {
             diseaseMap = diseaseService.listByIds(containDiseaseIds)
                     .stream().collect(Collectors.toMap(Disease::getId, disease -> disease, (v1, v2) -> v1));
         }
-      final Map<String, Disease> diseaseMapCopy = new HashMap<>(diseaseMap);
+        final Map<String, Disease> diseaseMapCopy = new HashMap<>(diseaseMap);
         // 把疾病名映射到DiseaseResVo中
         return page.convert(record -> {
             DiseaseResVo bean = BeanUtil.toBean(record, DiseaseResVo.class);
-            if (CollUtil.isNotEmpty(bean.getContainDiseaseIds())){
+            if (CollUtil.isNotEmpty(bean.getContainDiseaseIds())) {
                 bean.setContainDiseaseNames(bean.getContainDiseaseIds().stream()
                         .map(diseaseMapCopy::get).filter(Objects::nonNull).map(Disease::getDiseaseName).collect(Collectors.toList()));
             }
@@ -135,33 +134,33 @@ public class DiseaseManageServiceImpl implements DiseaseManageService {
     }
 
 
+    private List<Disease> queryByAnyCondition(String code, String diseaseName, String diseaseNameAlias) {
 
-    private List<Disease> queryByAnyCondition(String code, String diseaseName, String diseaseNameAlias){
-
-        return diseaseService.lambdaQuery().eq(StrUtil.isNotEmpty(code),Disease::getCode,code).or()
-                .eq(StrUtil.isNotEmpty(diseaseName), Disease::getDiseaseName,diseaseName).or()
-                .eq(StrUtil.isNotEmpty(diseaseNameAlias),Disease::getDiseaseNameAlias,diseaseNameAlias)
+        return diseaseService.lambdaQuery().eq(StrUtil.isNotEmpty(code), Disease::getCode, code).or()
+                .eq(StrUtil.isNotEmpty(diseaseName), Disease::getDiseaseName, diseaseName).or()
+                .eq(StrUtil.isNotEmpty(diseaseNameAlias), Disease::getDiseaseNameAlias, diseaseNameAlias)
                 .list();
 
     }
-    private List<Disease> queryByCode(String code){
-        if (Objects.isNull(code)){
+
+    private List<Disease> queryByCode(String code) {
+        if (Objects.isNull(code)) {
             throw new BusinessException("code is not allow empty");
         }
-        return diseaseService.lambdaQuery().eq(Disease::getCode,code).list();
+        return diseaseService.lambdaQuery().eq(Disease::getCode, code).list();
     }
 
-    private void assertDisease(Disease disease){
+    private void assertDisease(Disease disease) {
 
-        Assert.isNull(disease.getId(),"id 不为空");
+        Assert.isNull(disease.getId(), "id 不为空");
 
-        Assert.isTrue(StrUtil.isNotEmpty(disease.getDiseaseName()),"疾病名称不能为空");
+        Assert.isTrue(StrUtil.isNotEmpty(disease.getDiseaseName()), "疾病名称不能为空");
 
-        Assert.isTrue(StrUtil.isNotEmpty(disease.getDiseaseNameAlias()),"疾病别名不能为空");
+        Assert.isTrue(StrUtil.isNotEmpty(disease.getDiseaseNameAlias()), "疾病别名不能为空");
 
-        if (CollUtil.isEmpty(disease.getContainDiseaseIds())){
+        if (CollUtil.isEmpty(disease.getContainDiseaseIds())) {
             // 如果包含疾病为空,则疾病code不能为空
-            Assert.isTrue(StrUtil.isNotEmpty(disease.getCode()),"疾病编码不能为空");
+            Assert.isTrue(StrUtil.isNotEmpty(disease.getCode()), "疾病编码不能为空");
         }
 
 
@@ -169,11 +168,12 @@ public class DiseaseManageServiceImpl implements DiseaseManageService {
 
     /**
      * 校验疾病是否被使用
+     *
      * @param diseaseId 疾病id
      */
-    private void assertDiseaseIsUsed(String diseaseId){
+    private void assertDiseaseIsUsed(String diseaseId) {
         boolean isUsedMedicalRec = medicalRecService.lambdaQuery().eq(MedicalRec::getDiseaseId, diseaseId).count() > 0;
-        Assert.isFalse(isUsedMedicalRec,"疾病已经关联病例,不允许删除");
+        Assert.isFalse(isUsedMedicalRec, "疾病已经关联病例,不允许删除");
     }
 
 }
diff --git a/virtual-patient-manage/src/main/java/com/supervision/manage/service/impl/DiseasePhysicalManageServiceImpl.java b/virtual-patient-manage/src/main/java/com/supervision/manage/service/impl/DiseasePhysicalManageServiceImpl.java
index d18ee472..d56bdec4 100644
--- a/virtual-patient-manage/src/main/java/com/supervision/manage/service/impl/DiseasePhysicalManageServiceImpl.java
+++ b/virtual-patient-manage/src/main/java/com/supervision/manage/service/impl/DiseasePhysicalManageServiceImpl.java
@@ -4,26 +4,29 @@ import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.lang.Assert;
 import cn.hutool.core.util.StrUtil;
+import com.supervision.dto.UploadPhysicalExaminationDTO;
+import com.supervision.manage.enums.DiseasePhysicalEnum;
 import com.supervision.manage.service.DiseasePhysicalManageService;
 import com.supervision.manage.service.PhysicalLocationManageService;
-import com.supervision.model.ConfigPhysicalLocation;
-import com.supervision.model.DefaultPhysicalIndicator;
-import com.supervision.model.DiseasePhysical;
+import com.supervision.model.*;
 import com.supervision.service.ConfigPhysicalLocationService;
+import com.supervision.service.ConfigPhysicalToolService;
 import com.supervision.service.DefaultPhysicalIndicatorService;
 import com.supervision.service.DiseasePhysicalService;
+import com.supervision.util.UserUtil;
 import com.supervision.vo.manage.DiseasePhysicalLocationNodeVo;
 import com.supervision.vo.manage.DiseasePhysicalResVo;
 import com.supervision.vo.manage.DiseasePhysicalStrResVo;
 import com.supervision.vo.manage.PhysicalLocationNode;
 import lombok.RequiredArgsConstructor;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.stereotype.Service;
 
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
+import java.util.*;
 import java.util.stream.Collectors;
 
+import static cn.hutool.core.lang.Assert.*;
+
 @Service
 @RequiredArgsConstructor
 public class DiseasePhysicalManageServiceImpl implements DiseasePhysicalManageService {
@@ -34,13 +37,15 @@ public class DiseasePhysicalManageServiceImpl implements DiseasePhysicalManageSe
 
     private final ConfigPhysicalLocationService configPhysicalLocationService;
 
+    private final ConfigPhysicalToolService configPhysicalToolService;
+
     private final DefaultPhysicalIndicatorService defaultPhysicalIndicatorService;
 
 
     @Override
     public List<DiseasePhysicalResVo> queryListByDiseaseId(String diseaseId) {
 
-        Assert.isTrue(StrUtil.isNotEmpty(diseaseId),"id不能为空");
+        isTrue(StrUtil.isNotEmpty(diseaseId), "id不能为空");
         List<DiseasePhysicalResVo> diseasePhysicalResVos = diseasePhysicalService.queryListByDiseaseId(diseaseId);
 
         diseasePhysicalResVos.forEach(DiseasePhysicalResVo::populateOther);
@@ -50,7 +55,7 @@ public class DiseasePhysicalManageServiceImpl implements DiseasePhysicalManageSe
     @Override
     public List<DiseasePhysicalStrResVo> queryListToStringByDiseaseId(String diseaseId) {
 
-        Assert.isTrue(StrUtil.isNotEmpty(diseaseId),"id不能为空");
+        isTrue(StrUtil.isNotEmpty(diseaseId), "id不能为空");
         List<DiseasePhysicalStrResVo> diseasePhysicalResVos = diseasePhysicalService.queryListStrByDiseaseId(diseaseId);
 
         diseasePhysicalResVos.forEach(DiseasePhysicalStrResVo::populateOther);
@@ -69,14 +74,14 @@ public class DiseasePhysicalManageServiceImpl implements DiseasePhysicalManageSe
 
     @Override
     public boolean deletePhysical(String id) {
-        Assert.isTrue(StrUtil.isNotEmpty(id),"id不能为空");
+        isTrue(StrUtil.isNotEmpty(id), "id不能为空");
 
         return diseasePhysicalService.removeById(id);
     }
 
     @Override
     public boolean updatePhysical(DiseasePhysical diseasePhysical) {
-        Assert.isTrue(StrUtil.isNotEmpty(diseasePhysical.getDiseaseId()),"疾病id不能为空");
+        isTrue(StrUtil.isNotEmpty(diseasePhysical.getDiseaseId()), "疾病id不能为空");
 
         return diseasePhysicalService.updateById(diseasePhysical);
     }
@@ -84,8 +89,8 @@ public class DiseasePhysicalManageServiceImpl implements DiseasePhysicalManageSe
     @Override
     public boolean deleteByDiseaseId(String diseaseId) {
 
-        Assert.notEmpty(diseaseId,"疾病id不能为空");
-        return diseasePhysicalService.lambdaUpdate().eq(DiseasePhysical::getDiseaseId,diseaseId).remove();
+        notEmpty(diseaseId, "疾病id不能为空");
+        return diseasePhysicalService.lambdaUpdate().eq(DiseasePhysical::getDiseaseId, diseaseId).remove();
     }
 
     @Override
@@ -93,7 +98,7 @@ public class DiseasePhysicalManageServiceImpl implements DiseasePhysicalManageSe
 
         // 1. 查询体格检查位置树
         List<PhysicalLocationNode> physicalLocationNodes = physicalToolManageService.queryTree();
-        if (CollectionUtil.isEmpty(physicalLocationNodes)){
+        if (CollectionUtil.isEmpty(physicalLocationNodes)) {
             return CollectionUtil.newArrayList();
         }
 
@@ -101,23 +106,23 @@ public class DiseasePhysicalManageServiceImpl implements DiseasePhysicalManageSe
         physicalLocationNode.setChild(physicalLocationNodes);
         DiseasePhysicalLocationNodeVo bean = BeanUtil.toBean(physicalLocationNode, DiseasePhysicalLocationNodeVo.class);
 
-        if (StrUtil.isEmpty(toolId)){
+        if (StrUtil.isEmpty(toolId)) {
             // 工具id为空,全部设置为禁用标识
-            bean.getChild().forEach(vo->vo.setFlag(true));
+            bean.getChild().forEach(vo -> vo.setFlag(true));
             return bean.getChild();
         }
 
         // 在体格检查配置身体位置时,只能配置一级部位,此时默认下级的部位也已经被配置。如果工具没有设置,应该子节点设置为禁用
         List<DefaultPhysicalIndicator> defaultPhysicalIndicatorList = defaultPhysicalIndicatorService.lambdaQuery().eq(DefaultPhysicalIndicator::getItemId, toolId).list();
-        if (CollectionUtil.isEmpty(defaultPhysicalIndicatorList)){
+        if (CollectionUtil.isEmpty(defaultPhysicalIndicatorList)) {
             // 如果未配置,所有子节点设置为禁用
-            bean.getChild().forEach(vo->vo.setFlag(true));
+            bean.getChild().forEach(vo -> vo.setFlag(true));
             return bean.getChild();
         }
 
         // 2. 根据疾病id查询疾病体格检查项
         List<DiseasePhysicalResVo> diseasePhysicalResVos = diseasePhysicalService.queryListByDiseaseId(diseaseId);
-        List<String> locationIds = diseasePhysicalResVos.stream().filter(vo->toolId.equals(vo.getToolId()))
+        List<String> locationIds = diseasePhysicalResVos.stream().filter(vo -> toolId.equals(vo.getToolId()))
                 .map(DiseasePhysical::getLocationId).filter(Objects::nonNull).distinct().collect(Collectors.toList());
 
         // 3. 填充疾病体格检查树中的flag属性
@@ -151,22 +156,71 @@ public class DiseasePhysicalManageServiceImpl implements DiseasePhysicalManageSe
         return bean.getChild();
     }
 
-    private void assertDiseasePhysical(DiseasePhysical diseasePhysical){
+    private void assertDiseasePhysical(DiseasePhysical diseasePhysical) {
 
-        Assert.isTrue(StrUtil.isNotEmpty(diseasePhysical.getDiseaseId()),"疾病id不能为空");
+        isTrue(StrUtil.isNotEmpty(diseasePhysical.getDiseaseId()), "疾病id不能为空");
 
-        Assert.notNull(diseasePhysical.getPrimarilyDiagnosisCriteriaFlag(),"初步诊断依据不能为空");
+        notNull(diseasePhysical.getPrimarilyDiagnosisCriteriaFlag(), "初步诊断依据不能为空");
 
-        Assert.notNull(diseasePhysical.getBasisConfirmFlag(),"证实诊断依据不能为空");
+        notNull(diseasePhysical.getBasisConfirmFlag(), "证实诊断依据不能为空");
 
-        Assert.notNull(diseasePhysical.getBasisIdentificationFlag(),"鉴别诊断依据不能为空");
+        notNull(diseasePhysical.getBasisIdentificationFlag(), "鉴别诊断依据不能为空");
 
-        Assert.notNull(diseasePhysical.getFullCheckFlag(),"全面诊断不能为空");
+        notNull(diseasePhysical.getFullCheckFlag(), "全面诊断不能为空");
 
-        Assert.notNull(diseasePhysical.getRequireCheckFlag(),"是否必查不能为空");
+        notNull(diseasePhysical.getRequireCheckFlag(), "是否必查不能为空");
 
-        Assert.notNull(diseasePhysical.getExpectedDiagnosisResult(),"预期诊断结果不能为空");
+        notNull(diseasePhysical.getExpectedDiagnosisResult(), "预期诊断结果不能为空");
 
     }
 
+
+    @Override
+    public void batchSavePhysicalExaminationList(Disease diseaseId, List<UploadPhysicalExaminationDTO> uploadPhysicalExaminationDTOS) {
+        List<DiseasePhysical> diseasePhysicals = new ArrayList<>();
+
+        for (UploadPhysicalExaminationDTO uploadDiseaseDTO : uploadPhysicalExaminationDTOS) {
+            String iLevelClassification = uploadDiseaseDTO.getILevelClassification();
+            String iiLevelClassification = uploadDiseaseDTO.getIiLevelClassification();
+            String humanBodyPartIi = uploadDiseaseDTO.getHumanBodyPartIi();
+            String normalExamResult = uploadDiseaseDTO.getNormalExamResult();
+            String patientExamResult = uploadDiseaseDTO.getPatientExamResult();
+            Integer status = uploadDiseaseDTO.getStatus().equals("正常") ? 0 : 1;
+            Integer preliminaryDiagnosisBasis = uploadDiseaseDTO.getPreliminaryDiagnosisBasis().equals("否") ? 0 : 1;
+            Integer confirmedDiagnosisBasis = uploadDiseaseDTO.getConfirmedDiagnosisBasis().equals("否") ? 0 : 1;
+            Integer differentialDiagnosisBasis = uploadDiseaseDTO.getDifferentialDiagnosisBasis().equals("否") ? 0 : 1;
+            Integer isNecessaryExamDefaultYes = uploadDiseaseDTO.getIsNecessaryExamDefaultYes().equals("否") ? 0 : 1;
+            // 查询工具和位置
+            ConfigPhysicalTool configPhysicalTool = configPhysicalToolService.queryPhysicalToolByTypeAndToolName(iLevelClassification, iiLevelClassification);
+            ConfigPhysicalLocation configPhysicalLocation = configPhysicalLocationService.queryLocationTreeForLocationName(humanBodyPartIi, "1");
+
+            Assert.isTrue((null != configPhysicalTool), "体格检查工具未找到:{}", iiLevelClassification);
+            Assert.isTrue((null != configPhysicalLocation), "体格检查位置未找到:{}", humanBodyPartIi);
+
+            DiseasePhysical diseasePhysical = new DiseasePhysicalResVo();
+            diseasePhysical.setDiseaseId(diseaseId.getId());
+            // 工具id
+            diseasePhysical.setToolId(configPhysicalTool.getId());
+            // 检查部位ID
+            diseasePhysical.setLocationId(configPhysicalLocation.getId());
+            // 正常結果
+            diseasePhysical.setNormalResult(normalExamResult);
+            // 一場結果
+            diseasePhysical.setResult(patientExamResult);
+            // 预期结果
+            diseasePhysical.setExpectedDiagnosisResult(status);
+            // 初步
+            diseasePhysical.setPrimarilyDiagnosisCriteriaFlag(preliminaryDiagnosisBasis);
+            // 证实
+            diseasePhysical.setBasisConfirmFlag(confirmedDiagnosisBasis);
+            // 鉴别
+            diseasePhysical.setBasisIdentificationFlag(differentialDiagnosisBasis);
+            // 是否必查
+            diseasePhysical.setRequireCheckFlag(isNecessaryExamDefaultYes);
+            diseasePhysical.setCreateUserId(UserUtil.getUser().getCreateUserId());
+            diseasePhysical.setUpdateUserId(UserUtil.getUser().getCreateUserId());
+            diseasePhysicals.add(diseasePhysical);
+        }
+        diseasePhysicalService.saveBatch(diseasePhysicals);
+    }
 }
diff --git a/virtual-patient-manage/src/main/java/com/supervision/manage/service/impl/FileManageServiceImpl.java b/virtual-patient-manage/src/main/java/com/supervision/manage/service/impl/FileManageServiceImpl.java
index 8fb08cdb..213a9ab1 100644
--- a/virtual-patient-manage/src/main/java/com/supervision/manage/service/impl/FileManageServiceImpl.java
+++ b/virtual-patient-manage/src/main/java/com/supervision/manage/service/impl/FileManageServiceImpl.java
@@ -28,6 +28,7 @@ import java.util.Objects;
 public class FileManageServiceImpl implements FileManageService {
 
     private final FileResourceService fileResourceService;
+
     @Override
     public FileResource uploadFile(MultipartFile multipartFile, String contentType) throws Exception {
         // 把文件上传到minio
@@ -60,7 +61,7 @@ public class FileManageServiceImpl implements FileManageService {
 
         // 把文件上传到minio
         FileResource fileResource = new FileResource();
-        try (BufferedInputStream inputStream = FileUtil.getInputStream(file)){
+        try (BufferedInputStream inputStream = FileUtil.getInputStream(file)) {
             String minoId = MinioUtil.uploadFile(inputStream);
             fileResource.setMinioId(minoId);
         }
@@ -71,6 +72,7 @@ public class FileManageServiceImpl implements FileManageService {
         fileResourceService.save(fileResource);
         return fileResource;
     }
+
     @Override
     public void downloadFile(String fileId, HttpServletResponse response) throws Exception {
         Assert.notEmpty(fileId, "文件id不能为空");
@@ -79,24 +81,24 @@ public class FileManageServiceImpl implements FileManageService {
         Assert.notNull(fileResource, "文件不存在");
 
         try (InputStream inputStream = MinioUtil.download(fileResource.getMinioId());
-             ServletOutputStream outputStream = response.getOutputStream()){
+             ServletOutputStream outputStream = response.getOutputStream()) {
             String contentType = StrUtil.isEmpty(fileResource.getFileType()) ? "application/octet-stream" : fileResource.getFileType();
             response.setContentType(contentType);
 
-            if (StrUtil.isNotEmpty(fileResource.getFileName())){
+            if (StrUtil.isNotEmpty(fileResource.getFileName())) {
                 response.setHeader("Content-Disposition", "attachment;filename=" +
                         URLEncoder.encode(fileResource.getFileName(), "UTF-8"));
             }
 
             byte[] bytes = new byte[1024];
             int len;
-            while ((len = inputStream.read(bytes))!= -1){
+            while ((len = inputStream.read(bytes)) != -1) {
                 outputStream.write(bytes, 0, len);
             }
             outputStream.flush();
-        }catch (Exception e){
-            log.error("文件下载失败",e);
-            throw new BusinessException("下载文件失败",e);
+        } catch (Exception e) {
+            log.error("文件下载失败", e);
+            throw new BusinessException("下载文件失败", e);
         }
     }
 
@@ -106,17 +108,17 @@ public class FileManageServiceImpl implements FileManageService {
         Assert.notEmpty(fileId, "fileId不能为空");
 
         FileResource fileResource = fileResourceService.getById(fileId);
-        Assert.notNull(fileResource,"文件不存在");
+        Assert.notNull(fileResource, "文件不存在");
         String prefix = null;
         String suffix = null;
-        if (StrUtil.isNotEmpty(fileResource.getFileName())){
+        if (StrUtil.isNotEmpty(fileResource.getFileName())) {
             List<String> split = StrUtil.split(fileResource.getFileName(), ".");
             prefix = CollUtil.getFirst(split);
-            if (CollUtil.size(split) > 1){
+            if (CollUtil.size(split) > 1) {
                 suffix = "." + split.get(1);
             }
         }
-        File tempFile = StrUtil.isEmpty(prefix) ? FileUtil.createTempFile() : FileUtil.createTempFile(prefix,suffix,true);
+        File tempFile = StrUtil.isEmpty(prefix) ? FileUtil.createTempFile() : FileUtil.createTempFile(prefix, suffix, true);
         try (InputStream inputStream = MinioUtil.download(fileResource.getMinioId());
              FileOutputStream fileOutputStream = new FileOutputStream(tempFile)) {
             byte[] bytes = new byte[1024];
@@ -125,12 +127,12 @@ public class FileManageServiceImpl implements FileManageService {
                 fileOutputStream.write(bytes, 0, len);
             }
             fileOutputStream.flush();
-        }catch (Exception e){
-            if (tempFile.exists()){
+        } catch (Exception e) {
+            if (tempFile.exists()) {
                 tempFile.delete();
             }
-            log.error("文件下载失败",e);
-            throw new BusinessException("文件下载失败",e);
+            log.error("文件下载失败", e);
+            throw new BusinessException("文件下载失败", e);
         }
         return tempFile;
     }
@@ -140,12 +142,12 @@ public class FileManageServiceImpl implements FileManageService {
         Assert.notEmpty(fileId, "文件id不能为空");
 
         FileResource fileResource = fileResourceService.getById(fileId);
-        if (Objects.isNull(fileResource)){
-            log.info("deleteFile: fileId:{} 未找到数据",fileId);
+        if (Objects.isNull(fileResource)) {
+            log.info("deleteFile: fileId:{} 未找到数据", fileId);
             return false;
         }
-        if (StrUtil.isNotEmpty(fileResource.getMinioId())){
-            log.info("deleteFile:删除minio中的数据.minioId:{}",fileResource.getMinioId());
+        if (StrUtil.isNotEmpty(fileResource.getMinioId())) {
+            log.info("deleteFile:删除minio中的数据.minioId:{}", fileResource.getMinioId());
             MinioUtil.deleteObject(fileResource.getMinioId());
         }
         return fileResourceService.removeById(fileId);
diff --git a/virtual-patient-manage/src/main/java/com/supervision/manage/service/impl/MedicalRecManageServiceImpl.java b/virtual-patient-manage/src/main/java/com/supervision/manage/service/impl/MedicalRecManageServiceImpl.java
index 7a07fb6d..3662c8aa 100644
--- a/virtual-patient-manage/src/main/java/com/supervision/manage/service/impl/MedicalRecManageServiceImpl.java
+++ b/virtual-patient-manage/src/main/java/com/supervision/manage/service/impl/MedicalRecManageServiceImpl.java
@@ -2,31 +2,41 @@ package com.supervision.manage.service.impl;
 
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.date.TimeInterval;
 import cn.hutool.core.io.IoUtil;
 import cn.hutool.core.lang.Assert;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
+import cn.hutool.poi.excel.ExcelReader;
+import cn.hutool.poi.excel.ExcelUtil;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.supervision.dto.*;
 import com.supervision.exception.BusinessException;
-import com.supervision.manage.pojo.vo.MedicalAnswerVideoResVo;
-import com.supervision.manage.pojo.vo.MedicalRecInfoVO;
-import com.supervision.manage.pojo.vo.MedicalRecManageVO;
-import com.supervision.manage.pojo.vo.MedicalRecQaVO;
+import com.supervision.manage.pojo.vo.*;
 import com.supervision.manage.service.*;
+import com.supervision.manage.enums.*;
+import com.supervision.manage.service.AskTemplateQuestionLibraryManageService;
 import com.supervision.model.*;
 import com.supervision.model.Process;
 import com.supervision.service.*;
+import com.supervision.service.MedicalRecService;
+import com.supervision.util.UserUtil;
 import com.supervision.vo.manage.*;
 import jakarta.servlet.ServletOutputStream;
 import jakarta.servlet.http.HttpServletResponse;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.poi.ss.usermodel.Sheet;
 import org.springframework.core.io.Resource;
 import org.springframework.core.io.ResourceLoader;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.multipart.MultipartFile;
 
+
+import java.io.InputStream;
 import java.net.URLEncoder;
 import java.util.*;
 import java.util.function.Function;
@@ -36,6 +46,10 @@ import java.util.stream.Collectors;
 @Service
 @RequiredArgsConstructor
 public class MedicalRecManageServiceImpl implements MedicalRecManageService {
+
+
+    private final String CASE_TEMPLATE_TEMPLATE_EXCEL_PATH = "classpath:template/虚拟病例信息模板v3.0.xlsx";
+
     private final String MEDICAL_ANSWER_TEMPLATE_EXCEL_PATH = "classpath:template/medical_answer_template.xlsx";
 
     private final ResourceLoader resourceLoader;
@@ -48,6 +62,8 @@ public class MedicalRecManageServiceImpl implements MedicalRecManageService {
 
     private final AskTemplateQuestionLibraryService askTemplateQuestionLibraryService;
 
+    private final AskTemplateQuestionLibraryManageService askTemplateQuestionLibraryManageService;
+
     private final AskTemplateQuestionSimilarityService askTemplateQuestionSimilarityService;
 
     private final CommonDicService commonDicService;
@@ -77,7 +93,7 @@ public class MedicalRecManageServiceImpl implements MedicalRecManageService {
     }
 
     @Override
-    public IPage<MedicalRecPageResVO> queryMedicalRecManagePage(String selfDescKeyword, String gender,String patientName,
+    public IPage<MedicalRecPageResVO> queryMedicalRecManagePage(String selfDescKeyword, String gender, String patientName,
                                                                 String diseaseId, Integer pageNum, Integer pageSize) {
         // 注意,这里的diseaseId不支持查询复杂疾病,如果需要支持复杂疾病,这里需要单独进行改造
         MedicalRecPageReqVO medicalRecPageReqVO = new MedicalRecPageReqVO();
@@ -113,7 +129,7 @@ public class MedicalRecManageServiceImpl implements MedicalRecManageService {
         Assert.notEmpty(chiildCommonDicList, "系统问题未找到");
         List<String> dicIds = chiildCommonDicList.stream().map(i -> String.valueOf(i.getId())).collect(Collectors.toList());
         List<AskTemplateQuestionLibrary> askTemplateQuestionLibraryList = askTemplateQuestionLibraryService.lambdaQuery().in(AskTemplateQuestionLibrary::getDictId, dicIds).list();
-        if (CollUtil.isEmpty(askTemplateQuestionLibraryList)){
+        if (CollUtil.isEmpty(askTemplateQuestionLibraryList)) {
             return;
         }
         Set<String> libraryIds = qaList.stream().map(MedicalRecQaVO::getLibraryQuestionId).collect(Collectors.toSet());
@@ -124,7 +140,7 @@ public class MedicalRecManageServiceImpl implements MedicalRecManageService {
 
     }
 
-    private void  saveAskPatientAnswer(List<MedicalRecQaVO> qaList,String medicalRecId,Integer answerType){
+    private void saveAskPatientAnswer(List<MedicalRecQaVO> qaList, String medicalRecId, Integer answerType) {
         if (CollUtil.isEmpty(qaList)) {
             return;
         }
@@ -142,6 +158,7 @@ public class MedicalRecManageServiceImpl implements MedicalRecManageService {
             askPatientAnswer.insert();
         }
     }
+
     @Override
     public List<DiseaseAncillaryResVo> queryDiseaseAncillaryByCreat(String diseaseId) {
         // 辅助检查
@@ -201,7 +218,7 @@ public class MedicalRecManageServiceImpl implements MedicalRecManageService {
 
         assertDefaultAnswer(reqVO.getDefaultQaList());
 
-        BeanUtil.copyProperties(reqVO, medicalRec, "id","patientId");
+        BeanUtil.copyProperties(reqVO, medicalRec, "id", "patientId");
         medicalRec.updateById();
         // 然后修改问答
         // 首先找到数据库中的问答
@@ -227,7 +244,7 @@ public class MedicalRecManageServiceImpl implements MedicalRecManageService {
                 askPatientAnswer.setAnswer(medicalRecQaVO.getMedicalRecAnswer());
                 askPatientAnswer.setMedicalId(medicalRec.getId());
                 askPatientAnswer.setQuestion(CollUtil.getFirst(medicalRecQaVO.getQuestionList()));
-                if (null == askPatientAnswer.getAnswerType()){
+                if (null == askPatientAnswer.getAnswerType()) {
                     askPatientAnswer.setAnswerType(1);
                 }
                 askPatientAnswer.insert();
@@ -268,7 +285,7 @@ public class MedicalRecManageServiceImpl implements MedicalRecManageService {
             medicalRecQaVO.setAnswerType(Objects.isNull(e.getAnswerType()) ? 1 : e.getAnswerType());
             // 病历的回答
             medicalRecQaVO.setMedicalRecAnswer(e.getAnswer());
-            if (StrUtil.isNotEmpty(e.getQuestion())){
+            if (StrUtil.isNotEmpty(e.getQuestion())) {
                 medicalRecQaVO.setQuestionList(CollUtil.newArrayList(e.getQuestion()));
             }
             return medicalRecQaVO;
@@ -290,12 +307,12 @@ public class MedicalRecManageServiceImpl implements MedicalRecManageService {
                 if (ObjectUtil.isNotEmpty(questionLibrary)) {
                     // 问题
                     List<String> question = libraryMapQuestion.get(medicalRecQaVO.getLibraryQuestionId());
-                    if (CollUtil.isNotEmpty(medicalRecQaVO.getQuestionList())){
-                        if (CollUtil.isNotEmpty(question)){
+                    if (CollUtil.isNotEmpty(medicalRecQaVO.getQuestionList())) {
+                        if (CollUtil.isNotEmpty(question)) {
                             question.remove(CollUtil.getFirst(medicalRecQaVO.getQuestionList()));
                             medicalRecQaVO.getQuestionList().addAll(question);
                         }
-                    }else {
+                    } else {
                         medicalRecQaVO.setQuestionList(question);
                     }
 
@@ -331,7 +348,7 @@ public class MedicalRecManageServiceImpl implements MedicalRecManageService {
     @Override
     public MedicalAnswerVideoResVo preUploadMedicalAnswer(MultipartFile multipartFile, String medicalRecId) throws Exception {
 
-        return  answerVideoResourceService.preGenerationMedicalAnswerVideo(multipartFile.getInputStream(),medicalRecId);
+        return answerVideoResourceService.preGenerationMedicalAnswerVideo(multipartFile.getInputStream(), medicalRecId);
 
     }
 
@@ -352,7 +369,7 @@ public class MedicalRecManageServiceImpl implements MedicalRecManageService {
 
             final Map<String, AskTemplateQuestionLibrary> libraryMap = new HashMap<>();
 
-            if (CollUtil.isNotEmpty(askPatientAnswerList)){
+            if (CollUtil.isNotEmpty(askPatientAnswerList)) {
                 // 查询问题库信息
                 List<String> questionIds = askPatientAnswerList.stream()
                         .map(AskPatientAnswer::getLibraryQuestionId).filter(Objects::nonNull).collect(Collectors.toList());
@@ -369,10 +386,10 @@ public class MedicalRecManageServiceImpl implements MedicalRecManageService {
                 medicalRecQaVO.setMedicalRecAnswer(e.getAnswer());
                 // 组装问题列表 和 字典数据
                 AskTemplateQuestionLibrary askTemplateQuestionLibrary = libraryMap.get(e.getLibraryQuestionId());
-                if (Objects.nonNull(askTemplateQuestionLibrary)){
+                if (Objects.nonNull(askTemplateQuestionLibrary)) {
                     medicalRecQaVO.setQuestionList(libraryMapQuestion.get(e.getLibraryQuestionId()));
                     Long dictId = askTemplateQuestionLibrary.getDictId();
-                    if (Objects.nonNull(dictId)){
+                    if (Objects.nonNull(dictId)) {
                         medicalRecQaVO.setDictId(dictId);
                         medicalRecQaVO.setDictNamePath(childCommonDicMap.getOrDefault(dictId, new CommonDic()).getNameZhPath());
                     }
@@ -401,7 +418,7 @@ public class MedicalRecManageServiceImpl implements MedicalRecManageService {
         response.setHeader("Content-Disposition", "attachment;filename=" +
                 URLEncoder.encode("病历问诊问题导入模板.xlsx", "UTF-8"));
 
-        IoUtil.copy(resource.getInputStream(),outputStream);
+        IoUtil.copy(resource.getInputStream(), outputStream);
     }
 
     @Override
@@ -414,4 +431,309 @@ public class MedicalRecManageServiceImpl implements MedicalRecManageService {
         return medicalRecService.lambdaUpdate().eq(MedicalRec::getId, medicalRecId).set(MedicalRec::getStatus, status).update();
 
     }
+
+
+    @Override
+    public void downloadMedicalTemplate(HttpServletResponse response) throws Exception {
+        Resource resource = resourceLoader.getResource(CASE_TEMPLATE_TEMPLATE_EXCEL_PATH);
+        ServletOutputStream outputStream = response.getOutputStream();
+        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
+        response.setHeader("Content-Disposition", "attachment;filename=" +
+                URLEncoder.encode("虚拟病例信息模板v3.0.xlsx", "UTF-8"));
+
+        IoUtil.copy(resource.getInputStream(), outputStream);
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public UploadDiseaseResVo uploadMedical(MultipartFile multipartFile) throws Exception {
+        InputStream inputStream = multipartFile.getInputStream();
+
+        TimeInterval timer = DateUtil.timer();
+        ExcelReader reader = ExcelUtil.getReader(inputStream);
+        log.info("uploadQuestionLibrary : 读取文件耗时:{} s", timer.intervalSecond());
+        // 校验sheet
+        assertTemplate(reader);
+        // 疾病
+        Disease disease = null;
+        // 病人
+        MedicalRec medicalRec = null;
+        // 遍历sheet
+        List<Sheet> sheets = reader.getSheets();
+        for (int i = 0; i < 6; i++) {
+            String sheetName = sheets.get(i).getSheetName();
+            ExcelReader excelReader = reader.setSheet(i);
+            String virtualSheetNameEnum = VirtualSheetNameEnum.fromCode(sheetName);
+            Assert.isTrue(StringUtils.isNoneBlank(virtualSheetNameEnum), "未查询到sheet:" + sheetName);
+            switch (sheetName) {
+                case "基本信息":
+                    assertTitle(excelReader, "基本信息");
+                    List<UploadDiseaseDTO> uploadDiseaseResVos = excelReader.readAll(UploadDiseaseDTO.class);
+                    assertSheetDataBasicInfo(uploadDiseaseResVos);
+                    disease = diseaseService.saveDisease(uploadDiseaseResVos);
+                    medicalRec = batchSaveMedicalRec(uploadDiseaseResVos, disease);
+                    continue;
+                case "临床问诊":
+                    assertTitle(excelReader, "临床问诊");
+                    List<ClinicalInterviewDTO> clinicalInterviewDTOS = excelReader.readAll(ClinicalInterviewDTO.class);
+                    if (null == clinicalInterviewDTOS || clinicalInterviewDTOS.isEmpty()) {
+                        continue;
+                    }
+                    assertSheetDataClinicalInterview(clinicalInterviewDTOS);
+                    askTemplateQuestionLibraryManageService.saveSimilarityQuestion(clinicalInterviewDTOS);
+                    continue;
+                case "体格检查":
+                    assertTitle(excelReader, "体格检查");
+                    List<UploadPhysicalExaminationDTO> uploadPhysicalExaminationDTOS = excelReader.readAll(UploadPhysicalExaminationDTO.class);
+                    if (null == uploadPhysicalExaminationDTOS || uploadPhysicalExaminationDTOS.isEmpty()) {
+                        continue;
+                    }
+                    assertSheetDataPhysicalExamination(uploadPhysicalExaminationDTOS);
+                    diseasePhysicalManageService.batchSavePhysicalExaminationList(disease, uploadPhysicalExaminationDTOS);
+                    continue;
+                case "辅助检查":
+                    assertTitle(excelReader, "辅助检查");
+                    List<SupplementaryTestDto> supplementaryTestDtos = excelReader.readAll(SupplementaryTestDto.class);
+                    if (null == supplementaryTestDtos || supplementaryTestDtos.isEmpty()) {
+                        continue;
+                    }
+                    assertSheetDataSupplementaryTest(supplementaryTestDtos);
+                    diseaseAncillaryManageService.batchSaveAncillaryExaminationList(disease, supplementaryTestDtos);
+                    continue;
+                case "处置计划":
+                    assertTitle(excelReader, "处置计划");
+                    List<HandlingPlanDto> handlingPlanDtos = excelReader.readAll(HandlingPlanDto.class);
+                    System.out.println(handlingPlanDtos);
+                    continue;
+                case "评估结果概述":
+                    assertTitle(excelReader, "评估结果概述");
+                    List<OverviewEvaluationResultsDto> overviewEvaluationResultsDtos = excelReader.readAll(OverviewEvaluationResultsDto.class);
+                    if (null == overviewEvaluationResultsDtos || overviewEvaluationResultsDtos.isEmpty()) {
+                        continue;
+                    }
+                    updateMedicalRec(medicalRec.getId(), overviewEvaluationResultsDtos);
+                    continue;
+                default:
+                    Assert.isTrue(true, "未查询到sheet:" + sheetName);
+                    break;
+            }
+
+        }
+        return null;
+    }
+
+    /**
+     * sheet
+     */
+    private void assertTemplate(ExcelReader excelReader) {
+        List<Sheet> sheets = excelReader.getSheets();
+        for (int i = 0; i < 6; i++) {
+            Sheet sheet = sheets.get(i);
+            String virtualSheetNameEnum = VirtualSheetNameEnum.fromCode(sheet.getSheetName());
+            Assert.isTrue(virtualSheetNameEnum != null, "请检查sheet名称:" + sheet.getSheetName());
+        }
+        // 保证第一个sheet必须为病例信息
+        String sheetName = sheets.get(0).getSheetName();
+        Assert.isTrue(sheetName.equals("基本信息"), "模板错误,请更换模板,sheet {} " + "必须为第一个" + sheetName);
+    }
+
+
+    @Transactional
+    public MedicalRec batchSaveMedicalRec(List<UploadDiseaseDTO> uploadDiseaseResVos, Disease disease) {
+        UploadDiseaseDTO uploadDiseaseDTO = uploadDiseaseResVos.get(0);
+        // 保存病历
+        String name = uploadDiseaseDTO.getName();
+        String sex = uploadDiseaseDTO.getSex();
+        String ageStar = uploadDiseaseDTO.getAgeStar();
+        String maritalStatus = uploadDiseaseDTO.getMaritalStatus();
+        String occupation = uploadDiseaseDTO.getOccupation();
+        String nation = uploadDiseaseDTO.getNation();
+        String birthPlaceOrOrigin = uploadDiseaseDTO.getBirthPlaceOrOrigin();
+        String address = uploadDiseaseDTO.getAddress();
+        String birthPlace = uploadDiseaseDTO.getBirthPlace();
+        String mainSymptom = uploadDiseaseDTO.getMainSymptom();
+
+        MedicalRec medicalRec = new MedicalRec();
+        medicalRec.setDigitalHumanType(1);
+        medicalRec.setPatientName(name);
+        medicalRec.setPatientGender(sex);
+        medicalRec.setPatientAge(Integer.parseInt(ageStar));
+        medicalRec.setPatientMarriage(maritalStatus);
+        medicalRec.setPatientProfession(occupation);
+        medicalRec.setNativePlace(birthPlaceOrOrigin);
+        medicalRec.setPatientNation(nation);
+        medicalRec.setPatientBirthplace(birthPlace);
+        medicalRec.setPatientHabitation(address);
+        medicalRec.setDiseaseId(disease.getId());
+        medicalRec.setPatientSelfDesc(mainSymptom);
+        medicalRec.setStatus(1);
+        medicalRec.setCreateUserId(UserUtil.getUser().getId());
+        medicalRec.setUpdateUserId(UserUtil.getUser().getId());
+        medicalRec.setMedicalStatus(MedicalStatusEnum.CREATE.getCode());
+        medicalRec.setMedicalImportType(MedicalTypeEnum.TEMPLATE_IMPORT.getCode());
+        medicalRecService.save(medicalRec);
+        medicalRecService.updateMedicalRecNo("QL", "男".equals(sex) ? "M" : "F", medicalRec.getId());
+        return medicalRec;
+    }
+
+
+    /**
+     * 修改评价结果描述
+     *
+     * @param id                            病例id
+     * @param overviewEvaluationResultsDtos
+     */
+    private void updateMedicalRec(String id, List<OverviewEvaluationResultsDto> overviewEvaluationResultsDtos) {
+        MedicalRec medicalRec = new MedicalRec();
+        medicalRec.setId(id);
+        for (OverviewEvaluationResultsDto overviewEvaluationResultsDto : overviewEvaluationResultsDtos) {
+            String assessmentItem = overviewEvaluationResultsDto.getAssessmentItem();
+            switch (assessmentItem) {
+                case "*预期诊断结果":
+                    String assessmentOverview = overviewEvaluationResultsDto.getAssessmentOverview();
+                    medicalRec.setFullCheck(assessmentOverview);
+                    continue;
+                case "*初步诊断依据":
+                    String assessmentOverview1 = overviewEvaluationResultsDto.getAssessmentOverview();
+                    medicalRec.setPrimarilyDiagnosisCriteria(assessmentOverview1);
+                    continue;
+                case "*证实诊断依据":
+                    String assessmentOverview2 = overviewEvaluationResultsDto.getAssessmentOverview();
+                    medicalRec.setConfirmDiagnosisCriteria(assessmentOverview2);
+                    continue;
+                case "*鉴别依据":
+                    String assessmentOverview3 = overviewEvaluationResultsDto.getAssessmentOverview();
+                    medicalRec.setDifferentialDiagnosisCriteria(assessmentOverview3);
+                    continue;
+                default:
+                    Assert.isTrue(true, "请检查评估结果概述sheet第一列是否正确");
+            }
+        }
+        medicalRecService.updateById(medicalRec);
+    }
+
+
+    /**
+     * 校验行头
+     * todo 这要根据每个sheet进行case
+     *
+     * @param reader
+     * @param sheetName
+     */
+    private void assertTitle(ExcelReader reader, String sheetName) {
+        List<Object> titleList = reader.readRow(0);
+        Assert.isTrue(CollUtil.isNotEmpty(titleList), "表头格式有误,请重新导入");
+        switch (sheetName) {
+            case "基本信息":
+                for (int i = 0; i < UploadDiseaseDTO.CASE_TEMPLATE_SHEET_SINGLE_DISEASE_TITLE.size(); i++) {
+                    Assert.isTrue(titleList.size() > i, "表头格式有误,请重新导入");
+                    Assert.isTrue(UploadDiseaseDTO.CASE_TEMPLATE_SHEET_SINGLE_DISEASE_TITLE.get(i).equals(titleList.get(i)), "表头格式有误,请重新导入");
+                }
+                break;
+            case "临床问诊":
+                for (int i = 0; i < ClinicalInterviewDTO.CASE_TEMPLATE_SHEET_SINGLE_DISEASE_TITLE.size(); i++) {
+                    Assert.isTrue(titleList.size() > i, "表头格式有误,请重新导入");
+                    Assert.isTrue(ClinicalInterviewDTO.CASE_TEMPLATE_SHEET_SINGLE_DISEASE_TITLE.get(i).equals(titleList.get(i)), "表头格式有误,请重新导入");
+                }
+                break;
+            case "体格检查":
+                for (int i = 0; i < UploadPhysicalExaminationDTO.CASE_TEMPLATE_SHEET_SINGLE_DISEASE_TITLE.size(); i++) {
+                    Assert.isTrue(titleList.size() > i, "表头格式有误,请重新导入");
+                    Assert.isTrue(UploadPhysicalExaminationDTO.CASE_TEMPLATE_SHEET_SINGLE_DISEASE_TITLE.get(i).equals(titleList.get(i)), "表头格式有误,请重新导入");
+                }
+                break;
+            case "辅助检查":
+                for (int i = 0; i < SupplementaryTestDto.CASE_TEMPLATE_SHEET_SINGLE_DISEASE_TITLE.size(); i++) {
+                    Assert.isTrue(titleList.size() > i, "表头格式有误,请重新导入");
+                    Assert.isTrue(SupplementaryTestDto.CASE_TEMPLATE_SHEET_SINGLE_DISEASE_TITLE.get(i).equals(titleList.get(i)), "表头格式有误,请重新导入");
+                }
+                break;
+            case "评估结果概述":
+                for (int i = 0; i < OverviewEvaluationResultsDto.CASE_TEMPLATE_SHEET_SINGLE_DISEASE_TITLE.size(); i++) {
+                    Assert.isTrue(titleList.size() > i, "表头格式有误,请重新导入");
+                    Assert.isTrue(OverviewEvaluationResultsDto.CASE_TEMPLATE_SHEET_SINGLE_DISEASE_TITLE.get(i).equals(titleList.get(i)), "表头格式有误,请重新导入");
+                }
+                break;
+        }
+    }
+
+
+    /**
+     * 判断基本信息中只有一条数据
+     *
+     * @param uploadDiseaseResVos
+     */
+    private void assertSheetDataBasicInfo(List<UploadDiseaseDTO> uploadDiseaseResVos) {
+        Assert.notEmpty(uploadDiseaseResVos, "病例基本信息数据数据为空");
+        Assert.isTrue(uploadDiseaseResVos.size() != 1, "目前仅限传一个病例");
+        uploadDiseaseResVos.forEach(this::assertDiseaseQuestion);
+    }
+
+
+    /**
+     * 判断基本信息中只有一条数据
+     *
+     * @param uploadDiseaseResVos
+     */
+    private void assertSheetDataClinicalInterview(List<ClinicalInterviewDTO> uploadDiseaseResVos) {
+        uploadDiseaseResVos.forEach(this::assertClinicalInterview);
+    }
+
+    private void assertSheetDataPhysicalExamination(List<UploadPhysicalExaminationDTO> uploadDiseaseResVos) {
+        uploadDiseaseResVos.forEach(this::assertPhysicalExamination);
+    }
+
+    private void assertSheetDataSupplementaryTest(List<SupplementaryTestDto> uploadDiseaseResVos) {
+        uploadDiseaseResVos.forEach(this::supplementaryTestDto);
+    }
+
+
+    private void assertDiseaseQuestion(UploadDiseaseDTO diseaseQuestion) {
+
+        Assert.notEmpty(diseaseQuestion.getSex(), "性别不能为空");
+
+        Assert.notEmpty(diseaseQuestion.getAgeStar(), "年龄不能为空");
+
+        Assert.isTrue(StrUtil.isNotEmpty(diseaseQuestion.getDiseaseClassificationName()), "疾病分类名称不能为空");
+
+        Assert.notEmpty(diseaseQuestion.getCommonName(), "通用名不能为空");
+
+        Assert.notEmpty(diseaseQuestion.getCategoryCode(), "疾病代码不能为空");
+
+        Assert.notEmpty(diseaseQuestion.getMainSymptom(), "主诉不能为空");
+    }
+
+
+    private void assertClinicalInterview(ClinicalInterviewDTO clinicalInterviewDTO) {
+        Assert.notEmpty(clinicalInterviewDTO.getConsultationI(), "问诊I不能为空");
+
+        Assert.notEmpty(clinicalInterviewDTO.getConsultationII(), "问诊Ⅱ不能为空");
+    }
+
+    private void assertPhysicalExamination(UploadPhysicalExaminationDTO uploadPhysicalExaminationDTO) {
+//        Assert.isTrue(StrUtil.isEmpty(uploadPhysicalExaminationDTO.getIiLevelClassification()), "Ⅰ级分类不能为空");
+//        Assert.notEmpty(uploadPhysicalExaminationDTO.getIiLevelClassification(), "Ⅱ级分类不能为空");
+//        Assert.notEmpty(uploadPhysicalExaminationDTO.getHumanBodyPartI(), "人体部位Ⅰ不能为空");
+//        Assert.notEmpty(uploadPhysicalExaminationDTO.getHumanBodyPartIi(), "人体部位Ii不能为空");
+        Assert.notEmpty(uploadPhysicalExaminationDTO.getNormalExamResult(), "正常检查结果不可为空");
+        Assert.notEmpty(uploadPhysicalExaminationDTO.getStatus(), "状态不可为空");
+        Assert.notEmpty(uploadPhysicalExaminationDTO.getIsNecessaryExamDefaultYes(), "*是否必查(默认是)不可为空");
+        Assert.notEmpty(uploadPhysicalExaminationDTO.getPreliminaryDiagnosisBasis(), "初步诊断依据不可为空");
+        Assert.notEmpty(uploadPhysicalExaminationDTO.getConfirmedDiagnosisBasis(), "证实诊断依据不可为空");
+        Assert.notEmpty(uploadPhysicalExaminationDTO.getDifferentialDiagnosisBasis(), "鉴别依据不可为空");
+
+    }
+
+    private void supplementaryTestDto(SupplementaryTestDto uploadPhysicalExaminationDTO) {
+//        Assert.isTrue(StrUtil.isEmpty(uploadPhysicalExaminationDTO.getFirstLevelCategory()), "Ⅰ级分类不能为空");
+//        Assert.notEmpty(uploadPhysicalExaminationDTO.getSecondLevelCategory(), "Ⅱ级分类不能为空");
+        Assert.notEmpty(uploadPhysicalExaminationDTO.getNormalTestResult(), "正常检查结果不可为空");
+        Assert.notEmpty(uploadPhysicalExaminationDTO.getPatientTestResult(), "病人检查结果不可为空");
+        Assert.notEmpty(uploadPhysicalExaminationDTO.getIsRequiredCheck(), "*是否必查(默认是)不可为空");
+        Assert.notEmpty(uploadPhysicalExaminationDTO.getPreliminaryDiagnosisBasis(), "初步诊断依据不可为空");
+        Assert.notEmpty(uploadPhysicalExaminationDTO.getConfirmedDiagnosisBasis(), "证实诊断依据不可为空");
+        Assert.notEmpty(uploadPhysicalExaminationDTO.getDifferentialDiagnosisBasis(), "鉴别依据不可为空");
+    }
+
+
 }
diff --git a/virtual-patient-manage/src/main/resources/template/虚拟病例信息模板v3.0.xlsx b/virtual-patient-manage/src/main/resources/template/虚拟病例信息模板v3.0.xlsx
new file mode 100644
index 00000000..16f6fbe1
Binary files /dev/null and b/virtual-patient-manage/src/main/resources/template/虚拟病例信息模板v3.0.xlsx differ
diff --git a/virtual-patient-manage/src/test/java/com/supervision/manage/MedicalAiAnswerSetter.java b/virtual-patient-manage/src/test/java/com/supervision/manage/MedicalAiAnswerSetter.java
index 9be19e3c..74ebf439 100644
--- a/virtual-patient-manage/src/test/java/com/supervision/manage/MedicalAiAnswerSetter.java
+++ b/virtual-patient-manage/src/test/java/com/supervision/manage/MedicalAiAnswerSetter.java
@@ -1,6 +1,7 @@
 package com.supervision.manage;
 
 import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.lang.Assert;
 import com.supervision.exception.BusinessException;
 import com.supervision.manage.service.FileManageService;
 import com.supervision.manage.service.MaterialLibraryManageService;
@@ -16,13 +17,40 @@ import org.springframework.transaction.annotation.Transactional;
 
 import java.io.File;
 import java.io.FileInputStream;
-import java.util.List;
+import java.util.*;
 
 @Slf4j
 @SpringBootTest
 public class MedicalAiAnswerSetter {
 
 
+
+    @Test
+    public void sd(){
+        String s = "现病史 发病时间\n" +
+                "现病史 现病史2 发病时间\n";
+
+
+        String[] split = s.split("\n");
+
+        for (String string : split) {
+            String[] split1 = string.split(" ");
+            Assert.isTrue(split1.length ==2, "数据格式错误");
+            Map<String, String> map = new HashMap<>();
+            map.put("item1", split1[0]);
+            map.put("item2", split1[1]);
+
+        }
+    }
+
+
+    public static int countChar(String str, char targetChar) {
+        return (int) Arrays.stream(str.split(""))
+                .filter(s -> s.charAt(0) == targetChar)
+                .count();
+    }
+
+
     @Autowired
     private MaterialLibraryManageService materialLibraryManageService;
 
diff --git a/virtual-patient-model/src/main/java/com/supervision/dto/ClinicalInterviewDTO.java b/virtual-patient-model/src/main/java/com/supervision/dto/ClinicalInterviewDTO.java
new file mode 100644
index 00000000..cc8c7b08
--- /dev/null
+++ b/virtual-patient-model/src/main/java/com/supervision/dto/ClinicalInterviewDTO.java
@@ -0,0 +1,33 @@
+package com.supervision.dto;
+
+import cn.hutool.core.annotation.Alias;
+import cn.hutool.core.collection.CollUtil;
+import lombok.Data;
+
+import java.util.List;
+
+
+/**
+ * @Author:longbao
+ * @Date:2024/10/29 10:00
+ * @Description: 上传excel临床问诊字段对应
+ */
+@Data
+public class ClinicalInterviewDTO {
+
+    public static final List<String> CASE_TEMPLATE_SHEET_SINGLE_DISEASE_TITLE = CollUtil.newArrayList
+            ("问诊Ⅰ", "问诊Ⅱ", "*问题(可不选择具体问题,根据问诊类目系统识别问诊意图)","患者回复(必填-模拟专业度较高问诊场景需要 获取有效的问诊回复)");
+
+    @Alias(value = "问诊Ⅰ")
+    private String ConsultationI;
+
+    @Alias(value = "问诊Ⅱ")
+    private String ConsultationII;
+
+    @Alias(value = "问题")
+    private String QuestionIntentRecognition;
+
+    @Alias(value = "患者回复")
+    private String PatientResponseRequired;
+
+}
diff --git a/virtual-patient-model/src/main/java/com/supervision/dto/HandlingPlanDto.java b/virtual-patient-model/src/main/java/com/supervision/dto/HandlingPlanDto.java
new file mode 100644
index 00000000..7aa1af37
--- /dev/null
+++ b/virtual-patient-model/src/main/java/com/supervision/dto/HandlingPlanDto.java
@@ -0,0 +1,33 @@
+package com.supervision.dto;
+
+import cn.hutool.core.annotation.Alias;
+import cn.hutool.core.collection.CollUtil;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @Author:longbao
+ * @Date:2024/11/5 11:09
+ * @Description: 处置计划
+ */
+@Data
+public class HandlingPlanDto {
+
+
+    public static final List<String> CASE_TEMPLATE_SHEET_SINGLE_DISEASE_TITLE = CollUtil.newArrayList
+            ("*处置方案(请选择)","* 一级措施(请选择)","* 二级措施(请选择)", "* 说明");
+
+    @Alias(value = "处置方案")
+    private String disposalScheme;
+
+    @Alias(value = "一级措施")
+    private String firstLevelMeasure;
+
+    @Alias(value = "二级措施")
+    private String secondLevelMeasure;
+
+    @Alias(value = "说明")
+    private String description;
+
+}
diff --git a/virtual-patient-model/src/main/java/com/supervision/dto/OverviewEvaluationResultsDto.java b/virtual-patient-model/src/main/java/com/supervision/dto/OverviewEvaluationResultsDto.java
new file mode 100644
index 00000000..5e0fb209
--- /dev/null
+++ b/virtual-patient-model/src/main/java/com/supervision/dto/OverviewEvaluationResultsDto.java
@@ -0,0 +1,30 @@
+package com.supervision.dto;
+
+import cn.hutool.core.annotation.Alias;
+import cn.hutool.core.collection.CollUtil;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @Author:longbao
+ * @Date:2024/11/5 11:09
+ * @Description: 评估结果概述
+ */
+@Data
+public class OverviewEvaluationResultsDto {
+
+
+    public static final List<String> CASE_TEMPLATE_SHEET_SINGLE_DISEASE_TITLE = CollUtil.newArrayList
+            ("NO.","评估项目","评估概述(需医生提供,以下为示例 可删除)", "填写说明");
+
+    @Alias(value = "评估项目")
+    private String assessmentItem;
+
+    @Alias(value = "评估概述(需医生提供,以下为示例 可删除)")
+    private String assessmentOverview;
+
+    @Alias(value = "填写说明")
+    private String fillingInstructions;
+
+}
diff --git a/virtual-patient-model/src/main/java/com/supervision/dto/SupplementaryTestDto.java b/virtual-patient-model/src/main/java/com/supervision/dto/SupplementaryTestDto.java
new file mode 100644
index 00000000..824b2bfe
--- /dev/null
+++ b/virtual-patient-model/src/main/java/com/supervision/dto/SupplementaryTestDto.java
@@ -0,0 +1,54 @@
+package com.supervision.dto;
+
+import cn.hutool.core.annotation.Alias;
+import cn.hutool.core.collection.CollUtil;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @Author:longbao
+ * @Date:2024/11/4 21:34
+ * @Description: 辅助检查
+ */
+@Data
+public class SupplementaryTestDto {
+
+    public static final List<String> CASE_TEMPLATE_SHEET_SINGLE_DISEASE_TITLE = CollUtil.newArrayList
+            ("1级分类","Ⅱ级分类","*正常检测结果", "*病人检查结果", "状态", "*初步诊断依据", "*证实诊断依据", "*鉴别依据", "*是否必查\n(默认是)",
+                    "补充项1", "补充项2");
+
+    @Alias(value = "1级分类")
+    private String firstLevelCategory;
+
+    @Alias(value = "Ⅱ级分类")
+    private String secondLevelCategory;
+
+    @Alias(value = "*正常检测结果")
+    private String normalTestResult;
+
+    @Alias(value = "*病人检查结果")
+    private String patientTestResult;
+
+    @Alias(value = "状态")
+    private String status;
+
+    @Alias(value = "*初步诊断依据")
+    private String preliminaryDiagnosisBasis;
+
+    @Alias(value = "*证实诊断依据")
+    private String confirmedDiagnosisBasis;
+
+    @Alias(value = "*鉴别依据")
+    private String differentialDiagnosisBasis;
+
+    @Alias(value = "*是否必查\n(默认是)")
+    private String isRequiredCheck;
+
+    @Alias(value = "补充项1")
+    private String supplementaryItem1;
+
+    @Alias(value = "补充项2")
+    private String supplementaryItem2;
+
+}
diff --git a/virtual-patient-model/src/main/java/com/supervision/dto/UploadDiseaseDTO.java b/virtual-patient-model/src/main/java/com/supervision/dto/UploadDiseaseDTO.java
new file mode 100644
index 00000000..05f973ab
--- /dev/null
+++ b/virtual-patient-model/src/main/java/com/supervision/dto/UploadDiseaseDTO.java
@@ -0,0 +1,63 @@
+package com.supervision.dto;
+
+import cn.hutool.core.annotation.Alias;
+import cn.hutool.core.collection.CollUtil;
+import lombok.Data;
+
+import java.util.List;
+
+
+/**
+ * @Author:longbao
+ * @Date:2024/10/29 10:00
+ * @Description: 上传excel疾病检查字段对应
+ */
+@Data
+public class UploadDiseaseDTO {
+
+    public static final List<String> CASE_TEMPLATE_SHEET_SINGLE_DISEASE_TITLE = CollUtil.newArrayList
+            ("姓名","*性别","*年龄", "婚姻状态", "职业", "民族", "出生地/籍贯", "住址", "出生地","*疾病代码", "*疾病分类名称", "*通用名", "最终诊断", "*(主诉)主要症状");
+
+    @Alias(value = "姓名")
+    private String name;
+
+    @Alias(value = "*性别")
+    private String sex;
+
+    @Alias(value = "*年龄")
+    private String ageStar;
+
+    @Alias(value = "婚姻状态")
+    private String maritalStatus;
+
+    @Alias(value = "职业")
+    private String occupation;
+
+    @Alias(value = "民族")
+    private String nation;
+
+    @Alias(value = "出生地/籍贯")
+    private String birthPlaceOrOrigin;
+
+    @Alias(value = "住址")
+    private String address;
+
+    @Alias(value = "出生地")
+    private String birthPlace;
+
+    @Alias(value = "*疾病代码")
+    private String categoryCode;
+
+    @Alias(value = "*疾病分类名称")
+    private String diseaseClassificationName;
+
+    @Alias(value = "*通用名")
+    private String commonName;
+
+//    @Alias(value = "最终诊断")
+//    private String finalDiagnosis;
+
+    @Alias(value = "*(主诉)主要症状")
+    private String mainSymptom;
+
+}
diff --git a/virtual-patient-model/src/main/java/com/supervision/dto/UploadPhysicalExaminationDTO.java b/virtual-patient-model/src/main/java/com/supervision/dto/UploadPhysicalExaminationDTO.java
new file mode 100644
index 00000000..4e3fc87a
--- /dev/null
+++ b/virtual-patient-model/src/main/java/com/supervision/dto/UploadPhysicalExaminationDTO.java
@@ -0,0 +1,60 @@
+package com.supervision.dto;
+
+import cn.hutool.core.annotation.Alias;
+import cn.hutool.core.collection.CollUtil;
+import lombok.Data;
+
+import java.util.List;
+
+
+/**
+ * @Author:longbao
+ * @Date:2024/10/29 11:00
+ * @Description: 上传excel体格检查字段对应
+ */
+@Data
+public class UploadPhysicalExaminationDTO {
+
+    public static final List<String> CASE_TEMPLATE_SHEET_SINGLE_DISEASE_TITLE = CollUtil.newArrayList
+            ("Ⅰ级分类", "Ⅱ级分类", "人体部位Ⅰ", "人体部位Ⅱ", "*正常检查结果",
+                    "病人检查结果", "*状态", "*初步诊断依据", "*证实诊断依据", "*鉴别依据", "*是否必查\n(默认是)", "补充项1", "补充项2");
+
+    @Alias(value = "Ⅰ级分类")
+    private String iLevelClassification;
+
+    @Alias(value = "Ⅱ级分类")
+    private String iiLevelClassification;
+
+    @Alias(value = "人体部位Ⅰ")
+    private String humanBodyPartI;
+
+    @Alias(value = "人体部位Ⅱ")
+    private String humanBodyPartIi;
+
+    @Alias(value = "*正常检查结果")
+    private String normalExamResult;
+
+    @Alias(value = "病人检查结果")
+    private String patientExamResult;
+
+    @Alias(value = "*状态")
+    private String status;
+
+    @Alias(value = "*初步诊断依据")
+    private String preliminaryDiagnosisBasis;
+
+    @Alias(value = "*证实诊断依据")
+    private String confirmedDiagnosisBasis;
+
+    @Alias(value = "*鉴别依据")
+    private String differentialDiagnosisBasis;
+
+    @Alias(value = "*是否必查\n(默认是)")
+    private String isNecessaryExamDefaultYes;
+
+    private String supplementItem1;
+
+    private String supplementItem2;
+
+
+}
diff --git a/virtual-patient-model/src/main/java/com/supervision/enums/EnumMedicalRec.java b/virtual-patient-model/src/main/java/com/supervision/enums/EnumMedicalRec.java
new file mode 100644
index 00000000..5a23d91d
--- /dev/null
+++ b/virtual-patient-model/src/main/java/com/supervision/enums/EnumMedicalRec.java
@@ -0,0 +1,32 @@
+package com.supervision.enums;
+
+/**
+ * @Author:longbao
+ * @Date:2024/10/31 16:59
+ * @Description:
+ */
+public enum EnumMedicalRec {
+
+    DIGITAL_HUMAN_CREATED("已创建病例", "00"),
+    ESTABLISHED_RECORD("数字人生成中", "01"),
+    MEDICAL_RECORD_ESTABLISHED("已生成数字人", "02"),
+    COMPLETE("完成", "03"),
+    ;
+
+    private String description;
+    private String code;
+
+    EnumMedicalRec(String description, String code) {
+        this.description = description;
+        this.code = code;
+    }
+
+
+    public String getDescription() {
+        return description;
+    }
+
+    public String getCode() {
+        return code;
+    }
+}
diff --git a/virtual-patient-model/src/main/java/com/supervision/mapper/AskTemplateQuestionLibraryMapper.java b/virtual-patient-model/src/main/java/com/supervision/mapper/AskTemplateQuestionLibraryMapper.java
index 7a271187..17ef55d6 100644
--- a/virtual-patient-model/src/main/java/com/supervision/mapper/AskTemplateQuestionLibraryMapper.java
+++ b/virtual-patient-model/src/main/java/com/supervision/mapper/AskTemplateQuestionLibraryMapper.java
@@ -23,6 +23,10 @@ public interface AskTemplateQuestionLibraryMapper extends BaseMapper<AskTemplate
 
     Page<AskQuestionLibraryResVo> queryPageList(IPage<AskQuestionLibraryResVo> page,
                                                 @Param("askQuestionLibrary") AskQuestionLibraryReqVo askQuestionLibrary);
+
+
+    String queryByName(@Param("askQuestionLibrary") String nameZh);
+
 }
 
 
diff --git a/virtual-patient-model/src/main/java/com/supervision/mapper/AskTemplateQuestionSimilarityMapper.java b/virtual-patient-model/src/main/java/com/supervision/mapper/AskTemplateQuestionSimilarityMapper.java
index 1ecb4d6a..28a820d7 100644
--- a/virtual-patient-model/src/main/java/com/supervision/mapper/AskTemplateQuestionSimilarityMapper.java
+++ b/virtual-patient-model/src/main/java/com/supervision/mapper/AskTemplateQuestionSimilarityMapper.java
@@ -11,6 +11,14 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 */
 public interface AskTemplateQuestionSimilarityMapper extends BaseMapper<AskTemplateQuestionSimilarity> {
 
+
+    /**
+     * 查询相似问题
+     * @param nameZh
+     * @param similarityQuestion
+     * @return
+     */
+    public AskTemplateQuestionSimilarity querySimilarityQuestionByNameZhAndSimilarityQuestion(String nameZh, String similarityQuestion);
 }
 
 
diff --git a/virtual-patient-model/src/main/java/com/supervision/mapper/DiseaseAncillaryMapper.java b/virtual-patient-model/src/main/java/com/supervision/mapper/DiseaseAncillaryMapper.java
index 64438f14..0426e840 100644
--- a/virtual-patient-model/src/main/java/com/supervision/mapper/DiseaseAncillaryMapper.java
+++ b/virtual-patient-model/src/main/java/com/supervision/mapper/DiseaseAncillaryMapper.java
@@ -10,11 +10,11 @@ import org.apache.ibatis.annotations.Param;
 import java.util.List;
 
 /**
- * @author flevance
- * @description 针对表【vp_disease_ancillary(疾病辅助检查)】的数据库操作Mapper
- * @createDate 2023-10-20 17:19:21
- * @Entity com.supervision.model.DiseaseAncillary
- */
+* @author flevance
+* @description 针对表【vp_disease_ancillary(疾病辅助检查)】的数据库操作Mapper
+* @createDate 2023-10-20 17:19:21
+* @Entity com.supervision.model.DiseaseAncillary
+*/
 public interface DiseaseAncillaryMapper extends BaseMapper<DiseaseAncillary> {
 
     List<DiseaseAncillaryDto> queryDiseaseAncillaryDtoList(@Param("diseaseAncillary")DiseaseAncillary diseaseAncillary);
diff --git a/virtual-patient-model/src/main/java/com/supervision/mapper/DiseasePhysicalMapper.java b/virtual-patient-model/src/main/java/com/supervision/mapper/DiseasePhysicalMapper.java
index 51dfe262..9e965d6f 100644
--- a/virtual-patient-model/src/main/java/com/supervision/mapper/DiseasePhysicalMapper.java
+++ b/virtual-patient-model/src/main/java/com/supervision/mapper/DiseasePhysicalMapper.java
@@ -9,11 +9,11 @@ import org.apache.ibatis.annotations.Param;
 import java.util.List;
 
 /**
- * @author flevance
- * @description 针对表【vp_disease_physical(疾病体格检查)】的数据库操作Mapper
- * @createDate 2023-10-20 17:19:21
- * @Entity com.supervision.model.DiseasePhysical
- */
+* @author flevance
+* @description 针对表【vp_disease_physical(疾病体格检查)】的数据库操作Mapper
+* @createDate 2023-10-20 17:19:21
+* @Entity com.supervision.model.DiseasePhysical
+*/
 public interface DiseasePhysicalMapper extends BaseMapper<DiseasePhysical> {
 
     List<DiseasePhysicalResVo> queryListByDiseaseId(@Param("diseaseId") String diseaseId);
diff --git a/virtual-patient-model/src/main/java/com/supervision/model/Disease.java b/virtual-patient-model/src/main/java/com/supervision/model/Disease.java
index 10128f97..620a78c9 100644
--- a/virtual-patient-model/src/main/java/com/supervision/model/Disease.java
+++ b/virtual-patient-model/src/main/java/com/supervision/model/Disease.java
@@ -27,13 +27,6 @@ public class Disease implements Serializable {
     private String id;
 
 
-    @Schema(description = "疾病名称")
-    private String diseaseName;
-
-
-    @Schema(description = "疾病分类别名")
-    private String diseaseNameAlias;
-
     /**
      * 疾病编码
      */
@@ -41,10 +34,11 @@ public class Disease implements Serializable {
     private String code;
 
 
-    @Schema(description = "包含的疾病id")
-    @TableField(typeHandler = StringListTypeHandler.class)
-    private List<String> containDiseaseIds;
+    @Schema(description = "疾病名称")
+    private String diseaseName;
 
+    @Schema(description = "疾病分类别名")
+    private String diseaseNameAlias;
     /**
      * 状态 0未训练 1已训练
      */
@@ -54,6 +48,11 @@ public class Disease implements Serializable {
     @Schema(description = "疾病类型 0单一疾病 1 复合疾病")
     private Integer diseaseType;
 
+    @Schema(description = "包含的疾病id")
+    @TableField(typeHandler = StringListTypeHandler.class)
+    private List<String> containDiseaseIds;
+
+
     @Schema(description = "症状")
     private String symptom;
 
diff --git a/virtual-patient-model/src/main/java/com/supervision/model/MedicalRec.java b/virtual-patient-model/src/main/java/com/supervision/model/MedicalRec.java
index 1f44c578..0811e837 100644
--- a/virtual-patient-model/src/main/java/com/supervision/model/MedicalRec.java
+++ b/virtual-patient-model/src/main/java/com/supervision/model/MedicalRec.java
@@ -125,7 +125,8 @@ public class MedicalRec extends Model<MedicalRec> implements Serializable {
     @Schema(description = "鉴别诊断依据")
     private String differentialDiagnosisCriteria;
 
-    @Schema(description = "全面检查")
+    // 2024.11.05:与周霞沟通后修改全面检查字段为 *预期诊断结果
+    @Schema(description = "预期诊断结果")
     private String fullCheck;
 
     @Schema(description = "提交给大模型的病历")
@@ -158,6 +159,19 @@ public class MedicalRec extends Model<MedicalRec> implements Serializable {
     @TableField(fill = FieldFill.INSERT_UPDATE)
     private LocalDateTime updateTime;
 
+    /**
+     *病例生成状态
+     */
+    @Schema(description = "病例生成状态")
+    private String medicalStatus;
+
+    /**
+     * 病例创建类型
+     */
+    @Schema(description = "病例创建类型")
+    private String medicalImportType;
+
+
     @TableField(exist = false)
     private static final long serialVersionUID = 1L;
 }
\ No newline at end of file
diff --git a/virtual-patient-model/src/main/java/com/supervision/service/AskTemplateQuestionSimilarityService.java b/virtual-patient-model/src/main/java/com/supervision/service/AskTemplateQuestionSimilarityService.java
index 65cfb78b..d34d31f8 100644
--- a/virtual-patient-model/src/main/java/com/supervision/service/AskTemplateQuestionSimilarityService.java
+++ b/virtual-patient-model/src/main/java/com/supervision/service/AskTemplateQuestionSimilarityService.java
@@ -1,5 +1,6 @@
 package com.supervision.service;
 
+import com.supervision.dto.ClinicalInterviewDTO;
 import com.supervision.model.AskTemplateQuestionLibrary;
 import com.supervision.model.AskTemplateQuestionSimilarity;
 import com.baomidou.mybatisplus.extension.service.IService;
@@ -30,4 +31,14 @@ public interface AskTemplateQuestionSimilarityService extends IService<AskTempla
      */
     Map<String, List<String>> querySimilarityQuestionMapByLibraryLists(List<AskTemplateQuestionLibrary> libraryList);
 
+
+    /**
+     * 查询相似问题
+     * @param nameZh 中文名
+     * @param similarityQuestion 相似问题
+     * @return
+     */
+    AskTemplateQuestionSimilarity querySimilarityQuestionByNameZhAndSimilarityQuestion(String nameZh, String similarityQuestion);
+
+
 }
diff --git a/virtual-patient-model/src/main/java/com/supervision/service/CommonDicService.java b/virtual-patient-model/src/main/java/com/supervision/service/CommonDicService.java
index c941b28b..d511b7ea 100644
--- a/virtual-patient-model/src/main/java/com/supervision/service/CommonDicService.java
+++ b/virtual-patient-model/src/main/java/com/supervision/service/CommonDicService.java
@@ -4,6 +4,7 @@ import com.supervision.dto.CommonDictTreeDTO;
 import com.supervision.model.CommonDic;
 import com.baomidou.mybatisplus.extension.service.IService;
 
+import java.util.ArrayList;
 import java.util.List;
 
 /**
@@ -19,4 +20,12 @@ public interface CommonDicService extends IService<CommonDic> {
      */
     List<CommonDictTreeDTO> queryCommonDictTree(String groupCode);
 
+
+    /**
+     * 查询字典表的配置
+     * @param code
+     * @return
+     */
+    public Long queryCommonDictTreeByCode(ArrayList<String> code);
+
 }
diff --git a/virtual-patient-model/src/main/java/com/supervision/service/ConfigAncillaryItemService.java b/virtual-patient-model/src/main/java/com/supervision/service/ConfigAncillaryItemService.java
index 648abec1..ddd15328 100644
--- a/virtual-patient-model/src/main/java/com/supervision/service/ConfigAncillaryItemService.java
+++ b/virtual-patient-model/src/main/java/com/supervision/service/ConfigAncillaryItemService.java
@@ -19,4 +19,13 @@ public interface ConfigAncillaryItemService extends IService<ConfigAncillaryItem
     List<ConfigAncillaryItemVo> queryVoList(AncillaryItemReqVo ancillaryItemReqVo);
 
     List<ConfigAncillaryItemResVO> queryAncillaryItemList(AncillaryItemReqVo ancillaryItemReqVo);
+
+    /**
+     * 查詢輔助檢查工具
+     * @param name1 輔助檢查一级分類
+     * @param name2 輔助檢查二级分類
+     * @return
+     */
+    ConfigAncillaryItem queryAncillaryItem( String name1,String name2);
+
 }
diff --git a/virtual-patient-model/src/main/java/com/supervision/service/ConfigPhysicalLocationService.java b/virtual-patient-model/src/main/java/com/supervision/service/ConfigPhysicalLocationService.java
index 8ca03b3f..ccdb8d97 100644
--- a/virtual-patient-model/src/main/java/com/supervision/service/ConfigPhysicalLocationService.java
+++ b/virtual-patient-model/src/main/java/com/supervision/service/ConfigPhysicalLocationService.java
@@ -10,4 +10,12 @@ import com.baomidou.mybatisplus.extension.service.IService;
 */
 public interface ConfigPhysicalLocationService extends IService<ConfigPhysicalLocation> {
 
+
+    /**
+     * 查询体格检查通过locationName
+     * @param locationName 位置名称
+     * @param level 层级
+     * @return
+     */
+    ConfigPhysicalLocation queryLocationTreeForLocationName(String locationName, String level);
 }
diff --git a/virtual-patient-model/src/main/java/com/supervision/service/ConfigPhysicalToolService.java b/virtual-patient-model/src/main/java/com/supervision/service/ConfigPhysicalToolService.java
index 0e93a76e..af72b11e 100644
--- a/virtual-patient-model/src/main/java/com/supervision/service/ConfigPhysicalToolService.java
+++ b/virtual-patient-model/src/main/java/com/supervision/service/ConfigPhysicalToolService.java
@@ -15,4 +15,12 @@ public interface ConfigPhysicalToolService extends IService<ConfigPhysicalTool>
 
     List<ConfigPhysicalToolResVO> queryPhysicalToolList();
 
+    /**
+     * 工具
+     * @param type 工具类型
+     * @param toolName 工具名称
+     * @return
+     */
+    ConfigPhysicalTool queryPhysicalToolByTypeAndToolName(String type, String toolName);
+
 }
diff --git a/virtual-patient-model/src/main/java/com/supervision/service/DiseaseAncillaryService.java b/virtual-patient-model/src/main/java/com/supervision/service/DiseaseAncillaryService.java
index 5c7edc6a..29574331 100644
--- a/virtual-patient-model/src/main/java/com/supervision/service/DiseaseAncillaryService.java
+++ b/virtual-patient-model/src/main/java/com/supervision/service/DiseaseAncillaryService.java
@@ -10,10 +10,10 @@ import java.util.List;
 import java.util.function.Supplier;
 
 /**
- * @author flevance
- * @description 针对表【vp_disease_ancillary(疾病辅助检查)】的数据库操作Service
- * @createDate 2023-10-20 17:19:21
- */
+* @author flevance
+* @description 针对表【vp_disease_ancillary(疾病辅助检查)】的数据库操作Service
+* @createDate 2023-10-20 17:19:21
+*/
 public interface DiseaseAncillaryService extends IService<DiseaseAncillary> {
 
     List<DiseaseAncillaryDto> queryDiseaseAncillaryDtoList(DiseaseAncillary diseaseAncillary);
diff --git a/virtual-patient-model/src/main/java/com/supervision/service/DiseasePhysicalService.java b/virtual-patient-model/src/main/java/com/supervision/service/DiseasePhysicalService.java
index 2efdd69c..65b81691 100644
--- a/virtual-patient-model/src/main/java/com/supervision/service/DiseasePhysicalService.java
+++ b/virtual-patient-model/src/main/java/com/supervision/service/DiseasePhysicalService.java
@@ -8,10 +8,10 @@ import com.supervision.vo.manage.DiseasePhysicalStrResVo;
 import java.util.List;
 
 /**
- * @author flevance
- * @description 针对表【vp_disease_physical(疾病体格检查)】的数据库操作Service
- * @createDate 2023-10-20 17:19:21
- */
+* @author flevance
+* @description 针对表【vp_disease_physical(疾病体格检查)】的数据库操作Service
+* @createDate 2023-10-20 17:19:21
+*/
 public interface DiseasePhysicalService extends IService<DiseasePhysical> {
 
     List<DiseasePhysicalResVo> queryListByDiseaseId(String diseaseId);
diff --git a/virtual-patient-model/src/main/java/com/supervision/service/DiseaseService.java b/virtual-patient-model/src/main/java/com/supervision/service/DiseaseService.java
index 2152c7cc..4407695b 100644
--- a/virtual-patient-model/src/main/java/com/supervision/service/DiseaseService.java
+++ b/virtual-patient-model/src/main/java/com/supervision/service/DiseaseService.java
@@ -1,6 +1,7 @@
 package com.supervision.service;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.supervision.dto.UploadDiseaseDTO;
 import com.supervision.model.Disease;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.supervision.vo.manage.DiseaseReqVo;
@@ -33,4 +34,21 @@ public interface DiseaseService extends IService<Disease> {
     List<String> queryAllDiseaseListByDiseaseId(List<String> diseaseId);
 
 
+    /**
+     * 根据疾病编码查询
+     *
+     * @param codeId
+     * @return
+     */
+    List<String> queryDiseaseListByDiseaseCode(List<String> codeId);
+
+
+    /**
+     * 保存
+     * @param uploadDiseaseResVos
+     * @return
+     */
+    Disease saveDisease(List<UploadDiseaseDTO> uploadDiseaseResVos);
+
+
 }
diff --git a/virtual-patient-model/src/main/java/com/supervision/service/MedicalRecService.java b/virtual-patient-model/src/main/java/com/supervision/service/MedicalRecService.java
index 14ff6e35..39d91d16 100644
--- a/virtual-patient-model/src/main/java/com/supervision/service/MedicalRecService.java
+++ b/virtual-patient-model/src/main/java/com/supervision/service/MedicalRecService.java
@@ -7,10 +7,10 @@ import com.supervision.vo.manage.MedicalRecPageReqVO;
 import com.supervision.vo.manage.MedicalRecPageResVO;
 
 /**
-* @author flevance
-* @description 针对表【vp_medical_rec(病历表)】的数据库操作Service
-* @createDate 2023-11-03 11:25:43
-*/
+ * @author flevance
+ * @description 针对表【vp_medical_rec(病历表)】的数据库操作Service
+ * @createDate 2023-11-03 11:25:43
+ */
 public interface MedicalRecService extends IService<MedicalRec> {
 
     /**
@@ -26,7 +26,7 @@ public interface MedicalRecService extends IService<MedicalRec> {
      * 生成一个病历编码,是最大的病历编码+1
      * @param code 医院名称缩写
      * @param gender 性别 M 男 F 女
-     * @param id 记录ID
+     * @param id     记录ID
      */
     void updateMedicalRecNo(String code,String gender,String id);
 
diff --git a/virtual-patient-model/src/main/java/com/supervision/service/impl/AskTemplateQuestionSimilarityServiceImpl.java b/virtual-patient-model/src/main/java/com/supervision/service/impl/AskTemplateQuestionSimilarityServiceImpl.java
index b6e71d47..ea971c50 100644
--- a/virtual-patient-model/src/main/java/com/supervision/service/impl/AskTemplateQuestionSimilarityServiceImpl.java
+++ b/virtual-patient-model/src/main/java/com/supervision/service/impl/AskTemplateQuestionSimilarityServiceImpl.java
@@ -14,13 +14,13 @@ import java.util.Map;
 import java.util.stream.Collectors;
 
 /**
-* @author Administrator
-* @description 针对表【vp_ask_template_question_similarity(相似问问题库)】的数据库操作Service实现
-* @createDate 2024-06-06 16:31:25
-*/
+ * @author Administrator
+ * @description 针对表【vp_ask_template_question_similarity(相似问问题库)】的数据库操作Service实现
+ * @createDate 2024-06-06 16:31:25
+ */
 @Service
 public class AskTemplateQuestionSimilarityServiceImpl extends ServiceImpl<AskTemplateQuestionSimilarityMapper, AskTemplateQuestionSimilarity>
-    implements AskTemplateQuestionSimilarityService{
+        implements AskTemplateQuestionSimilarityService {
 
     @Override
     public Map<String, List<String>> querySimilarityQuestionMapByLibraryIds(List<String> libraryIdList) {
@@ -31,9 +31,9 @@ public class AskTemplateQuestionSimilarityServiceImpl extends ServiceImpl<AskTem
                 .collect(Collectors.groupingBy(AskTemplateQuestionSimilarity::getLibraryId,
                         Collectors.mapping(AskTemplateQuestionSimilarity::getSimilarityQuestion, Collectors.toList())));
 
-        if (CollUtil.isNotEmpty(libraryIdList)){
+        if (CollUtil.isNotEmpty(libraryIdList)) {
             for (String libraryId : libraryIdList) {
-                if (!similarityMap.containsKey(libraryId)){
+                if (!similarityMap.containsKey(libraryId)) {
                     similarityMap.put(libraryId, new ArrayList<>());
                 }
             }
@@ -45,11 +45,23 @@ public class AskTemplateQuestionSimilarityServiceImpl extends ServiceImpl<AskTem
     @Override
     public Map<String, List<String>> querySimilarityQuestionMapByLibraryLists(List<AskTemplateQuestionLibrary> libraryList) {
         List<String> libraryIdList = new ArrayList<>();
-        if (CollUtil.isNotEmpty(libraryList)){
+        if (CollUtil.isNotEmpty(libraryList)) {
             libraryIdList = libraryList.stream().map(AskTemplateQuestionLibrary::getId).collect(Collectors.toList());
         }
         return querySimilarityQuestionMapByLibraryIds(libraryIdList);
     }
+
+    /**
+     * 查询相似问题
+     *
+     * @param nameZh             中文名
+     * @param similarityQuestion 相似问题
+     * @return
+     */
+    @Override
+    public AskTemplateQuestionSimilarity querySimilarityQuestionByNameZhAndSimilarityQuestion(String nameZh, String similarityQuestion) {
+        return this.baseMapper.querySimilarityQuestionByNameZhAndSimilarityQuestion(nameZh, similarityQuestion);
+    }
 }
 
 
diff --git a/virtual-patient-model/src/main/java/com/supervision/service/impl/CommonDicServiceImpl.java b/virtual-patient-model/src/main/java/com/supervision/service/impl/CommonDicServiceImpl.java
index 08876cda..bea975c3 100644
--- a/virtual-patient-model/src/main/java/com/supervision/service/impl/CommonDicServiceImpl.java
+++ b/virtual-patient-model/src/main/java/com/supervision/service/impl/CommonDicServiceImpl.java
@@ -28,7 +28,7 @@ public class CommonDicServiceImpl extends ServiceImpl<CommonDicMapper, CommonDic
         List<CommonDic> list = new ArrayList<>();
         if (StrUtil.isBlank(groupCode)) {
             list = super.lambdaQuery().list();
-        }else {
+        } else {
             list = super.lambdaQuery().eq(CommonDic::getGroupCode, groupCode).list();
         }
         Map<Long, List<CommonDic>> commonDicParentIdMap = list.stream().filter(e -> ObjectUtil.isNotNull(e.getParentId()))
@@ -58,6 +58,22 @@ public class CommonDicServiceImpl extends ServiceImpl<CommonDicMapper, CommonDic
         }
     }
 
+
+    /**
+     * 查询字典表的配置
+     * @param code
+     * @return
+     */
+    public Long queryCommonDictTreeByCode(ArrayList<String> code) {
+        return this.lambdaQuery()
+                .eq(CommonDic::getGroupCode, "AQT")
+                .ne(CommonDic::getParentId, "179")
+                .in(CommonDic::getCode, code)
+                .isNotNull(CommonDic::getParentId)
+                .count();
+    }
+
+
 }
 
 
diff --git a/virtual-patient-model/src/main/java/com/supervision/service/impl/ConfigAncillaryItemServiceImpl.java b/virtual-patient-model/src/main/java/com/supervision/service/impl/ConfigAncillaryItemServiceImpl.java
index 3ad3f609..1ef7ed57 100644
--- a/virtual-patient-model/src/main/java/com/supervision/service/impl/ConfigAncillaryItemServiceImpl.java
+++ b/virtual-patient-model/src/main/java/com/supervision/service/impl/ConfigAncillaryItemServiceImpl.java
@@ -91,6 +91,15 @@ public class ConfigAncillaryItemServiceImpl extends ServiceImpl<ConfigAncillaryI
         return super.lambdaQuery().like(StrUtil.isNotEmpty(keyWord), ConfigAncillaryItem::getItemName, keyWord)
                 .or().like(StrUtil.isNotEmpty(keyWord), ConfigAncillaryItem::getType, keyWord).list();
     }
+
+
+    @Override
+    public ConfigAncillaryItem queryAncillaryItem(String name1, String name2) {
+        return this.lambdaQuery()
+                .eq(ConfigAncillaryItem::getType, name1)
+                .eq(ConfigAncillaryItem::getItemName, name2)
+                .one();
+    }
 }
 
 
diff --git a/virtual-patient-model/src/main/java/com/supervision/service/impl/ConfigPhysicalLocationServiceImpl.java b/virtual-patient-model/src/main/java/com/supervision/service/impl/ConfigPhysicalLocationServiceImpl.java
index 7a4940c5..99948223 100644
--- a/virtual-patient-model/src/main/java/com/supervision/service/impl/ConfigPhysicalLocationServiceImpl.java
+++ b/virtual-patient-model/src/main/java/com/supervision/service/impl/ConfigPhysicalLocationServiceImpl.java
@@ -7,14 +7,22 @@ import com.supervision.mapper.ConfigPhysicalLocationMapper;
 import org.springframework.stereotype.Service;
 
 /**
-* @author flevance
-* @description 针对表【vp_config_physical_location(体格检查位置表配置表)】的数据库操作Service实现
-* @createDate 2023-10-20 17:19:21
-*/
+ * @author flevance
+ * @description 针对表【vp_config_physical_location(体格检查位置表配置表)】的数据库操作Service实现
+ * @createDate 2023-10-20 17:19:21
+ */
 @Service
 public class ConfigPhysicalLocationServiceImpl extends ServiceImpl<ConfigPhysicalLocationMapper, ConfigPhysicalLocation>
-    implements ConfigPhysicalLocationService{
+        implements ConfigPhysicalLocationService {
 
+
+    @Override
+    public ConfigPhysicalLocation queryLocationTreeForLocationName(String locationName, String level) {
+        return this.lambdaQuery()
+                .eq(ConfigPhysicalLocation::getLocationName, locationName)
+                .ne(ConfigPhysicalLocation::getLevel, level)
+                .one();
+    }
 }
 
 
diff --git a/virtual-patient-model/src/main/java/com/supervision/service/impl/ConfigPhysicalToolServiceImpl.java b/virtual-patient-model/src/main/java/com/supervision/service/impl/ConfigPhysicalToolServiceImpl.java
index 286ce277..8284c982 100644
--- a/virtual-patient-model/src/main/java/com/supervision/service/impl/ConfigPhysicalToolServiceImpl.java
+++ b/virtual-patient-model/src/main/java/com/supervision/service/impl/ConfigPhysicalToolServiceImpl.java
@@ -40,6 +40,16 @@ public class ConfigPhysicalToolServiceImpl extends ServiceImpl<ConfigPhysicalToo
             return tool;
         }).sorted(Comparator.comparingInt(ConfigPhysicalToolResVO::getPriority)).collect(Collectors.toList());
     }
+
+
+    @Override
+    public ConfigPhysicalTool queryPhysicalToolByTypeAndToolName(String type, String toolName) {
+        ConfigPhysicalTool configPhysicalTool = this.lambdaQuery()
+                .eq(ConfigPhysicalTool::getType, type)
+                .eq(ConfigPhysicalTool::getToolName, toolName)
+                .one();
+        return configPhysicalTool;
+    }
 }
 
 
diff --git a/virtual-patient-model/src/main/java/com/supervision/service/impl/DiseaseAncillaryServiceImpl.java b/virtual-patient-model/src/main/java/com/supervision/service/impl/DiseaseAncillaryServiceImpl.java
index a6d9e740..978cf379 100644
--- a/virtual-patient-model/src/main/java/com/supervision/service/impl/DiseaseAncillaryServiceImpl.java
+++ b/virtual-patient-model/src/main/java/com/supervision/service/impl/DiseaseAncillaryServiceImpl.java
@@ -16,14 +16,14 @@ import java.util.List;
 import java.util.function.Supplier;
 
 /**
- * @author flevance
- * @description 针对表【vp_disease_ancillary(疾病辅助检查)】的数据库操作Service实现
- * @createDate 2023-10-20 17:19:21
- */
+* @author flevance
+* @description 针对表【vp_disease_ancillary(疾病辅助检查)】的数据库操作Service实现
+* @createDate 2023-10-20 17:19:21
+*/
 @Service
 @RequiredArgsConstructor
 public class DiseaseAncillaryServiceImpl extends ServiceImpl<DiseaseAncillaryMapper, DiseaseAncillary>
-        implements DiseaseAncillaryService{
+    implements DiseaseAncillaryService{
 
     @Override
     public List<DiseaseAncillaryDto> queryDiseaseAncillaryDtoList(DiseaseAncillary diseaseAncillary) {
diff --git a/virtual-patient-model/src/main/java/com/supervision/service/impl/DiseasePhysicalServiceImpl.java b/virtual-patient-model/src/main/java/com/supervision/service/impl/DiseasePhysicalServiceImpl.java
index d89cb503..08d77ed4 100644
--- a/virtual-patient-model/src/main/java/com/supervision/service/impl/DiseasePhysicalServiceImpl.java
+++ b/virtual-patient-model/src/main/java/com/supervision/service/impl/DiseasePhysicalServiceImpl.java
@@ -11,13 +11,13 @@ import org.springframework.stereotype.Service;
 import java.util.List;
 
 /**
- * @author flevance
- * @description 针对表【vp_disease_physical(疾病体格检查)】的数据库操作Service实现
- * @createDate 2023-10-20 17:19:21
- */
+* @author flevance
+* @description 针对表【vp_disease_physical(疾病体格检查)】的数据库操作Service实现
+* @createDate 2023-10-20 17:19:21
+*/
 @Service
 public class DiseasePhysicalServiceImpl extends ServiceImpl<DiseasePhysicalMapper, DiseasePhysical>
-        implements DiseasePhysicalService{
+    implements DiseasePhysicalService{
 
     @Override
     public List<DiseasePhysicalResVo> queryListByDiseaseId(String diseaseId) {
diff --git a/virtual-patient-model/src/main/java/com/supervision/service/impl/DiseaseServiceImpl.java b/virtual-patient-model/src/main/java/com/supervision/service/impl/DiseaseServiceImpl.java
index f98a07f1..58993854 100644
--- a/virtual-patient-model/src/main/java/com/supervision/service/impl/DiseaseServiceImpl.java
+++ b/virtual-patient-model/src/main/java/com/supervision/service/impl/DiseaseServiceImpl.java
@@ -5,30 +5,34 @@ import cn.hutool.core.lang.Assert;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.supervision.dto.UploadDiseaseDTO;
 import com.supervision.model.Disease;
 import com.supervision.service.DiseaseService;
 import com.supervision.mapper.DiseaseMapper;
+import com.supervision.util.StringChartUtil;
+import com.supervision.util.UserUtil;
 import com.supervision.vo.manage.DiseaseReqVo;
 import org.springframework.stereotype.Service;
 
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.List;
 import java.util.Objects;
 
 /**
-* @author flevance
-* @description 针对表【vp_disease(疾病名称)】的数据库操作Service实现
-* @createDate 2023-10-20 17:19:21
-*/
+ * @author flevance
+ * @description 针对表【vp_disease(疾病名称)】的数据库操作Service实现
+ * @createDate 2023-10-20 17:19:21
+ */
 @Service
 public class DiseaseServiceImpl extends ServiceImpl<DiseaseMapper, Disease>
-    implements DiseaseService{
+        implements DiseaseService {
 
     @Override
     public List<Disease> listDiseaseNestIfComposite(String id) {
         Assert.notEmpty(id, "id is not allow empty");
         Disease disease = super.getById(id);
-        if (!isCompositeDisease(disease) || CollUtil.isEmpty(disease.getContainDiseaseIds())){
+        if (!isCompositeDisease(disease) || CollUtil.isEmpty(disease.getContainDiseaseIds())) {
             return CollUtil.newArrayList(disease);
         }
 
@@ -42,7 +46,7 @@ public class DiseaseServiceImpl extends ServiceImpl<DiseaseMapper, Disease>
 
     @Override
     public List<String> queryAllDiseaseListByDiseaseId(List<String> diseaseId) {
-        if (CollUtil.isEmpty(diseaseId)){
+        if (CollUtil.isEmpty(diseaseId)) {
             return new ArrayList<>();
         }
         return this.baseMapper.queryAllDiseaseListByDiseaseId(diseaseId);
@@ -50,24 +54,68 @@ public class DiseaseServiceImpl extends ServiceImpl<DiseaseMapper, Disease>
 
     /**
      * 是否是复合疾病
+     *
      * @param disease 疾病
      * @return true 是复合疾病 false 不是复合疾病
      */
-    private boolean isCompositeDisease(Disease disease){
+    private boolean isCompositeDisease(Disease disease) {
 
-        if (Objects.isNull(disease)){
+        if (Objects.isNull(disease)) {
             return false;
         }
         return isCompositeDisease(disease.getDiseaseType());
     }
 
-    private boolean isCompositeDisease(Integer integer){
-        if (Objects.isNull(integer)){
+    private boolean isCompositeDisease(Integer integer) {
+        if (Objects.isNull(integer)) {
             return false;
         }
         return Integer.valueOf(1).equals(integer);
     }
 
+
+    @Override
+    public List<String> queryDiseaseListByDiseaseCode(List<String> codeId) {
+        List<String> diseaseIdList = new ArrayList<>();
+        List<Disease> diseaseList = this.lambdaQuery()
+                .select(Disease::getId)
+                .in(Disease::getCode, codeId)
+                .list();
+        for (Disease disease : diseaseList) {
+            String diseaseId = disease.getId();
+            diseaseIdList.add(diseaseId);
+        }
+        return diseaseIdList;
+    }
+
+
+    @Override
+    public Disease saveDisease(List<UploadDiseaseDTO> uploadDiseaseResVos) {
+        UploadDiseaseDTO uploadDiseaseDTO = uploadDiseaseResVos.get(0);
+        // 保存疾病
+        String categoryCode = uploadDiseaseDTO.getCategoryCode();
+        String diseaseClassificationName = uploadDiseaseDTO.getDiseaseClassificationName();
+        String commonName = uploadDiseaseDTO.getCommonName();
+        String mainSymptom = uploadDiseaseDTO.getMainSymptom();
+        int diseaseType = StringChartUtil.countChar(categoryCode, '/') > 0 ? 1 : 0;
+        Disease disease = new Disease();
+        disease.setCode(categoryCode);
+        disease.setDiseaseName(diseaseClassificationName);
+        disease.setDiseaseNameAlias(commonName);
+        disease.setStatus(0);
+        disease.setDiseaseType(diseaseType);
+        if (diseaseType == 1) {
+            List<String> codeIdList = Arrays.stream(categoryCode.split("/")).toList();
+            List<String> listByDiseaseCode = queryDiseaseListByDiseaseCode(codeIdList);
+            Assert.isTrue(listByDiseaseCode.size() != codeIdList.size(), "请检查复合疾病中的单一疾病是否存在");
+            disease.setContainDiseaseIds(listByDiseaseCode);
+        }
+        disease.setSymptom(mainSymptom);
+        disease.setCreateUserId(UserUtil.getUser().getId());
+        disease.setUpdateUserId(UserUtil.getUser().getId());
+        save(disease);
+        return disease;
+    }
 }
 
 
diff --git a/virtual-patient-model/src/main/java/com/supervision/util/StringChartUtil.java b/virtual-patient-model/src/main/java/com/supervision/util/StringChartUtil.java
new file mode 100644
index 00000000..276c7c5c
--- /dev/null
+++ b/virtual-patient-model/src/main/java/com/supervision/util/StringChartUtil.java
@@ -0,0 +1,24 @@
+package com.supervision.util;
+
+import java.util.Arrays;
+
+/**
+ * @Author:longbao
+ * @Date:2024/11/1 13:52
+ * @Description:
+ */
+public class StringChartUtil {
+
+
+    /**
+     * 字符串中某个字符出现的次数
+     * @param str 源字符串
+     * @param targetChar 查找字符
+     * @return 出现次数
+     */
+    public static int countChar(String str, char targetChar) {
+        return (int) Arrays.stream(str.split(""))
+                .filter(s -> s.charAt(0) == targetChar)
+                .count();
+    }
+}
diff --git a/virtual-patient-model/src/main/resources/mapper/AskTemplateQuestionLibraryMapper.xml b/virtual-patient-model/src/main/resources/mapper/AskTemplateQuestionLibraryMapper.xml
index 96d5d6a7..528a46e1 100644
--- a/virtual-patient-model/src/main/resources/mapper/AskTemplateQuestionLibraryMapper.xml
+++ b/virtual-patient-model/src/main/resources/mapper/AskTemplateQuestionLibraryMapper.xml
@@ -73,4 +73,17 @@
     <select id="queryPageList"  resultMap="askQuestionLibraryResultMap"  resultType="com.supervision.vo.manage.AskQuestionLibraryResVo">
         <include refid="queryListsql"></include>
     </select>
+
+
+    <select id="queryByName" resultType="java.lang.String"
+            parameterType="java.lang.String">
+        select l.id
+        from vp_ask_template_question_library l
+        where l.dict_id = (select id
+                           from vp_common_dic d
+                           where d.parent_id IS NOT NULL
+                             and d.group_code = 'AQT'
+                             and d.parent_id != '179'
+          and d.name_zh = (#{nameZh}))
+    </select>
 </mapper>
diff --git a/virtual-patient-model/src/main/resources/mapper/AskTemplateQuestionSimilarityMapper.xml b/virtual-patient-model/src/main/resources/mapper/AskTemplateQuestionSimilarityMapper.xml
index 9dee8606..d72d6e20 100644
--- a/virtual-patient-model/src/main/resources/mapper/AskTemplateQuestionSimilarityMapper.xml
+++ b/virtual-patient-model/src/main/resources/mapper/AskTemplateQuestionSimilarityMapper.xml
@@ -5,18 +5,37 @@
 <mapper namespace="com.supervision.mapper.AskTemplateQuestionSimilarityMapper">
 
     <resultMap id="BaseResultMap" type="com.supervision.model.AskTemplateQuestionSimilarity">
-            <id property="id" column="id" jdbcType="VARCHAR"/>
-            <result property="libraryId" column="library_id" jdbcType="VARCHAR"/>
-            <result property="similarityQuestion" column="similarity_question" jdbcType="VARCHAR"/>
-            <result property="createUserId" column="create_user_id" jdbcType="VARCHAR"/>
-            <result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
-            <result property="updateUserId" column="update_user_id" jdbcType="VARCHAR"/>
-            <result property="updateTime" column="update_time" jdbcType="TIMESTAMP"/>
+        <id property="id" column="id" jdbcType="VARCHAR"/>
+        <result property="libraryId" column="library_id" jdbcType="VARCHAR"/>
+        <result property="similarityQuestion" column="similarity_question" jdbcType="VARCHAR"/>
+        <result property="createUserId" column="create_user_id" jdbcType="VARCHAR"/>
+        <result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
+        <result property="updateUserId" column="update_user_id" jdbcType="VARCHAR"/>
+        <result property="updateTime" column="update_time" jdbcType="TIMESTAMP"/>
     </resultMap>
 
     <sql id="Base_Column_List">
-        id,library_id,similarity_question,
+        id
+        ,library_id,similarity_question,
         create_user_id,create_time,update_user_id,
         update_time
     </sql>
+
+
+    <select id="querySimilarityQuestionByNameZhAndSimilarityQuestion" resultMap="BaseResultMap"
+            resultType="java.lang.String">
+        select *
+        from vp_ask_template_question_similarity s
+        where s.library_id = (select l.id
+                              from vp_ask_template_question_library l
+                              where l.dict_id = (select id
+                                                 from vp_common_dic d
+                                                 where d.parent_id IS NOT NULL
+                                                   and d.group_code = 'AQT'
+                                                   and d.parent_id != '179'
+          and d.name_zh = (#{nameZh})))
+          and similarity_question = #{similarityQuestion};
+    </select>
+
+
 </mapper>
diff --git a/virtual-patient-model/src/main/resources/mapper/DiseaseAncillaryMapper.xml b/virtual-patient-model/src/main/resources/mapper/DiseaseAncillaryMapper.xml
index f406fa40..ff932875 100644
--- a/virtual-patient-model/src/main/resources/mapper/DiseaseAncillaryMapper.xml
+++ b/virtual-patient-model/src/main/resources/mapper/DiseaseAncillaryMapper.xml
@@ -90,10 +90,10 @@
                da.item_id                           as itemId,
                cai.item_name                        as itemName,
                cai.type                             as itemType,
-               da.primarily_diagnosis_criteria_flag as primarilyDiagnosisCriteriaFlag,
-               da.basis_confirm_flag                as basisConfirmFlag,
-               da.basis_identification_flag         as basisIdentificationFlag,
-               da.full_check_flag                   as fullCheckFlag,
+               case ifnull(da.primarily_diagnosis_criteria_flag,0) when 0 then null when 1 then '初步诊断依据' end as primarilyDiagnosisCriteriaFlag,
+               case ifnull(da.basis_confirm_flag,0) when 0 then null when 1 then '证实诊断依据' end                as basisConfirmFlag,
+               case ifnull(da.basis_identification_flag,0) when 0 then null when 1 then '鉴别依据' end         as basisIdentificationFlag,
+               case ifnull(da.full_check_flag,0) when 0 then null when 1 then '全面依据' end                   as fullCheckFlag,
                da.diagnosis_assessment_flag         as diagnosisAssessmentFlag,
                da.expected_diagnosis_result         as expectedDiagnosisResult,
                da.require_check_flag                as requireCheckFlag,
diff --git a/virtual-patient-model/src/main/resources/mapper/DiseasePhysicalMapper.xml b/virtual-patient-model/src/main/resources/mapper/DiseasePhysicalMapper.xml
index 27679ca0..b307c72d 100644
--- a/virtual-patient-model/src/main/resources/mapper/DiseasePhysicalMapper.xml
+++ b/virtual-patient-model/src/main/resources/mapper/DiseasePhysicalMapper.xml
@@ -5,25 +5,25 @@
 <mapper namespace="com.supervision.mapper.DiseasePhysicalMapper">
 
     <resultMap id="BaseResultMap" type="com.supervision.model.DiseasePhysical">
-        <id property="id" column="id" jdbcType="VARCHAR"/>
-        <result property="diseaseId" column="disease_id" jdbcType="VARCHAR"/>
-        <result property="toolId" column="tool_id" jdbcType="VARCHAR"/>
-        <result property="locationId" column="location_id" jdbcType="VARCHAR"/>
-        <result property="requireCheckFlag" column="require_check_flag" jdbcType="INTEGER"/>
-        <result property="primarilyDiagnosisCriteriaFlag" column="primarily_diagnosis_criteria_flag" jdbcType="INTEGER"/>
-        <result property="basisConfirmFlag" column="basis_confirm_flag" jdbcType="INTEGER"/>
-        <result property="basisIdentificationFlag" column="basis_identification_flag" jdbcType="INTEGER"/>
-        <result property="diagnosisAssessmentFlag" column="diagnosis_assessment_flag" jdbcType="INTEGER"/>
-        <result property="expectedDiagnosisResult" column="expected_diagnosis_result" jdbcType="VARCHAR"/>
-        <result property="fullCheckFlag" column="full_check_flag" jdbcType="INTEGER"/>
-        <result property="locationDiagnosisFlag" column="location_diagnosis_flag" jdbcType="INTEGER"/>
-        <result property="result" column="result" jdbcType="VARCHAR"/>
-        <result property="normalResult" column="normal_result" jdbcType="VARCHAR"/>
-        <result property="trait" column="trait" jdbcType="VARCHAR"/>
-        <result property="createUserId" column="create_user_id" jdbcType="VARCHAR"/>
-        <result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
-        <result property="updateUserId" column="update_user_id" jdbcType="VARCHAR"/>
-        <result property="updateTime" column="update_time" jdbcType="TIMESTAMP"/>
+            <id property="id" column="id" jdbcType="VARCHAR"/>
+            <result property="diseaseId" column="disease_id" jdbcType="VARCHAR"/>
+            <result property="toolId" column="tool_id" jdbcType="VARCHAR"/>
+            <result property="locationId" column="location_id" jdbcType="VARCHAR"/>
+            <result property="requireCheckFlag" column="require_check_flag" jdbcType="INTEGER"/>
+            <result property="primarilyDiagnosisCriteriaFlag" column="primarily_diagnosis_criteria_flag" jdbcType="INTEGER"/>
+            <result property="basisConfirmFlag" column="basis_confirm_flag" jdbcType="INTEGER"/>
+            <result property="basisIdentificationFlag" column="basis_identification_flag" jdbcType="INTEGER"/>
+            <result property="diagnosisAssessmentFlag" column="diagnosis_assessment_flag" jdbcType="INTEGER"/>
+            <result property="expectedDiagnosisResult" column="expected_diagnosis_result" jdbcType="VARCHAR"/>
+            <result property="fullCheckFlag" column="full_check_flag" jdbcType="INTEGER"/>
+            <result property="locationDiagnosisFlag" column="location_diagnosis_flag" jdbcType="INTEGER"/>
+            <result property="result" column="result" jdbcType="VARCHAR"/>
+            <result property="normalResult" column="normal_result" jdbcType="VARCHAR"/>
+            <result property="trait" column="trait" jdbcType="VARCHAR"/>
+            <result property="createUserId" column="create_user_id" jdbcType="VARCHAR"/>
+            <result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
+            <result property="updateUserId" column="update_user_id" jdbcType="VARCHAR"/>
+            <result property="updateTime" column="update_time" jdbcType="TIMESTAMP"/>
     </resultMap>
 
     <sql id="Base_Column_List">
@@ -70,10 +70,10 @@
                cpl.location_name                    as locationName,
                cpt.tool_name                        as toolName,
                cpt.type                             as toolType,
-               dp.primarily_diagnosis_criteria_flag as primarilyDiagnosisCriteriaFlag,
-               dp.basis_confirm_flag                as basisConfirmFlag,
-               dp.basis_identification_flag         as basisIdentificationFlag,
-               dp.full_check_flag                   as fullCheckFlag,
+               case ifnull(dp.primarily_diagnosis_criteria_flag,0) when 0 then null when 1 then '初步诊断依据' end as primarilyDiagnosisCriteriaFlag,
+               case ifnull(dp.basis_confirm_flag,0) when 0 then null when 1 then '证实诊断依据' end                as basisConfirmFlag,
+               case ifnull(dp.basis_identification_flag,0) when 0 then null when 1 then '鉴别依据' end         as basisIdentificationFlag,
+               case ifnull(dp.full_check_flag,0) when 0 then null when 1 then '全面依据' end                   as fullCheckFlag,
                dp.diagnosis_assessment_flag         as diagnosisAssessmentFlag,
                dp.location_diagnosis_flag           as locationDiagnosisFlag,
                dp.expected_diagnosis_result         as expectedDiagnosisResult,
diff --git a/virtual-patient-web/src/main/java/com/supervision/pojo/vo/DiagnosisResultResVO.java b/virtual-patient-web/src/main/java/com/supervision/pojo/vo/DiagnosisResultResVO.java
index 8138ee90..1e0ae3dc 100644
--- a/virtual-patient-web/src/main/java/com/supervision/pojo/vo/DiagnosisResultResVO.java
+++ b/virtual-patient-web/src/main/java/com/supervision/pojo/vo/DiagnosisResultResVO.java
@@ -21,8 +21,11 @@ public class DiagnosisResultResVO {
     @Schema(description = "鉴别诊断依据")
     private BasisIdentificationResultResVO basisIdentificationResult;
 
-    @Schema(description = "全面检查-(暂无相关数据)")
-    private FullCheckResVO fullCheck;
+//    @Schema(description = "全面检查-(暂无相关数据)")
+//    private FullCheckResVO fullCheck;
+    // 2024.11.05:与周霞沟通后修改全面检查字段为 *预期诊断结果
+    @Schema(description = "预期诊断结果")
+    private String fullCheck;
 
     @Schema(description = "处置方案")
     private DealPlanResVO dealPlan;
diff --git a/virtual-patient-web/src/main/java/com/supervision/service/impl/AskDiagnosisResultServiceImpl.java b/virtual-patient-web/src/main/java/com/supervision/service/impl/AskDiagnosisResultServiceImpl.java
index 50d91c1b..64c2e3bf 100644
--- a/virtual-patient-web/src/main/java/com/supervision/service/impl/AskDiagnosisResultServiceImpl.java
+++ b/virtual-patient-web/src/main/java/com/supervision/service/impl/AskDiagnosisResultServiceImpl.java
@@ -62,6 +62,12 @@ public class AskDiagnosisResultServiceImpl implements AskDiagnosisResultService
 
     private final DiseaseAncillaryService diseaseAncillaryService;
 
+    public static <K> Predicate<K> distinctPredicateNotNull(Function<K, Object> function) {
+        ConcurrentHashMap<Object, Boolean> map = new ConcurrentHashMap<>();
+        // 根据key进行去重,并排除为null的数据
+        return t -> null != function.apply(t) && null == map.putIfAbsent(function.apply(t), true);
+
+    }
 
     @Override
     public DiagnosisResultResVO queryDiagnosisResult(String processId) {
@@ -79,7 +85,8 @@ public class AskDiagnosisResultServiceImpl implements AskDiagnosisResultService
         // 4.生成鉴别诊断依据
         diagnosisResultResVO.setBasisIdentificationResult(createBasisIdentificationResult(medicalRec, processId));
         // 5.全面检查-(暂无相关数据) 后面再看
-        diagnosisResultResVO.setFullCheck(null);
+        // 2024.11.05:与周霞沟通后修改全面检查字段为 *预期诊断结果
+        diagnosisResultResVO.setFullCheck(medicalRec.getFullCheck());
         // 6.处置方案
         diagnosisResultResVO.setDealPlan(createDealPlan(process.getDiseaseId(), processId));
         return diagnosisResultResVO;
@@ -194,7 +201,6 @@ public class AskDiagnosisResultServiceImpl implements AskDiagnosisResultService
         return basisPrimaryResultResVO;
     }
 
-
     private List<BasisDiagnosisNodeResVO> qaRecordMergeListsBasisPrimary(List<DiagnosisQaRecord> qaRecordList, List<AskPatientAnswer> list) {
 
         BiFunction<DiagnosisQaRecord, AskPatientAnswer, Boolean> biFunction = (qaRecord, qa) -> qa.getLibraryQuestionId().equals(qaRecord.getQuestionLibraryId());
@@ -209,7 +215,6 @@ public class AskDiagnosisResultServiceImpl implements AskDiagnosisResultService
         return mergeListsBasedOnCondition(qaRecordList, list, biFunction, t1, t2);
     }
 
-
     private List<BasisDiagnosisNodeResVO> physicalRecordMergeLists(List<PhysicalRecordByResultDTO> physicalRecordList,
                                                                    List<DiseasePhysicalResVo> diseasePhysicalResVos,
                                                                    Function<PhysicalRecordByResultDTO, Integer> functionCorrect) {
@@ -290,7 +295,6 @@ public class AskDiagnosisResultServiceImpl implements AskDiagnosisResultService
                 AncillaryRecordByResultDTO::getPrimarilyDiagnosisCriteriaFlag);
     }
 
-
     private List<BasisDiagnosisNodeResVO> ancillaryRecordMergeListsConfirm(List<AncillaryRecordByResultDTO> ancillaryRecordList,
                                                                            List<DiseaseAncillaryResVo> diseaseAncillaryResVos) {
 
@@ -391,14 +395,6 @@ public class AskDiagnosisResultServiceImpl implements AskDiagnosisResultService
         return expertDiagnosisResultResVO;
     }
 
-
-    public static <K> Predicate<K> distinctPredicateNotNull(Function<K, Object> function) {
-        ConcurrentHashMap<Object, Boolean> map = new ConcurrentHashMap<>();
-        // 根据key进行去重,并排除为null的数据
-        return t -> null != function.apply(t) && null == map.putIfAbsent(function.apply(t), true);
-
-    }
-
     /**
      * 生成雷达图
      * <p>