Browse Source

feat:[试验管理][模板填报]试剂生成

master
HanLong 3 hours ago
parent
commit
ee95897a7f
11 changed files with 500 additions and 58 deletions
  1. +33
    -0
      hxhq-modules/hxhq-system/src/main/java/com/hxhq/business/domain/Sj.java
  2. +44
    -0
      hxhq-modules/hxhq-system/src/main/java/com/hxhq/business/dto/study/StudyFormFillCc.java
  3. +34
    -0
      hxhq-modules/hxhq-system/src/main/java/com/hxhq/business/dto/study/StudyFormFillCz.java
  4. +141
    -0
      hxhq-modules/hxhq-system/src/main/java/com/hxhq/business/dto/study/StudyFormFillResource.java
  5. +5
    -0
      hxhq-modules/hxhq-system/src/main/java/com/hxhq/business/mapper/CellMapper.java
  6. +22
    -0
      hxhq-modules/hxhq-system/src/main/java/com/hxhq/business/mapper/SjMapper.java
  7. +5
    -0
      hxhq-modules/hxhq-system/src/main/java/com/hxhq/business/service/ISjService.java
  8. +195
    -14
      hxhq-modules/hxhq-system/src/main/java/com/hxhq/business/service/impl/SjServiceImpl.java
  9. +0
    -40
      hxhq-modules/hxhq-system/src/main/java/com/hxhq/business/utils/PdfUtil.java
  10. +6
    -4
      hxhq-modules/hxhq-system/src/main/java/com/hxhq/business/utils/StudyMethodFileUtil.java
  11. +15
    -0
      hxhq-modules/hxhq-system/src/main/resources/mapper/business/SjMapper.xml

+ 33
- 0
hxhq-modules/hxhq-system/src/main/java/com/hxhq/business/domain/Sj.java View File

@ -18,6 +18,15 @@ public class Sj extends MpBaseEntity
{
private static final long serialVersionUID = 1L;
/** 试验id */
private Long studyId;
/** 试验表单id */
private Long studyFormId;
/** 所属部门/学科 */
private Long deptId;
/** 制剂状态 1:入库 5:已锁定 7:待归档 9:归档 11:待解档 */
private Integer zjzt;
@ -90,6 +99,22 @@ public class Sj extends MpBaseEntity
@JsonFormat(pattern = "yyyy-MM-dd")
private Date jyjsrq;
public Long getStudyId() {
return studyId;
}
public void setStudyId(Long studyId) {
this.studyId = studyId;
}
public Long getStudyFormId() {
return studyFormId;
}
public void setStudyFormId(Long studyFormId) {
this.studyFormId = studyFormId;
}
public void setZjzt(Integer zjzt)
{
this.zjzt = zjzt;
@ -278,4 +303,12 @@ public class Sj extends MpBaseEntity
public void setJyjsrq(Date jyjsrq) {
this.jyjsrq = jyjsrq;
}
public Long getDeptId() {
return deptId;
}
public void setDeptId(Long deptId) {
this.deptId = deptId;
}
}

+ 44
- 0
hxhq-modules/hxhq-system/src/main/java/com/hxhq/business/dto/study/StudyFormFillCc.java View File

@ -0,0 +1,44 @@
package com.hxhq.business.dto.study;
import java.util.List;
/**
* @author tanfei
*/
public class StudyFormFillCc {
/**
* list : ["slys202601220002"]
* cctj : 15~25
* ccwz : GXB-R21-048
*/
private String cctj;
private String ccwz;
private List<String> list;
public String getCctj() {
return cctj;
}
public void setCctj(String cctj) {
this.cctj = cctj;
}
public String getCcwz() {
return ccwz;
}
public void setCcwz(String ccwz) {
this.ccwz = ccwz;
}
public List<String> getList() {
return list;
}
public void setList(List<String> list) {
this.list = list;
}
}

+ 34
- 0
hxhq-modules/hxhq-system/src/main/java/com/hxhq/business/dto/study/StudyFormFillCz.java View File

@ -0,0 +1,34 @@
package com.hxhq.business.dto.study;
import java.util.List;
/**
* @author tanfei
*/
public class StudyFormFillCz {
/**
* list : ["slys202601220002"]
* czfs : 丢入黄色垃圾桶
*/
private String czfs;
private List<String> list;
public String getCzfs() {
return czfs;
}
public void setCzfs(String czfs) {
this.czfs = czfs;
}
public List<String> getList() {
return list;
}
public void setList(List<String> list) {
this.list = list;
}
}

+ 141
- 0
hxhq-modules/hxhq-system/src/main/java/com/hxhq/business/dto/study/StudyFormFillResource.java View File

@ -0,0 +1,141 @@
package com.hxhq.business.dto.study;
/**
* @author tanfei
*/
public class StudyFormFillResource {
/**
* mc : 生理盐水
* bh : slys202601220002
* ph :
* nd : 30mg/mL
* source : 配置
* type : 1
* sxrq : 2026-01-12 16:03:27
* ndz : 30
* nddw : mg/mL
* kc : 36000
* kcdw : mL
* syl : 20
* syldw : mL
*/
private String mc;
private String bh;
private String ph;
private String nd;
private String source;
private int type;
private String sxrq;
private int ndz;
private String nddw;
private int kc;
private String kcdw;
private String syl;
private String syldw;
public String getMc() {
return mc;
}
public void setMc(String mc) {
this.mc = mc;
}
public String getBh() {
return bh;
}
public void setBh(String bh) {
this.bh = bh;
}
public String getPh() {
return ph;
}
public void setPh(String ph) {
this.ph = ph;
}
public String getNd() {
return nd;
}
public void setNd(String nd) {
this.nd = nd;
}
public String getSource() {
return source;
}
public void setSource(String source) {
this.source = source;
}
public int getType() {
return type;
}
public void setType(int type) {
this.type = type;
}
public String getSxrq() {
return sxrq;
}
public void setSxrq(String sxrq) {
this.sxrq = sxrq;
}
public int getNdz() {
return ndz;
}
public void setNdz(int ndz) {
this.ndz = ndz;
}
public String getNddw() {
return nddw;
}
public void setNddw(String nddw) {
this.nddw = nddw;
}
public int getKc() {
return kc;
}
public void setKc(int kc) {
this.kc = kc;
}
public String getKcdw() {
return kcdw;
}
public void setKcdw(String kcdw) {
this.kcdw = kcdw;
}
public String getSyl() {
return syl;
}
public void setSyl(String syl) {
this.syl = syl;
}
public String getSyldw() {
return syldw;
}
public void setSyldw(String syldw) {
this.syldw = syldw;
}
}

+ 5
- 0
hxhq-modules/hxhq-system/src/main/java/com/hxhq/business/mapper/CellMapper.java View File

@ -18,6 +18,11 @@ import java.util.List;
public interface CellMapper extends BaseMapper<Cell>
{
/**
* 试验管理-物资列表-细胞列表
* @param queryWrapper
* @return
*/
List<Cell> queryStudyList(@Param("ew") Wrapper<Cell> queryWrapper);
}

+ 22
- 0
hxhq-modules/hxhq-system/src/main/java/com/hxhq/business/mapper/SjMapper.java View File

@ -20,4 +20,26 @@ public interface SjMapper extends BaseMapper
{
List<SjListDto> queryStudyList(@Param("ew") Wrapper<Sj> queryWrapper);
/**
* 修改库存
* @param id 试剂id
* @param kc 库存量
*/
void updateKc(@Param("id") Long id, @Param("kc") String kc);
/**
* 批量修改库存
* @param bhList 试剂编号
* @param kc 库存量
*/
void updateKcBatch(@Param("bhList") List<String> bhList, @Param("kc") String kc);
/**
* 修改存储条件
* @param bhList 试剂编号
* @param cctj 存储条件
* @param ccwz 存储位置
*/
void updateCc(@Param("bhList") List<String> bhList, @Param("cctj") String cctj, @Param("ccwz") String ccwz);
}

+ 5
- 0
hxhq-modules/hxhq-system/src/main/java/com/hxhq/business/service/ISjService.java View File

@ -3,6 +3,8 @@ package com.hxhq.business.service;
import java.util.List;
import com.hxhq.business.domain.Sj;
import com.baomidou.mybatisplus.extension.service.IService;
import com.hxhq.business.domain.StudyFormFill;
import com.hxhq.business.domain.Template;
import com.hxhq.business.dto.gsp.GspListDto;
import com.hxhq.business.dto.sj.SjListDto;
import com.hxhq.business.form.gsp.GspSearchListForm;
@ -60,4 +62,7 @@ public interface ISjService extends IService
/** 试验物资列表 */
List<SjListDto> queryStudyList(GspSearchListForm form);
/** 表单生成试剂逻辑处理 */
void genResource(StudyFormFill studyFormFill, Template template);
}

+ 195
- 14
hxhq-modules/hxhq-system/src/main/java/com/hxhq/business/service/impl/SjServiceImpl.java View File

@ -2,14 +2,17 @@ package com.hxhq.business.service.impl;
import java.math.BigDecimal;
import java.util.*;
import java.util.stream.Collectors;
import cn.hutool.json.JSONUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.hxhq.business.domain.Mjy;
import com.hxhq.business.domain.Sj;
import com.hxhq.business.domain.SjTz;
import com.hxhq.business.domain.SjJcgj;
import com.hxhq.business.domain.*;
import com.hxhq.business.dto.sj.SjListDto;
import com.hxhq.business.dto.study.StudyFormFillCc;
import com.hxhq.business.dto.study.StudyFormFillCz;
import com.hxhq.business.dto.study.StudyFormFillResource;
import com.hxhq.business.enums.zykgl.JcgjlxEnum;
import com.hxhq.business.enums.zykgl.JcmcysEnum;
import com.hxhq.business.enums.zykgl.JyztEnum;
@ -23,6 +26,7 @@ import com.hxhq.business.utils.JctUtil;
import com.hxhq.business.utils.ObjectCompareUtil;
import com.hxhq.common.core.exception.ServiceException;
import com.hxhq.common.core.utils.DateUtils;
import com.hxhq.common.security.utils.SecurityUtils;
import com.hxhq.system.api.domain.SysUser;
import com.hxhq.system.service.ISysUserService;
import org.apache.commons.lang3.StringUtils;
@ -468,16 +472,16 @@ public class SjServiceImpl extends ServiceImpl implements ISjServi
List<SjJcgj> gspJcgjList = new ArrayList<>();
for (ObjectCompareUtil.FieldChange fieldChange : fieldChanges) {
SjJcgj gspJcgj = new SjJcgj();
gspJcgj.setSjId(sjOld.getId());
gspJcgj.setJcgjlx(JcgjlxEnum.lc.getValue());
gspJcgj.setJcmc("编辑");
gspJcgj.setJcmcys(JcmcysEnum.green.getValue());
gspJcgj.setJcnr(fieldChange.toString());
gspJcgj.setQmrId(qmr.getUserId());
gspJcgj.setQmrMc(qmr.getNickName());
gspJcgj.setRemark(form.getQmbz());
gspJcgjList.add(gspJcgj);
SjJcgj sjJcgj = new SjJcgj();
sjJcgj.setSjId(sjOld.getId());
sjJcgj.setJcgjlx(JcgjlxEnum.lc.getValue());
sjJcgj.setJcmc("编辑");
sjJcgj.setJcmcys(JcmcysEnum.green.getValue());
sjJcgj.setJcnr(fieldChange.toString());
sjJcgj.setQmrId(qmr.getUserId());
sjJcgj.setQmrMc(qmr.getNickName());
sjJcgj.setRemark(form.getQmbz());
gspJcgjList.add(sjJcgj);
}
sjJcgjService.saveBatch(gspJcgjList);
}
@ -512,4 +516,181 @@ public class SjServiceImpl extends ServiceImpl implements ISjServi
return baseMapper.queryStudyList(queryWrapper);
}
@Override
public void genResource(StudyFormFill studyFormFill, Template template) {
SysUser qmr = sysUserService.selectUserById(SecurityUtils.getUserId());
Long studyId = studyFormFill.getStudyId();
Long studyFormId = studyFormFill.getId();
// 生成/使用
String resource = studyFormFill.getResource();
Map<String, Sj> sjMap = new HashMap<>();
List<SjJcgj> jcgjList = new ArrayList<>();
List<SjTz> tzList = new ArrayList<>();
if(StringUtils.isNotEmpty(resource) && !StringUtils.equals("[]", resource)) {
List<StudyFormFillResource> studyFormFillResourceList = JSONUtil.toList(resource, StudyFormFillResource.class);
List<String> bhList = studyFormFillResourceList.stream().map(StudyFormFillResource::getBh).collect(Collectors.toList());
// 根据编号获取需要处置的试剂列表
LambdaQueryWrapper<Sj> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.in(Sj::getBh, bhList);
List<Sj> resourceList = this.list(queryWrapper);
for (Sj sj : resourceList) {
sjMap.put(sj.getBh(), sj);
}
for (StudyFormFillResource studyFormFillResource : studyFormFillResourceList) {
Sj sj = sjMap.get(studyFormFillResource.getBh());
if(sj == null) {
sj = new Sj();
sj.setStudyId(studyId);
sj.setStudyFormId(studyFormId);
sj.setZjzt(ZjztEnum.rk.getValue());
sj.setJyzt(JyztEnum.wjy.getValue());
sj.setDeptId(template.getDeptId());
}
sj.setMc(studyFormFillResource.getMc());
sj.setBh(studyFormFillResource.getBh());
sj.setNd(String.valueOf(studyFormFillResource.getNdz()));
sj.setNddw(studyFormFillResource.getNddw());
sj.setKc(String.valueOf(studyFormFillResource.getKc()));
sj.setKcdw(studyFormFillResource.getKcdw());
sj.setLy(studyFormFillResource.getSource());
sj.setSxr(DateUtils.parseDate(studyFormFillResource.getSxrq()));
sj.setPzrq(studyFormFill.getStartDate());
// TODO 规格有效周期
if(sj.getId() == null) {
this.save(sj);
// 稽查轨迹
SjJcgj sjJcgj = new SjJcgj();
sjJcgj.setSjId(sj.getId());
sjJcgj.setJcgjlx(JcgjlxEnum.lc.getValue());
sjJcgj.setJcmc("配制完成");
sjJcgj.setJcmcys(JcmcysEnum.green.getValue());
sjJcgj.setQmrId(qmr.getUserId());
sjJcgj.setQmrMc(qmr.getNickName());
jcgjList.add(sjJcgj);
// 台账
SjTz sjTz = new SjTz();
sjTz.setSjId(sj.getId());
sjTz.setQmrId(qmr.getUserId());
sjTz.setQmrMc(qmr.getNickName());
sjTz.setQmyy("配制完成");
sjTz.setCzl(sj.getKc());
sjTz.setCzldw(sj.getKcdw());
tzList.add(sjTz);
} else {
this.updateById(sj);
}
// 使用
String syl = studyFormFillResource.getSyl();
if(StringUtils.isNotEmpty(syl) && NumberUtils.isParsable(syl)) {
BigDecimal kc = new BigDecimal(sj.getKc());
kc = kc.subtract(new BigDecimal(syl));
baseMapper.updateKc(sj.getId(), kc.toString());
// 使用稽查轨迹
Map<String, String> jcnrMap = new LinkedHashMap<>();
jcnrMap.put("使用量", syl + studyFormFillResource.getSyldw());
SjJcgj syJcgj = new SjJcgj();
syJcgj.setSjId(sj.getId());
syJcgj.setJcgjlx(JcgjlxEnum.lc.getValue());
syJcgj.setJcmc("使用");
syJcgj.setJcnr(JctUtil.formatStr(jcnrMap));
syJcgj.setJcmcys(JcmcysEnum.green.getValue());
syJcgj.setQmrId(qmr.getUserId());
syJcgj.setQmrMc(qmr.getNickName());
jcgjList.add(syJcgj);
// 台账
SjTz sjTz = new SjTz();
sjTz.setSjId(sj.getId());
sjTz.setQmrId(qmr.getUserId());
sjTz.setQmrMc(qmr.getNickName());
sjTz.setQmyy("使用");
sjTz.setCzl(syl);
sjTz.setCzldw(studyFormFillResource.getKcdw());
tzList.add(sjTz);
}
sjMap.put(sj.getBh(), sj);
}
}
// 存储
String cclist = studyFormFill.getCclist();
if(StringUtils.isNotEmpty(cclist) && !StringUtils.equals("[]", cclist)) {
List<StudyFormFillCc> studyFormFillCcList = JSONUtil.toList(cclist, StudyFormFillCc.class);
for (StudyFormFillCc studyFormFillCc : studyFormFillCcList) {
baseMapper.updateCc(studyFormFillCc.getList(), studyFormFillCc.getCctj(), studyFormFillCc.getCcwz());
for (String bh : studyFormFillCc.getList()) {
Sj sj = sjMap.get(bh);
// 稽查轨迹
LinkedHashMap<String, String> jcnrMap = new LinkedHashMap<>();
jcnrMap.put("存储位置", studyFormFillCc.getCcwz());
jcnrMap.put("存储条件", studyFormFillCc.getCctj());
SjJcgj jcgj = new SjJcgj();
jcgj.setSjId(sj.getId());
jcgj.setJcgjlx(JcgjlxEnum.bj.getValue());
jcgj.setJcnr(JctUtil.formatStr(jcnrMap));
jcgj.setJcmcys(JcmcysEnum.green.getValue());
jcgj.setQmyy("存储");
jcgj.setQmrId(qmr.getUserId());
jcgj.setQmrMc(qmr.getNickName());
jcgjList.add(jcgj);
// 台账
SjTz sjTz = new SjTz();
sjTz.setSjId(sj.getId());
sjTz.setQmrId(qmr.getUserId());
sjTz.setQmrMc(qmr.getNickName());
sjTz.setQmyy("存储");
sjTz.setCzl(sj.getKc());
sjTz.setCzldw(sj.getKcdw());
tzList.add(sjTz);
}
}
}
// 处置库存全变为0
String czlist = studyFormFill.getCzlist();
if(StringUtils.isNotEmpty(czlist) && !StringUtils.equals("[]", czlist)) {
List<StudyFormFillCz> studyFormFillCzList = JSONUtil.toList(czlist, StudyFormFillCz.class);
for (StudyFormFillCz studyFormFillCz : studyFormFillCzList) {
for (String bh : studyFormFillCz.getList()) {
Sj sj = sjMap.get(bh);
// 稽查轨迹
LinkedHashMap<String, String> jcnrMap = new LinkedHashMap<>();
jcnrMap.put("处置方式", studyFormFillCz.getCzfs());
jcnrMap.put("处置量", sj.getKc() + sj.getKcdw());
SjJcgj jcgj = new SjJcgj();
jcgj.setSjId(sj.getId());
jcgj.setJcgjlx(JcgjlxEnum.bj.getValue());
jcgj.setJcnr(JctUtil.formatStr(jcnrMap));
jcgj.setJcmcys(JcmcysEnum.green.getValue());
jcgj.setQmyy("处置");
jcgj.setQmrId(qmr.getUserId());
jcgj.setQmrMc(qmr.getNickName());
jcgjList.add(jcgj);
// 台账
SjTz sjTz = new SjTz();
sjTz.setSjId(sj.getId());
sjTz.setQmrId(qmr.getUserId());
sjTz.setQmrMc(qmr.getNickName());
sjTz.setQmyy("处置");
sjTz.setCzl(sj.getKc());
sjTz.setCzldw(sj.getKcdw());
tzList.add(sjTz);
}
baseMapper.updateKcBatch(studyFormFillCz.getList(), "0");
}
}
sjJcgjService.saveBatch(jcgjList);
sjTzService.saveBatch(tzList);
}
}

+ 0
- 40
hxhq-modules/hxhq-system/src/main/java/com/hxhq/business/utils/PdfUtil.java View File

@ -22,46 +22,6 @@ public class PdfUtil {
private static final Logger log = LoggerFactory.getLogger(PdfUtil.class);
public static void appendWithPdfStamper(String sourcePDF, String destPDF, String content)
throws IOException, DocumentException {
// 读取原始PDF
PdfReader reader = new PdfReader(sourcePDF);
// 获取总页数
int pageCount = reader.getNumberOfPages();
// 创建PdfStamper
PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(destPDF));
// 获取PdfContentByte
PdfContentByte canvas = stamper.getOverContent(pageCount); // 最后一页添加
// 或者创建新页
stamper.insertPage(pageCount + 1, reader.getPageSize(1));
canvas = stamper.getOverContent(pageCount + 1);
// 开始写入内容
ColumnText ct = new ColumnText(canvas);
// 设置写入位置
ct.setSimpleColumn(36, 36, 559, 806); // 页面边距
// 添加内容
ct.addElement(new Paragraph("追加内容:"));
ct.addElement(new Paragraph(content));
ct.addElement(new Paragraph(new java.util.Date().toString()));
// 执行写入
ct.go();
stamper.close();
reader.close();
System.out.println("追加完成!");
}
public static void main(String[] args) {
/* String fileDir="d:/";
exportForm("张三 2025-12-12 14:52:52",fileDir);

+ 6
- 4
hxhq-modules/hxhq-system/src/main/java/com/hxhq/business/utils/StudyMethodFileUtil.java View File

@ -60,7 +60,8 @@ public class StudyMethodFileUtil {
*/
private static void copyOriginalPagesToDocument(Document doc, PdfWriter writer, PdfReader reader) throws DocumentException {
int pageCount = reader.getNumberOfPages();
PdfContentByte canvas = writer.getDirectContent(); // 获取直接内容画布
// 获取直接内容画布
PdfContentByte canvas = writer.getDirectContent();
for (int i = 1; i <= pageCount; i++) {
doc.newPage(); // 新建一页与原PDF页面一一对应
@ -77,7 +78,7 @@ public class StudyMethodFileUtil {
* @param fileDir
* @return
*/
public static String exportTable(String headerText, List<StudyMethodRead> list, String SRC_PDF, String fileDir) {
public static String exportTable(String headerText, List<StudyMethodRead> list, String srcPdf, String fileDir) {
Document document = null;
FileOutputStream fos = null;
String filePath = "";
@ -98,8 +99,9 @@ public class StudyMethodFileUtil {
// 创建PDF文档 设置文档边距避免内容遮挡页眉页脚
// 1. 读取原有PDF获取页面尺寸保证新文档与原文档格式一致
PdfReader srcReader = new PdfReader(SRC_PDF);
Rectangle pageSize = srcReader.getPageSize(1); // 取第一页尺寸作为新文档尺寸
PdfReader srcReader = new PdfReader(srcPdf);
// 取第一页尺寸作为新文档尺寸
Rectangle pageSize = srcReader.getPageSize(1);
// 2. 初始化DocumentiText 5的核心高层类
document = new Document(pageSize);

+ 15
- 0
hxhq-modules/hxhq-system/src/main/resources/mapper/business/SjMapper.xml View File

@ -3,6 +3,21 @@
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.hxhq.business.mapper.SjMapper">
<update id="updateKcBatch">
UPDATE t_sj SET kc = #{kc} WHERE bh in
<foreach item="item" index="index" collection="idList" separator=",">
(#{item})
</foreach>
</update>
<update id="updateCc">
UPDATE t_sj SET cctj = #{cctj}, ccwz = #{ccwz} WHERE bh in
<foreach item="item" index="index" collection="idList" separator=",">
(#{item})
</foreach>
</update>
<update id="updateKc">
UPDATE t_sj SET kc = #{kc} WHERE id = #{id}
</update>
<select id="queryStudyList" resultType="com.hxhq.business.dto.sj.SjListDto">
select t.id,t.mc,t.bh,t.nd,t.nddw,t.kc,t.kcdw,t.sxr,t.zjzt,t.ly
FROM `t_study_sj` ts

Loading…
Cancel
Save