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("").append(name).append(">");
}
}
}