From 6852c649847a6717205992922edcc96698e47eb6 Mon Sep 17 00:00:00 2001 From: wuchunlei Date: Wed, 4 Jun 2025 17:09:45 +0800 Subject: [PATCH] =?UTF-8?q?=E7=B2=BE=E5=87=86=E5=8C=BB=E7=96=97=E5=9F=BA?= =?UTF-8?q?=E5=9B=A0=E3=80=81=E6=96=B9=E5=89=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/dao/PrecisionMedicineGeneDao.java | 9 ++ .../dao/PrecisionMedicinePrescriptionDao.java | 9 ++ .../common/entity/PrecisionMedicineGene.java | 38 +++++++ .../entity/PrecisionMedicinePrescription.java | 40 +++++++ .../service/PrecisionMedicineGeneService.java | 11 ++ .../PrecisionMedicinePrescriptionService.java | 7 ++ .../PrecisionMedicineGeneServiceImpl.java | 95 ++++++++++++++++ ...cisionMedicinePrescriptionServiceImpl.java | 13 +++ .../PrecisionMedicineController.java | 103 ++++++++++++++++++ .../PrecisionMedicineController.java | 101 +++++++++++++++++ 10 files changed, 426 insertions(+) create mode 100644 src/main/java/com/peanut/modules/common/dao/PrecisionMedicineGeneDao.java create mode 100644 src/main/java/com/peanut/modules/common/dao/PrecisionMedicinePrescriptionDao.java create mode 100644 src/main/java/com/peanut/modules/common/entity/PrecisionMedicineGene.java create mode 100644 src/main/java/com/peanut/modules/common/entity/PrecisionMedicinePrescription.java create mode 100644 src/main/java/com/peanut/modules/common/service/PrecisionMedicineGeneService.java create mode 100644 src/main/java/com/peanut/modules/common/service/PrecisionMedicinePrescriptionService.java create mode 100644 src/main/java/com/peanut/modules/common/service/impl/PrecisionMedicineGeneServiceImpl.java create mode 100644 src/main/java/com/peanut/modules/common/service/impl/PrecisionMedicinePrescriptionServiceImpl.java create mode 100644 src/main/java/com/peanut/modules/master/controller/PrecisionMedicineController.java create mode 100644 src/main/java/com/peanut/modules/taihumed/controller/PrecisionMedicineController.java diff --git a/src/main/java/com/peanut/modules/common/dao/PrecisionMedicineGeneDao.java b/src/main/java/com/peanut/modules/common/dao/PrecisionMedicineGeneDao.java new file mode 100644 index 00000000..710236dd --- /dev/null +++ b/src/main/java/com/peanut/modules/common/dao/PrecisionMedicineGeneDao.java @@ -0,0 +1,9 @@ +package com.peanut.modules.common.dao; + +import com.github.yulichang.base.MPJBaseMapper; +import com.peanut.modules.common.entity.PrecisionMedicineGene; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface PrecisionMedicineGeneDao extends MPJBaseMapper { +} diff --git a/src/main/java/com/peanut/modules/common/dao/PrecisionMedicinePrescriptionDao.java b/src/main/java/com/peanut/modules/common/dao/PrecisionMedicinePrescriptionDao.java new file mode 100644 index 00000000..6ca2ddc2 --- /dev/null +++ b/src/main/java/com/peanut/modules/common/dao/PrecisionMedicinePrescriptionDao.java @@ -0,0 +1,9 @@ +package com.peanut.modules.common.dao; + +import com.github.yulichang.base.MPJBaseMapper; +import com.peanut.modules.common.entity.PrecisionMedicinePrescription; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface PrecisionMedicinePrescriptionDao extends MPJBaseMapper { +} diff --git a/src/main/java/com/peanut/modules/common/entity/PrecisionMedicineGene.java b/src/main/java/com/peanut/modules/common/entity/PrecisionMedicineGene.java new file mode 100644 index 00000000..766ae1f4 --- /dev/null +++ b/src/main/java/com/peanut/modules/common/entity/PrecisionMedicineGene.java @@ -0,0 +1,38 @@ +package com.peanut.modules.common.entity; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.util.Date; + +@Data +@TableName("precision_medicine_gene") +public class PrecisionMedicineGene { + private static final long serialVersionUID = 1L; + + @TableId + private Integer id; + + //基因名称 + private String name; + + //基因中文名 + private String namecn; + + //别名 + private String alias; + + //描述 + private String description; + + //关联药材名 + private String tcmName; + + private Date createTime; + + @TableLogic + private Integer delFlag; +} diff --git a/src/main/java/com/peanut/modules/common/entity/PrecisionMedicinePrescription.java b/src/main/java/com/peanut/modules/common/entity/PrecisionMedicinePrescription.java new file mode 100644 index 00000000..c33cf6b3 --- /dev/null +++ b/src/main/java/com/peanut/modules/common/entity/PrecisionMedicinePrescription.java @@ -0,0 +1,40 @@ +package com.peanut.modules.common.entity; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.util.Date; + +@Data +@TableName("precision_medicine_prescription") +public class PrecisionMedicinePrescription { + private static final long serialVersionUID = 1L; + + @TableId + private Integer id; + + //方剂名称 + private String name; + + //别名 + private String alias; + + //药物组成 + private String compose; + + //功效 + private String effect; + + //主治 + private String indications; + + //来源 + private String source; + + private Date createTime; + + @TableLogic + private Integer delFlag; +} diff --git a/src/main/java/com/peanut/modules/common/service/PrecisionMedicineGeneService.java b/src/main/java/com/peanut/modules/common/service/PrecisionMedicineGeneService.java new file mode 100644 index 00000000..e24fca9d --- /dev/null +++ b/src/main/java/com/peanut/modules/common/service/PrecisionMedicineGeneService.java @@ -0,0 +1,11 @@ +package com.peanut.modules.common.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.peanut.modules.common.entity.PrecisionMedicineGene; +import java.util.Map; + +public interface PrecisionMedicineGeneService extends IService { + + Map getGeneInfo(String geneIds); + +} diff --git a/src/main/java/com/peanut/modules/common/service/PrecisionMedicinePrescriptionService.java b/src/main/java/com/peanut/modules/common/service/PrecisionMedicinePrescriptionService.java new file mode 100644 index 00000000..b34a8756 --- /dev/null +++ b/src/main/java/com/peanut/modules/common/service/PrecisionMedicinePrescriptionService.java @@ -0,0 +1,7 @@ +package com.peanut.modules.common.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.peanut.modules.common.entity.PrecisionMedicinePrescription; + +public interface PrecisionMedicinePrescriptionService extends IService { +} diff --git a/src/main/java/com/peanut/modules/common/service/impl/PrecisionMedicineGeneServiceImpl.java b/src/main/java/com/peanut/modules/common/service/impl/PrecisionMedicineGeneServiceImpl.java new file mode 100644 index 00000000..b689b89d --- /dev/null +++ b/src/main/java/com/peanut/modules/common/service/impl/PrecisionMedicineGeneServiceImpl.java @@ -0,0 +1,95 @@ +package com.peanut.modules.common.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.peanut.modules.common.dao.PrecisionMedicineGeneDao; +import com.peanut.modules.common.dao.PrecisionMedicinePrescriptionDao; +import com.peanut.modules.common.entity.PrecisionMedicineGene; +import com.peanut.modules.common.entity.PrecisionMedicinePrescription; +import com.peanut.modules.common.service.PrecisionMedicineGeneService; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import java.util.*; +import java.util.stream.Collectors; + +@Slf4j +@Service("commonPrecisionMedicineGeneService") +public class PrecisionMedicineGeneServiceImpl extends ServiceImpl implements PrecisionMedicineGeneService { + + @Autowired + private PrecisionMedicinePrescriptionDao prescriptionDao; + + @Override + public Map getGeneInfo(String geneIds) { + Map res = new HashMap<>(); + String[] ids = geneIds.split(","); + Set tcmNames = new HashSet<>(); + //查出基因匹配的所有中药 + List geneList = new ArrayList<>(); + for (String id : ids) { + PrecisionMedicineGene gene = this.getById(id); + geneList.add(gene); + if (StringUtils.isNotEmpty(gene.getTcmName())){ + String[] names = gene.getTcmName().split(","); + for (String str:names){ + tcmNames.add(str); + } + } + } + res.put("geneList",geneList); + Map> countPrescriptions = new HashMap<>(); + for (String tcmName : tcmNames){ + //方剂列表 + List prescriptions = prescriptionDao.selectList(new LambdaQueryWrapper() + .like(PrecisionMedicinePrescription::getCompose,tcmName)); + for (PrecisionMedicinePrescription prescription:prescriptions){ + if (countPrescriptions.containsKey(prescription.getId()+"")){ + Map map = countPrescriptions.get(prescription.getId()+""); + map.put("num",Integer.parseInt(map.get("num")+"")+1); + map.put("tcmName",map.get("tcmName")+","+tcmName); + }else { + Map map = new HashMap<>(); + map.put("num",1); + map.put("tcmName",tcmName); + map.put("name",prescription.getName()); + map.put("compose",prescription.getCompose()); + map.put("total",prescription.getCompose().split(",").length); + map.put("source",prescription.getSource()); + countPrescriptions.put(prescription.getId()+"",map); + } + } + } + //计算占比,并加入排序集合 + List> list = new ArrayList<>(); + for (Map m : countPrescriptions.values()){ + m.put("percent",Double.parseDouble(m.get("num").toString())/Double.parseDouble(m.get("total").toString())); + list.add(m); + } + //排序 + list = list.stream().sorted((map1,map2)->{ + int x = Integer.compare(Integer.parseInt(map2.get("num").toString()),Integer.parseInt(map1.get("num").toString())); + if (x!=0){ + return x; + }else { + return Double.compare(Double.parseDouble(map2.get("percent").toString()),Double.parseDouble(map1.get("percent").toString())); + } + }).collect(Collectors.toList()); + //将匹配最高的加入结果集合 + List> prescriptionList = new ArrayList<>(); + for (Map map:list){ + if (prescriptionList.size() > 0){ + if (Integer.parseInt(prescriptionList.get(0).get("num").toString())==Integer.parseInt(map.get("num").toString())){ + if (prescriptionList.size()<3){ + prescriptionList.add(map); + } + } + }else { + prescriptionList.add(map); + } + } + res.put("prescriptionList",prescriptionList); + return res; + } +} diff --git a/src/main/java/com/peanut/modules/common/service/impl/PrecisionMedicinePrescriptionServiceImpl.java b/src/main/java/com/peanut/modules/common/service/impl/PrecisionMedicinePrescriptionServiceImpl.java new file mode 100644 index 00000000..18f50948 --- /dev/null +++ b/src/main/java/com/peanut/modules/common/service/impl/PrecisionMedicinePrescriptionServiceImpl.java @@ -0,0 +1,13 @@ +package com.peanut.modules.common.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.peanut.modules.common.dao.PrecisionMedicinePrescriptionDao; +import com.peanut.modules.common.entity.PrecisionMedicinePrescription; +import com.peanut.modules.common.service.PrecisionMedicinePrescriptionService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +@Slf4j +@Service("commonPrecisionMedicinePrescriptionService") +public class PrecisionMedicinePrescriptionServiceImpl extends ServiceImpl implements PrecisionMedicinePrescriptionService { +} diff --git a/src/main/java/com/peanut/modules/master/controller/PrecisionMedicineController.java b/src/main/java/com/peanut/modules/master/controller/PrecisionMedicineController.java new file mode 100644 index 00000000..4d3ad296 --- /dev/null +++ b/src/main/java/com/peanut/modules/master/controller/PrecisionMedicineController.java @@ -0,0 +1,103 @@ +package com.peanut.modules.master.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.peanut.common.utils.R; +import com.peanut.modules.common.entity.PrecisionMedicineGene; +import com.peanut.modules.common.entity.PrecisionMedicinePrescription; +import com.peanut.modules.common.service.PrecisionMedicineGeneService; +import com.peanut.modules.common.service.PrecisionMedicinePrescriptionService; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.Map; + +//精准医疗基因、方剂 +@Slf4j +@RestController("masterPrecisionMedicine") +@RequestMapping("master/precisionMedicine") +public class PrecisionMedicineController { + + @Autowired + private PrecisionMedicineGeneService geneService; + @Autowired + private PrecisionMedicinePrescriptionService prescriptionService; + + //基因管理 + @RequestMapping("/getGeneListByPage") + public R getGeneListByPage(@RequestBody Map params) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper(); + if (StringUtils.isNotEmpty(params.get("name").toString())) { + wrapper.like(PrecisionMedicineGene::getName,params.get("name")); + } + wrapper.orderByDesc(PrecisionMedicineGene::getCreateTime); + Page page = geneService.page(new Page<>( + Long.parseLong(params.get("current").toString()), Long.parseLong(params.get("limit").toString())), wrapper); + return R.ok().put("result", page); + } + + @RequestMapping("/getGeneById") + public R getGeneById(@RequestBody Map params) { + return R.ok().put("result", geneService.getById(params.get("id").toString())); + } + + @RequestMapping("/saveGene") + public R saveMessage(@RequestBody PrecisionMedicineGene gene) { + geneService.save(gene); + return R.ok(); + } + + @RequestMapping("/updateGene") + public R updateGene(@RequestBody PrecisionMedicineGene gene) { + geneService.updateById(gene); + return R.ok(); + } + + @RequestMapping("/delGene") + public R delGene(@RequestBody Map params) { + geneService.removeById(params.get("id").toString()); + return R.ok(); + } + + //方剂管理 + @RequestMapping("/getPrescriptionListByPage") + public R getPrescriptionListByPage(@RequestBody Map params) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper(); + if (StringUtils.isNotEmpty(params.get("name").toString())) { + wrapper.like(PrecisionMedicinePrescription::getName,params.get("name")); + } + wrapper.orderByDesc(PrecisionMedicinePrescription::getCreateTime); + Page page = prescriptionService.page(new Page<>( + Long.parseLong(params.get("current").toString()), Long.parseLong(params.get("limit").toString())), wrapper); + return R.ok().put("result", page); + } + + @RequestMapping("/getPrescriptionById") + public R getPrescriptionById(@RequestBody Map params) { + return R.ok().put("result", prescriptionService.getById(params.get("id").toString())); + } + + @RequestMapping("/savePrescription") + public R savePrescription(@RequestBody PrecisionMedicinePrescription prescription) { + prescriptionService.save(prescription); + return R.ok(); + } + + @RequestMapping("/updatePrescription") + public R updatePrescription(@RequestBody PrecisionMedicinePrescription prescription) { + prescriptionService.updateById(prescription); + return R.ok(); + } + + @RequestMapping("/delPrescription") + public R delPrescription(@RequestBody Map params) { + prescriptionService.removeById(params.get("id").toString()); + return R.ok(); + } + + +} diff --git a/src/main/java/com/peanut/modules/taihumed/controller/PrecisionMedicineController.java b/src/main/java/com/peanut/modules/taihumed/controller/PrecisionMedicineController.java new file mode 100644 index 00000000..11b33783 --- /dev/null +++ b/src/main/java/com/peanut/modules/taihumed/controller/PrecisionMedicineController.java @@ -0,0 +1,101 @@ +package com.peanut.modules.taihumed.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.peanut.common.utils.R; +import com.peanut.modules.common.entity.PrecisionMedicineGene; +import com.peanut.modules.common.service.PrecisionMedicineGeneService; +import com.peanut.modules.common.service.PrecisionMedicinePrescriptionService; +import lombok.extern.slf4j.Slf4j; +import org.apache.poi.ss.usermodel.Row; +import org.apache.poi.ss.usermodel.Sheet; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.io.OutputStream; +import java.net.URLEncoder; +import java.util.*; + +@Slf4j +@RestController("taihumedPrecisionMedicine") +@RequestMapping("taihumed/precisionMedicine") +public class PrecisionMedicineController { + + + @Autowired + private PrecisionMedicineGeneService geneService; + @Autowired + private PrecisionMedicinePrescriptionService prescriptionService; + + + @RequestMapping("/getPrecisionMedicineGenes") + public R getPrecisionMedicineGenes(@RequestBody Map params){ + List genes = geneService.list(new LambdaQueryWrapper() + .and(t->t.like(PrecisionMedicineGene::getName,params.get("name")) + .or().like(PrecisionMedicineGene::getAlias,params.get("name")))); + return R.ok().put("genes",genes); + } + + + @RequestMapping("/getGenes") + public void getPrescriptions(HttpServletResponse response){ + List genes = geneService.list(); + XSSFWorkbook wb = new XSSFWorkbook(); + //创建一张表 + Sheet sheet = wb.createSheet("Student"); + //创建第一行,起始为0 + Row titleRow = sheet.createRow(0); + titleRow.createCell(0).setCellValue("基因名称"); + titleRow.createCell(1).setCellValue("基因中文名"); + titleRow.createCell(2).setCellValue("描述"); + titleRow.createCell(3).setCellValue("关联药材名"); + titleRow.createCell(4).setCellValue("关联方剂"); + //序号,默认为1 + int cell = 1; + //遍历 + for (PrecisionMedicineGene gene:genes){ + Map geneInfo = geneService.getGeneInfo(gene.getId().toString()); + List> prescriptionList = (List>) geneInfo.get("prescriptionList"); + String prescriptionStr = ""; + for (Map prescription:prescriptionList) { + prescriptionStr+="匹配方剂:"+prescription.get("name")+",方剂组成:"+prescription.get("compose")+"出处:"+prescription.get("source")+";"; + } + Row row = sheet.createRow(cell); + row.createCell(0).setCellValue(gene.getName()); + row.createCell(1).setCellValue(gene.getNamecn()); + row.createCell(2).setCellValue(gene.getDescription()); + row.createCell(3).setCellValue(gene.getTcmName()); + row.createCell(4).setCellValue(prescriptionStr); + //序号自增 + cell++; + } + String fileName = "基因药材方剂.xlsx"; + OutputStream outputStream =null; + try { + //文件名编码格式 + fileName = URLEncoder.encode(fileName,"UTF-8"); + //设置ContentType请求信息格式 + response.setContentType("application/vnd.ms-excel"); + //设置标头 + response.setHeader("Content-disposition", "attachment;filename=" + fileName); + outputStream = response.getOutputStream(); + wb.write(outputStream); + } catch (IOException e) { + e.printStackTrace(); + }finally { + try { + outputStream.flush(); + outputStream.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } +// return R.ok().put("genes",genes); + } + + +}