From a38f23d21c7318fdeb7bf9632e68ceee721c4f6d Mon Sep 17 00:00:00 2001 From: wuchunlei Date: Thu, 24 Jul 2025 17:02:27 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8C=BB=E6=A1=88=E6=94=B6=E9=9B=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 6 + .../controller/MedicalRecordsController.java | 108 ++++++++++++++---- .../modules/common/entity/MedicalRecords.java | 12 +- .../controller/MedicalRecordsController.java | 102 +++++++---------- .../controller/TaihuTalentController.java | 12 +- 5 files changed, 156 insertions(+), 84 deletions(-) diff --git a/pom.xml b/pom.xml index 58678f21..277ffbf6 100644 --- a/pom.xml +++ b/pom.xml @@ -63,6 +63,12 @@ + + + com.vladsch.flexmark + flexmark-all + 0.62.2 + org.springframework.ai diff --git a/src/main/java/com/peanut/modules/common/controller/MedicalRecordsController.java b/src/main/java/com/peanut/modules/common/controller/MedicalRecordsController.java index 22a555d6..8249e559 100644 --- a/src/main/java/com/peanut/modules/common/controller/MedicalRecordsController.java +++ b/src/main/java/com/peanut/modules/common/controller/MedicalRecordsController.java @@ -1,12 +1,18 @@ package com.peanut.modules.common.controller; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.peanut.common.utils.R; import com.peanut.common.utils.ShiroUtils; import com.peanut.modules.common.entity.MedicalRecords; +import com.peanut.modules.common.entity.MedicalRecordsLabel; import com.peanut.modules.common.entity.MedicalRecordsToLabel; +import com.peanut.modules.common.service.MedicalRecordsLabelService; import com.peanut.modules.common.service.MedicalRecordsService; import com.peanut.modules.common.service.MedicalRecordsToLabelService; +import com.vladsch.flexmark.html.HtmlRenderer; +import com.vladsch.flexmark.parser.Parser; +import com.vladsch.flexmark.util.data.MutableDataSet; import lombok.extern.slf4j.Slf4j; import org.springframework.ai.chat.client.ChatClient; import org.springframework.ai.tool.ToolCallbackProvider; @@ -29,8 +35,27 @@ public class MedicalRecordsController { @Autowired private MedicalRecordsService medicalRecordsService; @Autowired + private MedicalRecordsLabelService medicalRecordsLabelService; + @Autowired private MedicalRecordsToLabelService medicalRecordsToLabelService; + //获取医案标签列表 + @RequestMapping("/getMedicalRecordsLabelList") + public R getMedicalRecordsLabelList(){ + return R.ok().put("Medicals", medicalRecordsLabels(0)); + } + private List medicalRecordsLabels(int id){ + List medicalRecordsLabelList = medicalRecordsLabelService.list(new LambdaQueryWrapper() + .eq(MedicalRecordsLabel::getPid, id)); + for (MedicalRecordsLabel m : medicalRecordsLabelList){ + if(m.getIsLast()!=1){ + List so = this.medicalRecordsLabels(m.getId()); + m.setChildren(so); + } + } + return medicalRecordsLabelList; + } + public MedicalRecordsController(ChatClient.Builder chatClientBuilder, ToolCallbackProvider tools) { this.chatClient = chatClientBuilder.defaultToolCallbacks(tools).build(); } @@ -39,12 +64,17 @@ public class MedicalRecordsController { @RequestMapping(value = "/medicalRecordsSplit") public R medicalRecordsSplit(@RequestBody Map parmas) { MedicalRecords mr = new MedicalRecords(); + mr.setUserId(ShiroUtils.getUId()); String uuid = UUID.randomUUID().toString(); + medicalRecordsService.save(mr); StringBuffer sb = new StringBuffer(); Date date = new Date(); + MutableDataSet options = new MutableDataSet(); + Parser parser = Parser.builder(options).build(); + HtmlRenderer renderer = HtmlRenderer.builder(options).build(); chatClient.prompt() - .user("你是一名文档编辑,给你一份资料,必须按照1.一般信息,2.主诉,3.现病史,4.既往史,5.家族史,6.体格检查,7.诊断,8.治疗和后续治疗;" + - "这8方面进行拆分,不要增删内容,个人信息必须脱敏处理,结果必须是markdown格式;内容如下:"+ + .user("你是一名编辑,给你一份资料,必须按照1.一般信息,2.主诉,3.现病史,4.既往史,5.家族史,6.体格检查,7.诊断,8.治疗和后续治疗;" + + "这8方面进行拆分,如果没有内容只显示标题,内容为无。内容开头必须为一般信息,不要增删内容,个人信息必须脱敏处理,结果必须是markdown格式;内容如下:"+ parmas.get("message").toString()) .stream() .content() @@ -55,28 +85,41 @@ public class MedicalRecordsController { System.out.println(sb); String res = sb.toString().replace("```markdown\n","").replace("```",""); String[] datas = res.split("\n\n"); - mr.setUserId(ShiroUtils.getUId()); - mr.setInformation(datas[0]); - mr.setChiefComplaint(datas[1]); - mr.setHistoryOfPresentIllness(datas[2]); - mr.setPastHistory(datas[3]); - mr.setPersonalAndFamilyHistory(datas[4]); - mr.setPhysicaExamination(datas[5]); - mr.setDiagnosis(datas[6]); - mr.setTreatmentPlan(datas[7]); - mr.setData(uuid+"->\n"+res); - medicalRecordsService.save(mr); + mr.setInformation(renderer.render(parser.parse(datas[0]))); + mr.setChiefComplaint(renderer.render(parser.parse(datas[1]))); + mr.setHistoryOfPresentIllness(renderer.render(parser.parse(datas[2]))); + mr.setPastHistory(renderer.render(parser.parse(datas[3]))); + mr.setPersonalAndFamilyHistory(renderer.render(parser.parse(datas[4]))); + mr.setPhysicaExamination(renderer.render(parser.parse(datas[5]))); + mr.setDiagnosis(renderer.render(parser.parse(datas[6]))); + mr.setTreatmentPlan(renderer.render(parser.parse(datas[7]))); + mr.setData(uuid+"->"); + medicalRecordsService.saveOrUpdate(mr); System.out.println(new Date().getTime()-date.getTime()); }) + .doOnError(error -> { + medicalRecordsService.removeById(mr.getId()); + }) .subscribe(); - return R.ok().put("data",uuid); + return R.ok().put("data",mr.getId()); } //查询正在拆分的医案 @RequestMapping(value = "/medicalRecordsQuerySplit") public R medicalRecordsQuerySplit(@RequestBody Map parmas) { List list = medicalRecordsService.list(new LambdaQueryWrapper() - .like(MedicalRecords::getData,parmas.get("queryFlag"))); + .eq(MedicalRecords::getId, parmas.get("id"))); + for (MedicalRecords mr : list){ + MedicalRecordsToLabel toLabel = medicalRecordsToLabelService.getOne(new LambdaQueryWrapper() + .eq(MedicalRecordsToLabel::getRecordId,mr.getId())); + if (toLabel!=null){ + mr.setLabelId(toLabel.getLabelId()); + MedicalRecordsLabel label = medicalRecordsLabelService.getById(toLabel.getLabelId()); + if (label!=null){ + mr.setLabelTitle(label.getTitle()); + } + } + } return R.ok().put("medicalRecords",list.size()>0?list.get(0):null); } @@ -84,10 +127,6 @@ public class MedicalRecordsController { @RequestMapping(value = "/saveMedicalRecords") @Transactional public R saveMedicalRecords(@RequestBody MedicalRecords medicalRecords) { - MedicalRecordsToLabel toLabel = new MedicalRecordsToLabel(); - toLabel.setRecordId(medicalRecords.getId()); - toLabel.setLabelId(medicalRecords.getLabelId()); - medicalRecordsToLabelService.save(toLabel); if (medicalRecords.getState()==1){ if ("儿科".equals(medicalRecords.getLabelTitle())){ if ((!medicalRecords.getPastHistory().contains("接种")&& @@ -108,8 +147,37 @@ public class MedicalRecordsController { } } } - medicalRecordsService.save(medicalRecords); + medicalRecords.setData(medicalRecords.getInformation()+medicalRecords.getChiefComplaint()+medicalRecords.getHistoryOfPresentIllness() + +medicalRecords.getPastHistory()+medicalRecords.getPastHistory()+medicalRecords.getPersonalAndFamilyHistory() + +medicalRecords.getPhysicaExamination()+medicalRecords.getDiagnosis()+medicalRecords.getTreatmentPlan()); + medicalRecordsService.saveOrUpdate(medicalRecords); + //绑定标签 + MedicalRecordsToLabel toLabel = medicalRecordsToLabelService.getOne(new LambdaQueryWrapper() + .eq(MedicalRecordsToLabel::getLabelId, medicalRecords.getLabelId()) + .eq(MedicalRecordsToLabel::getRecordId,medicalRecords.getId())); + if (toLabel==null){ + toLabel = new MedicalRecordsToLabel(); + } + toLabel.setRecordId(medicalRecords.getId()); + toLabel.setLabelId(medicalRecords.getLabelId()); + medicalRecordsToLabelService.saveOrUpdate(toLabel); return R.ok().put("medicalRecords",medicalRecords); } + //删除医案 + @RequestMapping(value = "/delMmedicalRecords") + public R delMmedicalRecords(@RequestBody Map parmas) { + medicalRecordsService.removeById(parmas.get("id").toString()); + return R.ok(); + } + + //医案列表 + @RequestMapping(value = "/medicalRecordsList") + public R medicalRecordsList(@RequestBody Map parmas) { + List medicalRecordsList = medicalRecordsService.list(new LambdaQueryWrapper() + .eq(MedicalRecords::getUserId,ShiroUtils.getUId()) + .eq(MedicalRecords::getState,parmas.get("state"))); + return R.ok().put("medicalRecordsList",medicalRecordsList); + } + } diff --git a/src/main/java/com/peanut/modules/common/entity/MedicalRecords.java b/src/main/java/com/peanut/modules/common/entity/MedicalRecords.java index 6945f0e4..6c1e7d4f 100644 --- a/src/main/java/com/peanut/modules/common/entity/MedicalRecords.java +++ b/src/main/java/com/peanut/modules/common/entity/MedicalRecords.java @@ -19,12 +19,12 @@ public class MedicalRecords { private Integer userId; //标题 private String title; - //0暂存1有效 + //0暂存1提交审核2审核拒绝3审核成功 private Integer state; //是否加入ai训练库0否1是 private Integer train; //未加入训练库原因 - private String trainReason; + private String mark; //一般信息 private String information; //主诉 @@ -40,15 +40,19 @@ public class MedicalRecords { //诊断 private String diagnosis; //治疗方案 - private String treatmentPlan; + private String treatmentPlan=""; + //图片 + private String img=""; //原始数据 - private String data; + private String data=""; private Date createTime; @TableLogic private Integer delFlag; + @TableField(exist = false) + private MyUserEntity user; @TableField(exist = false) private Integer labelId; @TableField(exist = false) diff --git a/src/main/java/com/peanut/modules/master/controller/MedicalRecordsController.java b/src/main/java/com/peanut/modules/master/controller/MedicalRecordsController.java index de6800a1..d682c230 100644 --- a/src/main/java/com/peanut/modules/master/controller/MedicalRecordsController.java +++ b/src/main/java/com/peanut/modules/master/controller/MedicalRecordsController.java @@ -10,8 +10,10 @@ import com.peanut.modules.common.service.MedicalRecordsLabelService; import com.peanut.modules.common.service.MedicalRecordsService; import com.peanut.modules.common.service.MedicalRecordsToLabelService; import com.peanut.modules.common.to.ParamTo; +import com.peanut.modules.master.service.MyUserService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @@ -30,27 +32,56 @@ public class MedicalRecordsController { private MedicalRecordsLabelService medicalRecordsLabelService; @Autowired private MedicalRecordsToLabelService toLabelService; + @Autowired + private MyUserService userService; + //获取医案待审核、拒绝列表 + @RequestMapping("/getMedicalRecordsListCheck") + public R getMedicalRecordsListCheck(@RequestBody Map params){ + MPJLambdaWrapper wrapper = new MPJLambdaWrapper(); + wrapper.leftJoin(MedicalRecordsToLabel.class,MedicalRecordsToLabel::getRecordId,MedicalRecords::getId); + wrapper.leftJoin(MedicalRecordsLabel.class,MedicalRecordsLabel::getId,MedicalRecordsToLabel::getLabelId); + wrapper.leftJoin(MyUserEntity.class,MyUserEntity::getId,MedicalRecords::getUserId); + wrapper.selectAll(MedicalRecords.class); + wrapper.selectAs(MedicalRecordsLabel::getTitle,"labelTitle"); + wrapper.eq(MedicalRecords::getState,params.get("state")); + Page page = medicalRecordsService.page(new Page<>( + Long.parseLong(params.get("current").toString()),Long.parseLong(params.get("limit").toString())),wrapper); + for (MedicalRecords mr:page.getRecords()){ + mr.setUser(userService.getById(mr.getUserId())); + } + return R.ok().put("page",page); + } - + //获取标签下医案列表 @RequestMapping("/getMedicalRecordsList") public R getMedicalRecordsList(@RequestBody Map params){ MPJLambdaWrapper wrapper = new MPJLambdaWrapper(); wrapper.rightJoin(MedicalRecordsToLabel.class,MedicalRecordsToLabel::getRecordId,MedicalRecords::getId); + wrapper.leftJoin(MyUserEntity.class,MyUserEntity::getId,MedicalRecords::getUserId); wrapper.selectAll(MedicalRecords.class); wrapper.eq(MedicalRecordsToLabel::getLabelId,params.get("labelId")); - wrapper.eq(MedicalRecords::getState,1); + wrapper.eq(MedicalRecords::getState,3); + wrapper.like(StringUtils.isNotBlank(params.get("tel").toString()),MyUserEntity::getTel,params.get("tel")); wrapper.eq(StringUtils.isNotBlank(params.get("train").toString()),MedicalRecords::getTrain,params.get("train")); - wrapper.eq(StringUtils.isNotBlank(params.get("title").toString()),MedicalRecords::getTitle,params.get("title")); + wrapper.like(StringUtils.isNotBlank(params.get("title").toString()),MedicalRecords::getTitle,params.get("title")); Page page = medicalRecordsService.page(new Page<>( Long.parseLong(params.get("current").toString()),Long.parseLong(params.get("limit").toString())),wrapper); + for (MedicalRecords mr:page.getRecords()){ + mr.setUser(userService.getById(mr.getUserId())); + } return R.ok().put("page",page); } @RequestMapping("/addMedicalRecords") + @Transactional public R addMedicalRecords(@RequestBody MedicalRecords medicalRecords){ - medicalRecords.setState(1); - medicalRecordsService.updateById(medicalRecords); + medicalRecords.setState(3); + medicalRecordsService.save(medicalRecords); + MedicalRecordsToLabel toLabel = new MedicalRecordsToLabel(); + toLabel.setLabelId(medicalRecords.getLabelId()); + toLabel.setRecordId(medicalRecords.getId()); + toLabelService.save(toLabel); return R.ok(); } @@ -60,6 +91,12 @@ public class MedicalRecordsController { return R.ok(); } + @RequestMapping("/delMedicalRecords") + public R delMedicalRecords(@RequestBody MedicalRecords medicalRecords){ + medicalRecordsService.removeById(medicalRecords); + return R.ok(); + } + @@ -69,7 +106,7 @@ public class MedicalRecordsController { } private List medicalRecordsLabels(int id){ List medicalRecordsLabelList = medicalRecordsLabelService.list(new LambdaQueryWrapper() - .eq(MedicalRecordsLabel::getPid, 0)); + .eq(MedicalRecordsLabel::getPid, id)); for (MedicalRecordsLabel m : medicalRecordsLabelList){ if(m.getIsLast()!=1){ List so = this.medicalRecordsLabels(m.getId()); @@ -129,59 +166,6 @@ public class MedicalRecordsController { return R.ok().put("medicalRecordsLabel", medicalRecordsLabel); } - @RequestMapping("/getMedicalRecordsListForLabel") - public R getMedicalRecordsListForLabel(@RequestBody ParamTo param){ - MPJLambdaWrapper wrapper = new MPJLambdaWrapper<>(); - wrapper.rightJoin(MedicalRecordsToLabel.class,MedicalRecordsToLabel::getRecordId, MedicalRecords::getId); - wrapper.selectAll(MedicalRecords.class); - wrapper.eq(MedicalRecordsToLabel::getLabelId,param.getId()); - wrapper.orderByAsc(MedicalRecordsToLabel::getSort); - List medicalRecordsList = medicalRecordsService.list(wrapper); - return R.ok().put("medicalRecordsList",medicalRecordsList); - } - - @RequestMapping("/getMedicalRecordsListCanLabel") - public R getMedicalRecordsListCanLabel(@RequestBody ParamTo param){ - List collect = toLabelService.list(new LambdaQueryWrapper() - .eq(MedicalRecordsToLabel::getLabelId, param.getId())) - .stream().map(MedicalRecordsToLabel::getRecordId).collect(Collectors.toList()); - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - if (collect.size() != 0){ - wrapper.notIn(MedicalRecords::getId,collect); - } - wrapper.like(StringUtils.isNotBlank(param.getKeywords()),MedicalRecords::getTitle,param.getKeywords()); - Page page = medicalRecordsService.page(new Page<>(param.getPage(), param.getLimit()), wrapper); - return R.ok().put("page",page); - } - - @RequestMapping("/bindMedicalRecordsAndLabel") - public R bindMedicalRecordsAndLabel(@RequestBody MedicalRecordsToLabel toLabel){ - //去重 - MedicalRecordsToLabel one = toLabelService.getOne(new LambdaQueryWrapper() - .eq(MedicalRecordsToLabel::getRecordId, toLabel.getRecordId()) - .eq(MedicalRecordsToLabel::getLabelId, toLabel.getLabelId())); - if(one != null){ - return R.error(501,"绑定失败,绑定关系已将存在"); - } - toLabelService.save(toLabel); - return R.ok(); - } - - @RequestMapping("/unbindMedicalRecordsAndLabel") - public R unbindMedicalRecordsAndLabel(@RequestBody MedicalRecordsToLabel toLabel){ - boolean b = toLabelService.removeById(toLabel.getId()); - if(b){ - return R.ok(); - }else { - return R.error("error"); - } - } - - @RequestMapping("/updateMedicalRecordsToLabelSort") - public R updateMedicalRecordsToLabelSort(@RequestBody MedicalRecordsToLabel toLabel){ - toLabelService.updateById(toLabel); - return R.ok(); - } } diff --git a/src/main/java/com/peanut/modules/taihumed/controller/TaihuTalentController.java b/src/main/java/com/peanut/modules/taihumed/controller/TaihuTalentController.java index 9df01308..dd1e2287 100644 --- a/src/main/java/com/peanut/modules/taihumed/controller/TaihuTalentController.java +++ b/src/main/java/com/peanut/modules/taihumed/controller/TaihuTalentController.java @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.github.yulichang.wrapper.MPJLambdaWrapper; import com.peanut.common.utils.R; import com.peanut.modules.common.entity.*; +import com.peanut.modules.common.service.MedicalRecordsService; import com.peanut.modules.common.service.TaihuTalentService; import com.peanut.modules.common.service.UserCertificateLabelService; import com.peanut.modules.common.service.UserCertificateService; @@ -30,6 +31,8 @@ public class TaihuTalentController { private UserCertificateLabelService userCertificateLabelService; @Autowired private CourseService courseService; + @Autowired + private MedicalRecordsService medicalRecordsService; //太湖英才列表 @RequestMapping("/getTaihuTalents") @@ -102,17 +105,24 @@ public class TaihuTalentController { res.add(label); } } + //名医精彩 MPJLambdaWrapper wrapper = new MPJLambdaWrapper(); wrapper.rightJoin(CourseToTalent.class,CourseToTalent::getCourseId,CourseEntity::getId); wrapper.leftJoin(TaihuTalent.class,TaihuTalent::getId,CourseToTalent::getTalentId); wrapper.selectAll(CourseEntity.class); wrapper.eq(CourseToTalent::getTalentId,taihuTalent.getId()); List courseList = courseService.list(wrapper); + //精彩医案 + List medicalRecords = medicalRecordsService.list(new LambdaQueryWrapper() + .eq(MedicalRecords::getState,3) + .eq(MedicalRecords::getUserId,taihuTalent.getUserId()) + .orderByDesc(MedicalRecords::getTrain)); return R.ok() .put("taihuTalent",taihuTalent) .put("label",titleLabel) .put("certificates",res) - .put("courseList",courseList); + .put("courseList",courseList) + .put("medicalRecords",medicalRecords); } void getUserCertificates(List us,UserCertificateLabel label,int userId){