Browse Source

Merge branch 'master' into 'master'

慢病管理调查问卷填写

See merge request lighter/web-server!63
huangshuhua 1 year ago
parent
commit
496d80fec3

+ 6 - 1
src/main/java/thyyxxk/webserver/constants/YbTjConstant.java

@@ -47,6 +47,11 @@ public class YbTjConstant {
     /**
      *  慢特病泰和医院标志
      */
-    public static final String CRM_YY_TH = "TH_";
+    public static final String CRM_YY_TH = "TH-";
+
+    /**
+     * 慢特病科室编码
+     */
+    public static final String CRM_DEPT_CODE = "3400020";
 
 }

+ 9 - 0
src/main/java/thyyxxk/webserver/controller/bodyexam/BodyExamController.java

@@ -2,10 +2,13 @@ package thyyxxk.webserver.controller.bodyexam;
 
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
+import thyyxxk.webserver.config.auth.PassToken;
 import thyyxxk.webserver.entity.ResultVo;
 import thyyxxk.webserver.service.bodyexam.BodyExamService;
 
@@ -54,4 +57,10 @@ public class BodyExamController {
         return service.getTjReportModuleInfo(map);
     }
 
+    @PassToken
+    @GetMapping("/selectTjReportInfoById")
+    public ResultVo<Map> selectTjReportInfoById(@RequestParam("tjId") String tjId){
+        return service.selectTjReportInfoById(tjId);
+    }
+
 }

+ 33 - 0
src/main/java/thyyxxk/webserver/controller/chronicDisease/ChronicDiseaseController.java

@@ -1,5 +1,6 @@
 package thyyxxk.webserver.controller.chronicDisease;
 
+import com.alibaba.fastjson.JSONArray;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PostMapping;
@@ -7,10 +8,14 @@ import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
+import thyyxxk.webserver.config.auth.PassToken;
 import thyyxxk.webserver.entity.ResultVo;
 import thyyxxk.webserver.entity.chronicDisease.CrmPatientMi;
+import thyyxxk.webserver.entity.chronicDisease.CrmVisitRecord;
+import thyyxxk.webserver.entity.chronicDisease.CrmVisitRecordVo;
 import thyyxxk.webserver.entity.dictionary.CodeName;
 import thyyxxk.webserver.service.chronicDisease.ChronicDiseaseService;
+import thyyxxk.webserver.utils.ResultVoUtil;
 
 import java.util.List;
 import java.util.Map;
@@ -37,6 +42,7 @@ public class ChronicDiseaseController {
         return service.selectCrmPatientMiByCode(keyCode);
     }
 
+    @PassToken
     @PostMapping("/saveCrmPatientMi")
     public ResultVo<Map<String, Object>> saveCrmPatientMi(@RequestBody @Validated CrmPatientMi mi){
         return service.saveCrmPatientMi(mi);
@@ -47,19 +53,46 @@ public class ChronicDiseaseController {
         return service.updateCrmPatientMi(mi);
     }
 
+    @PassToken
     @GetMapping("/getCrmDictionary")
     public ResultVo<Map<String, List<CodeName>>> getCrmDictionary(){
         return service.getCrmDictionary();
     }
 
+    @PassToken
     @GetMapping("/getCrmCityByCode")
     public ResultVo<List<CodeName>> getCrmCityByCode(@RequestParam("code") String code){
         return service.getCrmCityByCode(code);
     }
 
+    @PassToken
     @GetMapping("/getCrmAreaByCode")
     public ResultVo<List<CodeName>> getCrmAreaByCode(@RequestParam("code") String code){
         return service.getCrmAreaByCode(code);
     }
 
+    @PassToken
+    @GetMapping("/getCrmEmrModel")
+    public ResultVo<JSONArray> getCrmEmrModel(){
+        return ResultVoUtil.success(service.getCrmEmrModel());
+    }
+
+    @PassToken
+    @PostMapping("/queryCrmEmrTree")
+    public ResultVo<List<CrmVisitRecord>> queryCrmEmrTree(@RequestBody CrmVisitRecord param){
+        return ResultVoUtil.success(service.queryCrmEmrTree(param));
+    }
+
+    @PassToken
+    @GetMapping("/queryCrmPatientInfoByCode")
+    public ResultVo<CrmPatientMi>  queryCrmPatientInfoByCode(@RequestParam("code") String code){
+        return service.queryCrmPatientInfoByCode(code);
+    }
+
+    @PassToken
+    @PostMapping("/saveCrmEmrModel")
+    public ResultVo<String>  saveCrmEmrModel(@RequestBody CrmVisitRecord param){
+        return service.saveCrmEmrModel(param);
+    }
+
 }

+ 13 - 0
src/main/java/thyyxxk/webserver/dao/his/bodyexam/BodyExamDao.java

@@ -0,0 +1,13 @@
+package thyyxxk.webserver.dao.his.bodyexam;
+
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
+
+@Mapper
+public interface BodyExamDao {
+
+    @Select( " select tj_no from mz_patient_mi where patient_id = #{tjId} or social_no = #{tjId} or tj_no = #{tjId}")
+    String getTjIdByCode(@Param("tjId") String tjId);
+
+}

+ 3 - 0
src/main/java/thyyxxk/webserver/dao/his/chronicDisease/ChronicDiseaseDao.java

@@ -35,4 +35,7 @@ public interface ChronicDiseaseDao {
     @Select("select rtrim(code) as code, rtrim(name) as name from t_zd_psn_cert_type ")
     List<CodeName> getPsnCertType();
 
+    @Select("select rtrim(code) as code, rtrim(name) as name from crm_zd_admiss_way ")
+    List<CodeName> getAdmissWay();
+
 }

+ 2 - 2
src/main/java/thyyxxk/webserver/dao/his/chronicDisease/CrmPatientMiDao.java

@@ -8,13 +8,13 @@ import thyyxxk.webserver.entity.chronicDisease.CrmPatientMi;
 
 public interface CrmPatientMiDao extends BaseMapper<CrmPatientMi> {
 
-    @Select(" select mi.*, tz.height, tz.weight, tz.temperature, tz.respiratory_rate, tz.heart_rate, " +
+    @Select(" select top 1 mi.*, tz.height, tz.weight, tz.temperature, tz.respiratory_rate, tz.heart_rate, " +
             " tz.blood_sugar, tz.blood_pressure_high, tz.blood_pressure_low, tz.blood_oxygen, rtrim(p.name) as referPhysicianName " +
             " from crm_patient_mi mi" +
             " left join crm_patient_tzxx tz on (mi.p_id = tz.p_id collate Chinese_PRC_BIN) and mi.visit_times = tz.visit_times " +
             " left join a_employee_mi p on mi.refer_physician = p.code collate Chinese_PRC_BIN " +
             " where mi.social_no = #{keyCode} or mi.his_mz_no = #{keyCode} or mi.his_zy_no = #{keyCode} or mi.his_tj_no = #{keyCode}" +
-            " or mi.p_name like '%${keyCode}%' or mi.p_id = #{keyCode} ")
+            " or mi.p_name = #{keyCode} or mi.p_id = #{keyCode} ")
     CrmPatientMi selectCrmPatientMiByCode(@Param("keyCode") String keyCode);
 
     @Select(" select * from crm_patient_mi where social_no = #{socialNo} ")

+ 31 - 0
src/main/java/thyyxxk/webserver/dao/his/chronicDisease/CrmVisitRecordDao.java

@@ -0,0 +1,31 @@
+package thyyxxk.webserver.dao.his.chronicDisease;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
+import thyyxxk.webserver.entity.chronicDisease.CrmVisitRecord;
+import thyyxxk.webserver.entity.chronicDisease.CrmVisitRecordVo;
+
+@Mapper
+public interface CrmVisitRecordDao extends BaseMapper<CrmVisitRecord> {
+
+    @Select(" select top 1 name, case when sex = 1 then '男' when sex = 2 then '女' else '未知' end sex," +
+            " age,birth_day,social_no, patient_id as hisMzNo, times " +
+            " from mz_patient_mi " +
+            " where patient_id = #{keyCode} or social_no = #{keyCode} ")
+    CrmVisitRecordVo selectCrmEmrPatientVoByMzCode(@Param("keyCode") String keyCode);
+
+    @Select(" select top 1 name, case when sex = 1 then '男' when sex = 2 then '女' else '未知' end sex, " +
+            " birth_date as birth_day, social_no, inpatient_no as hisZyNo, mz_no as hisMzNo " +
+            " from a_patient_mi " +
+            " where inpatient_no = #{keyCode} or social_no = #{keyCode} ")
+    CrmVisitRecordVo selectCrmEmrPatientVoByZyCode(@Param("keyCode") String keyCode);
+
+    @Select(" select top 1 inpatient_no from a_patient_mi where mz_no=  #{patientId} ")
+    String selectPatNo(String patientId);
+
+    @Select(" select max(visit_times) as times from crm_visit_record where p_id = #{pId} ")
+    Integer selectCrmEmrPatientMaxById(@Param("pId") String pId);
+
+}

+ 125 - 0
src/main/java/thyyxxk/webserver/entity/chronicDisease/CrmEmrPatientData.java

@@ -0,0 +1,125 @@
+package thyyxxk.webserver.entity.chronicDisease;
+
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @ClassName CmrEmrPatientData
+ * @Author Administrator
+ * @Date 2023/12/5 11:13
+ * @Version 1.0
+ * @Description 慢特病电子病历信息
+ **/
+@Data
+@TableName("crm_emr_patient_data")
+public class CrmEmrPatientData {
+
+    /**
+     * 自增id
+     */
+    @TableId(type = IdType.AUTO)
+    private Integer id;
+    /**
+     * 患者id
+     */
+    private String patNo;
+    /**
+     * 住院次数
+     */
+    private Integer times;
+    /**
+     * 文档唯一id
+     */
+    private String emrDocumentId;
+    /**
+     * 病历模板编码不能为空
+     */
+    private String emrCategoryCode;
+    /**
+     * 是否删除
+     */
+    private Integer delFlag;
+    /**
+     * 模板的名称
+     */
+    private String emrName;
+    /**
+     * 医生取得名称
+     */
+    private String name;
+    /**
+     * 创建人
+     */
+    private String createId;
+    /**
+     * 创建时间
+     */
+    private Date createDate;
+    /**
+     * 修改人
+     */
+    private String modifyId;
+    /**
+     * 修改时间
+     */
+    private Date modifyDate;
+    /**
+     * 是否提交病历 0 -否 1- 是
+     */
+    private Integer submit;
+    /**
+     * 父节点名称
+     */
+    private String parent;
+    /**
+     * 管床医生
+     */
+    private String referPhysician;
+    /**
+     * 主治医生
+     */
+    private String consultPhysician;
+    /**
+     * 主任医生
+     */
+    private String deptDirector;
+    /**
+     * 提交人
+     */
+    private String submitId;
+    /**
+     * 审核医生
+     */
+    private String reviewDoctors;
+    /**
+     * 审核时间
+     */
+    private Date reviewTime;
+    /**
+     * 提交时间
+     */
+    private Date submitTime;
+    /**
+     * $column.comments
+     */
+    private Integer sort;
+    @TableField(exist = false)
+    List<CrmEmrPatientData> children;
+
+    /**
+     * 前端保存的页面数据结构
+     */
+    @TableField(exist = false)
+    private JSONObject documentData;
+
+    @TableField(exist = false)
+    private String userIdCode;
+
+}

+ 21 - 0
src/main/java/thyyxxk/webserver/entity/chronicDisease/CrmPatientMi.java

@@ -291,5 +291,26 @@ public class CrmPatientMi implements Serializable {
      */
     @TableField(exist = false)
     private String referPhysicianName;
+    /**
+     * 性别(中文)
+     */
+    @TableField(exist = false)
+    private String sexValue;
+    /**
+     * 病人来源名称
+     */
+    @TableField(exist = false)
+    private String ptName;
+
+    //用户id
+    @TableField(exist = false)
+    private String userIdCode;
+    @TableField(exist = false)
+    private String userName;
+    //科室编码
+    @TableField(exist = false)
+    private String deptCode;
+    @TableField(exist = false)
+    private String deptName;
 
 }

+ 117 - 0
src/main/java/thyyxxk/webserver/entity/chronicDisease/CrmVisitRecord.java

@@ -0,0 +1,117 @@
+package thyyxxk.webserver.entity.chronicDisease;
+
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @ClassName CrmVisitRecord
+ * @Author Administrator
+ * @Date 2023/12/7 15:45
+ * @Version 1.0
+ * @Description 慢特病电子病历记录
+ **/
+@Data
+@TableName("crm_visit_record")
+public class CrmVisitRecord implements Serializable {
+
+    private static final long serialVersionUID = -1L;
+    /**
+     * 自增id(备用字段)
+     */
+    private String visitId;
+    /**
+     * 患者id
+     */
+    @JsonProperty("pId")
+    private String pId;
+    /**
+     * 患者类别
+     */
+    @JsonProperty("pType")
+    private String pType;
+    /**
+     * 回访次数
+     */
+    private Integer visitTimes;
+    /**
+     * 回访时间
+     */
+    private Date visitDate;
+    /**
+     * 回访意见
+     */
+    private String visitComment;
+    /**
+     * 评价
+     */
+    private String lastValue;
+    /**
+     * 记录人
+     */
+    private String inputId;
+    /**
+     * 记录科室
+     */
+    private String inputDept;
+
+    private Integer messageId;
+
+    private String feedbackFlag;
+    /**
+     * 回访问卷,唯一id
+     */
+    private String emrDocumentId;
+    /**
+     * 模板编码不能为空
+     */
+    private String emrCategoryCode;
+    /**
+     * 删除标志
+     */
+    private Integer delFlag;
+    /**
+     * 模板名称
+     */
+    private String emrName;
+    /**
+     * 修改人
+     */
+    private String modifyId;
+    /**
+     * 修改时间
+     */
+    private Date modifyDate;
+    /**
+     * 父模板id
+     */
+    private String parent;
+
+    @TableField(exist = false)
+    List<CrmVisitRecord> children;
+
+    /**
+     * 前端保存的页面数据结构
+     */
+    @TableField(exist = false)
+    private JSONObject documentData;
+
+    @TableField(exist = false)
+    private String userIdCode;
+    /**
+     * 慢病电子模板tree的id
+     */
+    @TableField(exist = false)
+    private Integer id;
+    /**
+     * 慢病电子模板tree的name
+     */
+    private String name;
+
+}

+ 52 - 0
src/main/java/thyyxxk/webserver/entity/chronicDisease/CrmVisitRecordVo.java

@@ -0,0 +1,52 @@
+package thyyxxk.webserver.entity.chronicDisease;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * @ClassName CrmEmrPatientDataVo
+ * @Author Administrator
+ * @Date 2023/12/5 11:28
+ * @Version 1.0
+ * @Description 慢特病电子病历信息查询vo
+ **/
+@Data
+public class CrmVisitRecordVo {
+    //回访病人id
+    @JsonProperty("pId")
+    private String pId;
+    //回访次数
+    private Integer visitTimes;
+
+    //门诊号
+    private String hisMzNo;
+    private Integer times;
+    //住院号
+    private String hisZyNo;
+    private Integer admissTimes;
+
+    //用户id
+    private String userIdCode;
+    private String userName;
+    //科室编码
+    private String deptCode;
+    private String deptName;
+    //病人姓名
+    private String name;
+    //性别
+    private String sex;
+
+    private Integer age;
+    //出生日期
+    private Date birthDay;
+    //身份证号码
+    private String socialNo;
+
+    /**
+     * 1.住院 2当前 3历史
+     */
+    private Integer type;
+
+}

+ 45 - 2
src/main/java/thyyxxk/webserver/service/bodyexam/BodyExamService.java

@@ -5,6 +5,7 @@ import com.alibaba.fastjson.JSONObject;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import thyyxxk.webserver.config.exception.ExceptionEnum;
+import thyyxxk.webserver.dao.his.bodyexam.BodyExamDao;
 import thyyxxk.webserver.entity.ResultVo;
 import thyyxxk.webserver.service.externalhttp.PowersiTjReport;
 import thyyxxk.webserver.utils.ResultVoUtil;
@@ -30,15 +31,23 @@ public class BodyExamService {
 
     private final PowersiTjReport report;
 
+    private final BodyExamDao dao;
+
     @Autowired
-    public BodyExamService(PowersiTjReport report) {
+    public BodyExamService(PowersiTjReport report, BodyExamDao dao) {
         this.report = report;
+        this.dao = dao;
     }
 
     public ResultVo<List<Map>> getTjReportData(Map<String, String> map){
         String id = map.get("tjid");
         if(StringUtil.isBlank(id)){
-            return ResultVoUtil.fail(ExceptionEnum.INVALID_PARAM, "体检id为空");
+            return ResultVoUtil.fail(ExceptionEnum.INVALID_PARAM, "参数id为空");
+        }
+
+        id = dao.getTjIdByCode(id);
+        if(StringUtil.isBlank(id)){
+            return ResultVoUtil.fail(ExceptionEnum.INVALID_PARAM, "体检信息为空, 查询失败");
         }
 
         // 个人信息
@@ -215,4 +224,38 @@ public class BodyExamService {
         return ResultVoUtil.success(list);
     }
 
+    /**
+     * @Description 体检信息
+     * @Author hsh
+     * @param tjId 体检号
+     * @return Map
+     * @Date 2023/12/9 16:05
+     */
+    public ResultVo<Map> selectTjReportInfoById(String tjId){
+
+        if(StringUtil.isBlank(tjId)){
+            return ResultVoUtil.fail(ExceptionEnum.INVALID_PARAM, "参数为空,查询失败");
+        }
+
+        String id = dao.getTjIdByCode(tjId);
+        if(StringUtil.isBlank(id)){
+            return ResultVoUtil.fail(ExceptionEnum.INVALID_PARAM, "体检信息为空, 查询失败");
+        }
+
+        Map m = new HashMap<>();
+        // 个人信息
+        JSONObject result1 = report.getTjReportPersonalInfo(id);
+        m.put("personalInfo", result1);
+        // 体检结果
+        JSONObject result2 = report.getTjReportResult(id);
+        m.put("result", result1);
+        // 体检汇总信息
+        JSONObject result3 = report.getTjReportTotalInfo(id);
+        m.put("totalInfo", result1);
+        // 体检模块信息
+        JSONObject result4 = report.getTjReportModuleInfo(id);
+        m.put("moduleInfo", result1);
+        return ResultVoUtil.success(m);
+    }
+
 }

+ 172 - 14
src/main/java/thyyxxk/webserver/service/chronicDisease/ChronicDiseaseService.java

@@ -1,5 +1,11 @@
 package thyyxxk.webserver.service.chronicDisease;
 
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.StrUtil;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import lombok.extern.slf4j.Slf4j;
 import org.jetbrains.annotations.NotNull;
 import org.springframework.stereotype.Service;
@@ -8,19 +14,30 @@ import thyyxxk.webserver.constants.YbTjConstant;
 import thyyxxk.webserver.dao.his.chronicDisease.ChronicDiseaseDao;
 import thyyxxk.webserver.dao.his.chronicDisease.CrmPatientMiDao;
 import thyyxxk.webserver.dao.his.chronicDisease.CrmPatientTzxxDao;
+import thyyxxk.webserver.dao.his.chronicDisease.CrmVisitRecordDao;
 import thyyxxk.webserver.dao.his.inpatient.casefrontsheet.SheetCreatedDao;
 import thyyxxk.webserver.entity.ResultVo;
 import thyyxxk.webserver.entity.chronicDisease.CrmPatientMi;
 import thyyxxk.webserver.entity.chronicDisease.CrmPatientTzxx;
+import thyyxxk.webserver.entity.chronicDisease.CrmVisitRecord;
+import thyyxxk.webserver.entity.chronicDisease.CrmVisitRecordVo;
 import thyyxxk.webserver.entity.dictionary.CodeName;
+import thyyxxk.webserver.entity.login.UserInfo;
+import thyyxxk.webserver.service.externalhttp.emr.EmrEditor;
+import thyyxxk.webserver.service.redislike.RedisLikeService;
+import thyyxxk.webserver.utils.AssertUtil;
 import thyyxxk.webserver.utils.ResultVoUtil;
 import thyyxxk.webserver.utils.StringUtil;
 import thyyxxk.webserver.utils.YbReportUtil;
 
+import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Date;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Optional;
+import java.util.stream.Collectors;
 
 /**
  * @ClassName ChronicDiseaseService
@@ -39,12 +56,18 @@ public class ChronicDiseaseService {
     private final CrmPatientMiDao cpmDao;
     private final SheetCreatedDao createdDao;
     private final CrmPatientTzxxDao tzxxDao;
+    private final EmrEditor emr;
+    private final CrmVisitRecordDao crmEmrDao;
+    private final RedisLikeService redisLikeService;
 
-    public ChronicDiseaseService(ChronicDiseaseDao dao, CrmPatientMiDao cpmDao, SheetCreatedDao createdDao, CrmPatientTzxxDao tzxxDao) {
+    public ChronicDiseaseService(ChronicDiseaseDao dao, CrmPatientMiDao cpmDao, SheetCreatedDao createdDao, CrmPatientTzxxDao tzxxDao, EmrEditor emr, CrmVisitRecordDao crmEmrDao, RedisLikeService redisLikeService) {
         this.dao = dao;
         this.cpmDao = cpmDao;
         this.createdDao = createdDao;
         this.tzxxDao = tzxxDao;
+        this.emr = emr;
+        this.crmEmrDao = crmEmrDao;
+        this.redisLikeService = redisLikeService;
         if (crmDictionary == null) {
             crmDictionary = new HashMap<>();
         }
@@ -127,20 +150,36 @@ public class ChronicDiseaseService {
                     cpmDao.deleteCrmPatientMiByPId(crmMi.getPId());
                 }
             } else {
+                // 填写身份证件判断是否已存在信息
+                CrmPatientMi mi1 = cpmDao.selectCrmPatientMiBySocialNo(crmMi.getSocialNo());
+                if(null != mi1){
+                    return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, crmMi.getSocialNo().substring(crmMi.getSocialNo().length() - 4) + "已存在首次慢病信息,无需重新登记!");
+                }
                 // 新增的时候添加pId
                 String pId = YbTjConstant.CRM_YY_TH + YbReportUtil.generateUkStr(1, 8);
                 crmMi.setPId(pId);
             }
+
+            // 根据证件号补充基本信息
+            CrmVisitRecordVo data = crmEmrDao.selectCrmEmrPatientVoByMzCode(crmMi.getSocialNo());
+            if(null != data){
+                crmMi.setHisMzNo(data.getHisMzNo());
+            }
+            data = crmEmrDao.selectCrmEmrPatientVoByZyCode(crmMi.getSocialNo());
+            if(null != data){
+                crmMi.setHisZyNo(data.getHisZyNo());
+            }
+
+            int num = cpmDao.insert(crmMi);
+            if(num == 0){
+                return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, "保存慢特病基本信息失败!");
+            }
             CrmPatientTzxx crmTzXx = tzxxDao.selectCrmTzxxByPid(crmMi.getPId(), crmMi.getVisitTimes());
             if(null != crmTzXx){
                 tzxxDao.deleteCrmTzxxByPid(crmMi.getPId(), crmMi.getVisitTimes());
             }
             CrmPatientTzxx tzXx = getCrmPatientTzxx(crmMi);
-            int num = cpmDao.insert(crmMi);
             int nom = tzxxDao.insert(tzXx);
-            if(num == 0){
-                return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, "保存慢特病基本信息失败!");
-            }
             resultMap.put("cg", "保存慢特病基本信息成功!");
             return ResultVoUtil.success(resultMap);
         } catch(Exception e){
@@ -175,8 +214,6 @@ public class ChronicDiseaseService {
             crmDictionary.put("getSexCode", createdDao.getSexCode());
             // 婚姻状况字典
             crmDictionary.put("getMarriageCode", createdDao.getMarriageCode());
-            // 来源途径
-            crmDictionary.put("getAdmissWay", createdDao.getAdmissWay());
             // 联系人关系字典
             crmDictionary.put("getRelations", createdDao.getRelations());
             // 职业字典
@@ -195,6 +232,8 @@ public class ChronicDiseaseService {
             crmDictionary.put("getArea", dao.getArea(""));
             // 证件类型字典
             crmDictionary.put("getPsnCertType", dao.getPsnCertType());
+            // 来源途径
+            crmDictionary.put("getAdmissWay", dao.getAdmissWay());
         }
         return ResultVoUtil.success(crmDictionary);
     }
@@ -230,37 +269,37 @@ public class ChronicDiseaseService {
         } else if(StringUtil.isBlank(crmMi.getPType())){
             msg = "保存慢特病基本信息失败,病人来源为空,请检查!";
         }
-        if(StringUtil.notBlank(String.valueOf(crmMi.getHeight()))){
+        if(null != crmMi.getHeight()){
             if(!crmMi.getHeight().toString().matches(s1)){
                 msg = "保存慢特病基本信息失败,病人身高填写不符合(仅限纯数字以及小数点),请检查!";
             }
         }
-        if(StringUtil.notBlank(String.valueOf(crmMi.getWeight()))){
+        if(null != crmMi.getWeight()){
             if(!String.valueOf(crmMi.getWeight()).matches(s1)){
                 msg = "保存慢特病基本信息失败,病人体重填写不符合(仅限纯数字以及小数点),请检查!";
             }
         }
-        if(StringUtil.notBlank(String.valueOf(crmMi.getTemperature()))){
+        if(null != crmMi.getTemperature()){
             if(!String.valueOf(crmMi.getTemperature()).matches(s1)){
                 msg = "保存慢特病基本信息失败,病人体温填写不符合(仅限纯数字以及小数点),请检查!";
             }
         }
-        if(StringUtil.notBlank(String.valueOf(crmMi.getHeartRate()))){
+        if(null != crmMi.getHeartRate()){
             if(!String.valueOf(crmMi.getHeartRate()).matches(s)){
                 msg = "保存慢特病基本信息失败,病人心率填写不符合(仅限纯数字),请检查!";
             }
         }
-        if(StringUtil.notBlank(String.valueOf(crmMi.getBloodSugar()))){
+        if(null != crmMi.getBloodSugar()){
             if(!String.valueOf(crmMi.getBloodSugar()).matches(s1)){
                 msg = "保存慢特病基本信息失败,病人血糖填写不符合(仅限纯数字以及小数点),请检查!";
             }
         }
-        if(StringUtil.notBlank(String.valueOf(crmMi.getBloodPressureLow()))){
+        if(null != crmMi.getBloodPressureLow()){
             if(!String.valueOf(crmMi.getBloodPressureLow()).matches(s)){
                 msg = "保存慢特病基本信息失败,病人舒张血压填写不符合(仅限纯数字),请检查!";
             }
         }
-        if(StringUtil.notBlank(String.valueOf(crmMi.getBloodPressureHigh()))){
+        if(null != crmMi.getBloodPressureHigh()){
             if(!String.valueOf(crmMi.getBloodPressureHigh()).matches(s)){
                 msg = "保存慢特病基本信息失败,病人收缩血压填写不符合(仅限纯数字),请检查!";
             }
@@ -282,4 +321,123 @@ public class ChronicDiseaseService {
         return msg;
     }
 
+    /**
+     * 查询所有慢特病模板
+     * @return 返回模板
+     */
+    public JSONArray getCrmEmrModel(){
+        return emr.getDeptList(YbTjConstant.CRM_DEPT_CODE);
+    }
+
+    /**
+     * @Description 查询慢病模板记录
+     * @Author hsh
+     * @param param 查询条件
+     * @return CrmVisitRecord 慢病模板记录
+     * @Date 2023/12/9 9:55
+     */
+    public List<CrmVisitRecord> queryCrmEmrTree(CrmVisitRecord param) {
+        List<CrmVisitRecord> result;
+        QueryWrapper<CrmVisitRecord> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq("p_id", param.getPId());
+        String strTemplate = "第{}次慢病回访记录";
+        queryWrapper.ne("visit_times", param.getVisitTimes());
+        List<CrmVisitRecord> list = crmEmrDao.selectList(queryWrapper);
+        result = getTree(list, strTemplate);
+        return result;
+    }
+
+    private List<CrmVisitRecord> getTree(List<CrmVisitRecord> list, String strTemplate) {
+        if(CollUtil.isEmpty(list)) {
+            return list;
+        }
+        List<CrmVisitRecord> result = new ArrayList<>();
+        Map<Integer, List<CrmVisitRecord>> collect = list.stream().collect(Collectors.groupingBy(CrmVisitRecord::getVisitTimes));
+        Integer index = 1;
+        for(Integer key : collect.keySet()){
+            CrmVisitRecord tem = new CrmVisitRecord();
+            tem.setId(index);
+            tem.setName(StrUtil.format(strTemplate, key));
+            tem.setChildren(collect.get(key));
+            result.add(tem);
+            index++;
+        }
+        return result;
+    }
+
+    /**
+     * @Description 查询慢特病登记信息
+     * @Author hsh
+     * @param keyCode 关键字
+     * @return CrmPatientMi
+     * @Date 2023/12/9 9:47
+     */
+    public ResultVo<CrmPatientMi> queryCrmPatientInfoByCode(String keyCode) {
+        AssertUtil.isnotBlank(keyCode,"关键字不能为空");
+
+        //查询慢特病登记记录
+        CrmPatientMi mi = cpmDao.selectCrmPatientMiByCode(keyCode);
+        if(null == mi){
+            return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, "查询病人慢特病登记记录, 请先登记或检查关键字是否正确!");
+        }
+
+        Integer times = crmEmrDao.selectCrmEmrPatientMaxById(mi.getPId());
+        if(null != times && times > 0){
+            mi.setVisitTimes(times + 1);
+        } else {
+            mi.setVisitTimes(1);
+        }
+
+        // 获取登录人信息
+        UserInfo user = redisLikeService.getUserInfoByToken();
+        mi.setUserIdCode(user.getCodeRs());
+        mi.setUserName(user.getName());
+        mi.setDeptCode(user.getDeptCode());
+        mi.setDeptName(user.getDeptName());
+
+        List<CodeName> sex = createdDao.getSexCode();
+        Optional<CodeName> s = sex.stream().filter(codeName -> codeName.getCode().equals(mi.getSex())).findFirst();
+        s.ifPresent(codeName -> mi.setSexValue(codeName.getName()));
+        List<CodeName> way = dao.getAdmissWay();
+        Optional<CodeName> w = way.stream().filter(codeName -> codeName.getCode().equals(mi.getPType())).findFirst();
+        w.ifPresent(codeName -> mi.setPtName(codeName.getName()));
+
+        return ResultVoUtil.success(mi);
+    }
+
+    /**
+     * @Description 保存慢特病电子模板信息
+     * @Author hsh
+     * @param param 保存信息
+     * @return String
+     * @Date 2023/12/9 9:42
+     */
+    public ResultVo<String> saveCrmEmrModel(CrmVisitRecord param) {
+        AssertUtil.isnotBlank(param.getPId(),"用户ID不能为空");
+        AssertUtil.isnotBlank(param.getVisitTimes(),"用户慢病回访次数不能为空");
+        AssertUtil.isnotBlank(param.getEmrDocumentId(),"文档id不能为空");
+        JSONObject saveJson = new JSONObject();
+        saveJson.put("document", param.getDocumentData());
+        System.out.println(saveJson);
+        try {
+            emr.saveDocument(saveJson);
+        } catch (Exception e) {
+            return ResultVoUtil.fail(ExceptionEnum.EMR_SAVE, "病历保存错误,请重试!" + e.getMessage());
+        }
+        QueryWrapper<CrmVisitRecord> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq("emr_document_id", param.getEmrDocumentId());
+        CrmVisitRecord crmRecord = crmEmrDao.selectOne(queryWrapper);
+        if (crmRecord == null) {
+            param.setVisitDate(new Date());
+            crmEmrDao.insert(param);
+        } else {
+            param.setModifyId(param.getUserIdCode());
+            param.setModifyDate(new Date());
+            UpdateWrapper<CrmVisitRecord> updateWrapper = new UpdateWrapper<>();
+            updateWrapper.eq("emr_document_id", param.getEmrDocumentId());
+            crmEmrDao.update(param, updateWrapper);
+        }
+        return ResultVoUtil.success(ExceptionEnum.SUCCESS_AND_NOTIFICATION,"保存慢病电子病历成功!");
+    }
+
 }