package thyyxxk.webserver.service.heliyongyao; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import thyyxxk.webserver.config.exception.BizException; import thyyxxk.webserver.config.exception.ExceptionEnum; import thyyxxk.webserver.constants.Capacity; import thyyxxk.webserver.dao.his.heliyongyao.RationalUseDao; import thyyxxk.webserver.dao.his.zhuyuanyisheng.YiZhuLuRuDao; import thyyxxk.webserver.entity.ResultVo; import thyyxxk.webserver.entity.heliyongyao.RationalUsePatient; import thyyxxk.webserver.entity.heliyongyao.XunHuanJieDian; import thyyxxk.webserver.entity.heliyongyao.YaoPin; import thyyxxk.webserver.entity.zhuyuanyisheng.yizhuluru.XinZhenYiZhu; import thyyxxk.webserver.entity.zhuyuanyisheng.yizhuluru.XinZhenYzActOrder; import thyyxxk.webserver.service.PublicServer; import thyyxxk.webserver.service.externalhttp.RationalUseSrvc; import thyyxxk.webserver.utils.*; import java.math.BigDecimal; import java.util.*; import java.util.stream.Collectors; /** *

* 描述: 合理用药 *

* * @author xc * @date 2022-03-29 11:27 */ @Service @Slf4j public class RationalUseServer { private final RationalUseDao dao; private final RationalUseSrvc http; private final YiZhuLuRuDao orderDao; public RationalUseServer(RationalUseDao dao, RationalUseSrvc http, YiZhuLuRuDao orderDao) { this.dao = dao; this.http = http; this.orderDao = orderDao; } public ResultVo rationalUseOfMedicine(String patNo, Integer times) { QueryWrapper qw = new QueryWrapper<>(); // 查询药品医嘱 qw.eq("a.inpatient_no", patNo) .eq("a.admiss_times", times) .eq("a.status_flag", "1") .eq("a.enter_oper", TokenUtil.getTokenUserId()) .eq("isnull(a.self_buy,'0')", "0") .ne("a.serial", "00"); XinZhenYiZhu patInfo = orderDao.queryPatientInfo(patNo, times); // 获取新开的医嘱 patInfo.setList(orderDao.selectOrderNo(qw)); List historicalData = dao.getHistoricalMedicalOrders(patNo, times); JSONObject js = verify(patInfo, historicalData); return ResultVoUtil.success(js); } /** * 调用药品审方接口 * * @param url 审方地址 * @return 返回提示 */ public ResultVo auditingInterface(String url) { return ResultVoUtil.success(http.auditingInterface(url)); } public JSONObject verify(XinZhenYiZhu param, List historicalData) { String userCode = TokenUtil.getTokenUserId(); // 医生信息 Map doctMap = doctorInfo(userCode); String baseXml = doctMap.get("baseXml"); String doctXml = doctMap.get("doct"); QueryWrapper qw = new QueryWrapper<>(); List drugList = new ArrayList<>(); addTheDrugCode(param.getList(), drugList); addTheDrugCode(historicalData, drugList); if (ListUtil.isBlank(drugList)) { return new JSONObject(); } qw.in("rtrim(code) + rtrim(serial)", drugList); Map drugMap = dao.selectDrug(qw).stream().collect( Collectors.toMap(YaoPin::getId, a -> a, (k1, k2) -> k1) ); String detailsXml = drugInfoFunc(param.getInpatientNo(), param.getAdmissTimes(), param.getList(), doctXml, drugMap, historicalData); String js = String.format("{\"BaseXml\": \"%s\", \"DetailsXml\" : \"%s\"}", baseXml, detailsXml); log.info("js:{}", js); return http.rationalUse(js); } /** * 添加药品编码 * * @param list * @param yp * @param drugList */ private static void addTheDrugCode(List list, List drugList) { for (XinZhenYzActOrder item : list) { if (StringUtil.notBlank(item.getSerial())) { String key = item.getOrderCode().trim() + item.getSerial().trim(); if (!drugList.contains(key)) { drugList.add(key); } } } } public Map doctorInfo(String code) { Map doctorInfo = dao.yiShenXinXi(code); if (doctorInfo == null || doctorInfo.isEmpty()) { doctorInfo = new HashMap<>(Capacity.TWO); } Map map = new HashMap<>(Capacity.TWO); String baseXml = "" + "HIS" + "H43010500370" + "长沙泰和医院" + "" + nullToBlank(doctorInfo.get("dept_code")) + "" + "" + nullToBlank(doctorInfo.get("dept_name")) + "" + "" + "" + nullToBlank(doctorInfo.get("code")) + "" + "" + nullToBlank(doctorInfo.get("name")) + "" + "" + nullToBlank(doctorInfo.get("type")) + "" + "" + nullToBlank(doctorInfo.get("type_name")) + "" + "" + ""; map.put("baseXml", baseXml); String sb = "" + nullToBlank(doctorInfo.get("dept_code")) + "" + "" + nullToBlank(doctorInfo.get("dept_name")) + "" + "" + nullToBlank(doctorInfo.get("code")) + "" + "" + nullToBlank(doctorInfo.get("name")) + ""; map.put("doct", sb); return map; } public String nullToBlank(String str) { if (StringUtil.isBlank(str)) { return ""; } return str.trim(); } /** * @param patNo 住院号 * @param times 住院次数 * @param drugData 需要审核的药品 * @param doct 文档节点 * @param drugMap 药品的map用 编码和规格做key * @return 返回节点 */ public String drugInfoFunc(String patNo, Integer times, List drugData, String doct, Map drugMap, List historicalData) { log.info("数据:{}", JSON.toJSONString(drugData)); StringBuilder sb = new StringBuilder(); RationalUsePatient patient = dao.huanZheXinXi(patNo, times); if (patient == null) { throw new BizException(ExceptionEnum.LOGICAL_ERROR, "没有找到对应患者的信息。"); } XinZhenYiZhu patientInfo = orderDao.queryPatientInfo(patNo, times); // 中西药处方/医嘱类型标识 // 就诊类型 // 就诊号 sb.append("") .append("H43010500370") .append("").append(DateUtil.formatDatetime(new Date())).append("") .append("ip") // 中西药处方/医嘱类型标识 .append("").append("1").append("") // 就诊类型 .append("").append("400").append("") // 就诊号 .append("").append(patNo).append("_").append(times).append(DateUtil.formatDatetime(new Date(), "YYYYMMDD")).append("") .append("").append("1").append("") .append("").append(nullToBlank(patientInfo.getBedNo())).append("") .append("") .append("").append(patNo).append("_").append(times).append("") .append("").append(nullToBlank(patient.getName())).append("") .append("").append(PublicServer.getInfantFlag(patNo)).append("") .append("").append(nullToBlank(patient.getBirth())).append("") .append("").append(nullToBlank(patient.getSexName())).append("") .append("").append("") .append("").append("") .append("").append(patient.getIdCard()).append("") .append("").append("") .append("").append("") .append("").append("") .append("").append("") .append("").append(""); // 过敏节点,可循环 sb.append(""); List allergyData = dao.guoMin(patNo); xunHuanJieDian(sb, allergyData, "allergic"); sb.append(""); // 皮试节点,可循环 sb.append(""); List skinTestData = new ArrayList<>(); if (ListUtil.isBlank(skinTestData)) { XunHuanJieDian skinTest = new XunHuanJieDian(); skinTest.setCode("").setName("").setResult(""); skinTestData.add(skinTest); } for (XunHuanJieDian item : skinTestData) { sb.append("") .append("").append(nullToBlank(item.getName())).append("") .append("").append(nullToBlank(item.getCode())).append("") .append("").append(nullToBlank(item.getResult())).append("") .append(""); } sb.append(""); // 诊断 sb.append(""); List diagnosticData = new ArrayList<>(); JSONObject medicalRecordDiagnosticData = JSONObject.parseObject(dao.medicalRecordDiagnosticData(patNo, times)); if (medicalRecordDiagnosticData != null) { JSONArray arr = medicalRecordDiagnosticData.getJSONArray("入院诊断"); if (arr != null && arr.size() > 0) { for (int i = 0; i < arr.size(); i++) { JSONObject item = arr.getJSONObject(i); XunHuanJieDian temp = new XunHuanJieDian(); temp.setType("2"); temp.setCode(item.getString("code")); temp.setName(item.getString("name")); diagnosticData.add(temp); } } } // 诊断节点 xunHuanJieDian(sb, diagnosticData, "diagnose"); sb.append("") .append(""); sb.append(""); sb.append("").append("").append("0").append("") .append("").append("") .append("").append(1).append("") .append("").append("") .append("").append(DateUtil.formatDatetime(new Date())).append("") // 药品信息节点,可循环 .append(""); // 循环处方节点 prescribingInformation(drugData, doct, drugMap, sb, 1); prescribingInformation(historicalData, doct, drugMap, sb, 0); sb.append(""); sb.append(""); return sb.toString(); } private void prescribingInformation(List drugData, String doct, Map drugMap, StringBuilder sb, int current) { for (XinZhenYzActOrder item : drugData) { YaoPin yp = drugMap.get(item.getOrderCode().trim() + item.getSerial().trim()); if (null == yp) { yp = new YaoPin(); yp.setPackRetprice(BigDecimal.valueOf(1)); } sb.append("") .append("").append("0").append("") .append("").append(item.getActOrderNo().stripTrailingZeros().toPlainString()).append("") .append("").append(current).append("") .append("").append("ONCE".equals(item.getFrequCode()) ? "T" : "L").append("") .append("").append(DateUtil.formatDatetime(item.getOrderTime())).append("") .append("").append(item.getOrderName()).append("") .append("").append(nullToBlank(item.getOrderCode() + "_" + item.getSerial())).append("") .append("").append(nullToBlank(yp.getNationalCode())).append("") .append("").append(nullToBlank(yp.getPzwh())).append("") .append("").append(nullToBlank(item.getDrugSpecification())).append("") .append("").append(nullToBlank(item.getDrugQuan() + item.getMiniUnitName())).append("") .append("").append(item.getParentNo() == null ? item.getActOrderNo().stripTrailingZeros().toPlainString() : item.getParentNo().stripTrailingZeros().toPlainString()).append("") .append("").append("") .append("").append(nullToBlank(item.getDoseUnitName())).append("") .append("").append(item.getDose()).append("") .append("").append(item.getDrugQuan()).append("") .append("").append(item.getDrugQuanName()).append("") .append("").append("ZY").append(nullToBlank(item.getFrequCode())).append("") .append("").append("ZY").append(item.getSupplyCode()).append("") .append("").append(DateUtil.formatDatetime(item.getStartTime())).append("") .append("").append(DateUtil.formatDatetime(item.getEndTime())).append("") .append("").append("") .append(doct) .append("").append("2").append("") .append("").append(yp.getPackRetprice().multiply(item.getDrugQuan())).append("") .append("").append(item.getEmergencyFlag()).append("") .append(""); } } /** * 循环节点 * * @param sb 字符串 * @param jieDian 节点 * @param name 节点名称 */ public void xunHuanJieDian(StringBuilder sb, List jieDian, String name) { if (ListUtil.isBlank(jieDian)) { XunHuanJieDian zhenDuan = new XunHuanJieDian(); zhenDuan.setType("").setCode("").setName(""); jieDian.add(zhenDuan); } for (XunHuanJieDian item : jieDian) { sb.append("<").append(name).append(">"). append("").append(nullToBlank(item.getType())).append("") .append("").append(nullToBlank(item.getName())).append("") .append("").append(nullToBlank(item.getCode())).append("") .append(""); } } }