package thyyxxk.webserver.service.heliyongyao;
import com.alibaba.fastjson.JSON;
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 yiZhuLuRuDao;
private final PublicServer publicServer;
public RationalUseServer(RationalUseDao dao, RationalUseSrvc http, YiZhuLuRuDao yiZhuLuRuDao, PublicServer publicServer) {
this.dao = dao;
this.http = http;
this.yiZhuLuRuDao = yiZhuLuRuDao;
this.publicServer = publicServer;
}
public ResultVo jiaoYan(XinZhenYiZhu param) {
log.info("数据:{}", JSON.toJSONString(param));
String userCode = "99999".equals(TokenUtil.getTokenUserId()) ? param.getUserCode() : TokenUtil.getTokenUserId();
// 医生信息
Map doctMap = yiShenXinXi(userCode);
String baseXml = doctMap.get("baseXml");
String doct = doctMap.get("doct");
List yp = new ArrayList<>();
QueryWrapper> qw = new QueryWrapper<>();
List yaoPinBianMa = new ArrayList<>();
for (XinZhenYzActOrder item : param.getList()) {
if (StringUtil.notBlank(item.getSerial())) {
if (!"00".equals(item.getSerial())) {
yp.add(item);
String key = item.getOrderCode().trim() + item.getSerial().trim();
if (!yaoPinBianMa.contains(key)) {
yaoPinBianMa.add(key);
}
}
}
}
qw.in("rtrim(code) + rtrim(serial)", yaoPinBianMa);
Map yaoPinMap = dao.yaoPingXinXi(qw).stream().collect(
Collectors.toMap(YaoPin::getId, a -> a, (k1, k2) -> k1)
);
String detailsXml = yaoPinXinXi(param.getInpatientNo(), param.getAdmissTimes(), param.getCfType(), yp, doct, yaoPinMap);
String js = String.format("{\"BaseXml\": \"%s\", \"DetailsXml\" : \"%s\"}", baseXml, detailsXml);
log.info("上传数据:{} ", js);
try {
JSONObject fanHuiXinXi = http.rationalUse(js);
log.info("返回的数据:{}", fanHuiXinXi);
return ResultVoUtil.success(fanHuiXinXi);
} catch (Exception e) {
e.printStackTrace();
return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, "网络错误");
}
}
public Map yiShenXinXi(String code) {
Map yiShenXinXi = dao.yiShenXinXi(code);
if (yiShenXinXi == null || yiShenXinXi.isEmpty()) {
yiShenXinXi = new HashMap<>(Capacity.TWO);
}
Map map = new HashMap<>(Capacity.TWO);
String baseXml = "" +
"HIS" +
"H43010500370" +
"长沙泰和医院" +
"" + nullToBlank(yiShenXinXi.get("dept_code")) + "" +
"" + nullToBlank(yiShenXinXi.get("dept_name")) + "" +
"" +
"" + nullToBlank(yiShenXinXi.get("code")) + "
" +
"" + nullToBlank(yiShenXinXi.get("name")) + "" +
"" + nullToBlank(yiShenXinXi.get("type")) + "" +
"" + nullToBlank(yiShenXinXi.get("type_name")) + "" +
"" +
"";
map.put("baseXml", baseXml);
String sb = "" + nullToBlank(yiShenXinXi.get("dept_code")) + "" +
"" + nullToBlank(yiShenXinXi.get("dept_name")) + "" +
"" + nullToBlank(yiShenXinXi.get("code")) + "" +
"" + nullToBlank(yiShenXinXi.get("name")) + "";
map.put("doct", sb);
return map;
}
public String nullToBlank(String str) {
if (StringUtil.isBlank(str)) {
return "";
}
return str.trim();
}
public String yaoPinXinXi(String patNo,
Integer times,
String cfType,
List yaoPinShuZu,
String doct,
Map yaoPinMap) {
log.info("数据:{}", JSON.toJSONString(yaoPinShuZu));
StringBuilder sb = new StringBuilder();
RationalUsePatient patient = dao.huanZheXinXi(patNo, times);
if (patient == null) {
throw new BizException(ExceptionEnum.LOGICAL_ERROR, "没有找到对应患者的信息。");
}
XinZhenYiZhu patient1 = yiZhuLuRuDao.huoQuHuanZheXinXi(patNo, times);
// 中西药处方/医嘱类型标识
// 就诊类型
// 就诊号
sb.append("")
.append("H43010500370")
.append("").append(DateUtil.formatDatetime(new Date())).append("")
.append("ip")
// 中西药处方/医嘱类型标识
.append("").append(cfType).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(patient1.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.getSex())).append("")
.append("").append("").append("")
.append("").append("").append("")
.append("").append(patient.getIdCard()).append("")
.append("").append("").append("")
.append("").append("").append("")
.append("").append("").append("")
.append("").append("").append("")
.append("").append("").append("");
// 过敏节点,可循环
sb.append("");
List guoMinShuZu = dao.guoMin(patNo);
xunHuanJieDian(sb, guoMinShuZu, "allergic");
sb.append("");
// 皮试节点,可循环
sb.append("");
List piShiShuZu = new ArrayList<>();
if (ListUtil.isBlank(piShiShuZu)) {
XunHuanJieDian piShi = new XunHuanJieDian();
piShi.setCode("").setName("").setResult("");
piShiShuZu.add(piShi);
}
for (XunHuanJieDian item : piShiShuZu) {
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 zhenDuanShuJu = dao.zhenDuan(patNo, times);
// 诊断节点
xunHuanJieDian(sb, zhenDuanShuJu, "diagnose");
sb.append("")
.append("");
// 处方信息
sb.append("")
.append("")
.append("").append("0").append("")
.append("").append("").append("")
.append("").append("1").append("")
.append("").append("T").append("")
.append("").append(DateUtil.formatDatetime(new Date())).append("")
// 药品信息节点,可循环
.append("");
for (XinZhenYzActOrder item : yaoPinShuZu) {
YaoPin yp = yaoPinMap.get(item.getOrderCode().trim() + item.getSerial().trim());
if (null == yp) {
yp = new YaoPin();
yp.setPackRetprice(BigDecimal.valueOf(1));
}
item.setRationalDrugUseId(SnowFlakeId.instance().nextId());
// 因为我要入库才能生成医嘱号所以这里用雪花算法
sb.append("")
.append("").append("0").append("")
// 因为我要入库才能生成医嘱号所以这里用雪花算法
.append("").append(item.getRationalDrugUseId()).append("")
.append("").append("1").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(publicServer.getGroupNo()).append("")
.append("").append("").append("")
.append("").append(nullToBlank(item.getDoseUnitName())).append("")
.append("").append(item.getDose()).append("")
.append("").append("").append("")
.append("").append("").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("")
.append(doct)
.append("").append("2").append("")
.append("").append(yp.getPackRetprice().multiply(item.getDrugQuan())).append("")
.append("");
}
sb.append("");
return sb.toString();
}
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(">");
}
}
}