package thyyxxk.webserver.service.zhuyuanyisheng;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.ListUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import thyyxxk.webserver.config.exception.BizException;
import thyyxxk.webserver.config.exception.ExceptionEnum;
import thyyxxk.webserver.constants.Capacity;
import thyyxxk.webserver.constants.sidicts.ChargeStatus;
import thyyxxk.webserver.dao.his.inpatient.XiangMuLuRuDao;
import thyyxxk.webserver.dao.his.zhuyuanyisheng.YiZhuLuRuDao;
import thyyxxk.webserver.entity.ResultVo;
import thyyxxk.webserver.entity.RoleCode;
import thyyxxk.webserver.entity.datamodify.GetDropdownBox;
import thyyxxk.webserver.entity.datamodify.YzActOrder;
import thyyxxk.webserver.entity.datamodify.ZyDetailCharge;
import thyyxxk.webserver.entity.inpatient.patient.Overview;
import thyyxxk.webserver.entity.inpatient.patient.Patient;
import thyyxxk.webserver.entity.login.UserInfo;
import thyyxxk.webserver.entity.zhuyuanyisheng.DoctorSOrderFee;
import thyyxxk.webserver.entity.zhuyuanyisheng.ZyOrderZk;
import thyyxxk.webserver.entity.zhuyuanyisheng.yizhuluru.*;
import thyyxxk.webserver.service.PublicServer;
import thyyxxk.webserver.service.externalhttp.DrgWebServices;
import thyyxxk.webserver.service.heliyongyao.RationalUseServer;
import thyyxxk.webserver.service.redislike.RedisLikeService;
import thyyxxk.webserver.utils.*;
import java.math.BigDecimal;
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;
/**
*
* 描述: 医嘱录入
*
*
* @author xc
* @date 2022-01-04 16:59
*/
@Service
@Slf4j
public class YiZhuLuRuServer {
private final YiZhuLuRuDao dao;
private final PublicServer publicServer;
private final RedisLikeService redisLikeService;
private final XiangMuLuRuDao xiangMuLuRuDao;
private final RationalUseServer rationalUseServer;
private final DrgWebServices drgWebServices;
/**
* 转科的医嘱编码
*/
private final String ZK_CODE = "06286";
private final String ONCE = "ONCE";
private final String ITEM = "00";
private final String SMALL_PACKAGE = "01";
private final String BIG_PACKAGE = "99";
public YiZhuLuRuServer(YiZhuLuRuDao dao, PublicServer publicServer, RedisLikeService redisLikeService, XiangMuLuRuDao xiangMuLuRuDao, RationalUseServer rationalUseServer, DrgWebServices drgWebServices) {
this.dao = dao;
this.publicServer = publicServer;
this.redisLikeService = redisLikeService;
this.xiangMuLuRuDao = xiangMuLuRuDao;
this.rationalUseServer = rationalUseServer;
this.drgWebServices = drgWebServices;
}
public ResultVo getOrderNo() {
return ResultVoUtil.success(BigDecimal.valueOf(publicServer.getActOrderNo()).stripTrailingZeros().toPlainString());
}
public ResultVo> getMyPatient() {
return ResultVoUtil.success(dao.getMyPatient(TokenUtil.getTokenUserId()));
}
/**
* 获取医嘱的名称 这里为什么不用 医嘱的code和医嘱号呢,是因为药品编码和项目编码有些一样而医嘱号,又每次只能查询一个
*
* @param inpatientNo 住院号
* @param admissTimes 住院次数
* @param orderName 前端搜索的医嘱名称
* @return 返回医嘱名称去重了
*/
public ResultVo> huoQuYiZhuMingCheng(String inpatientNo, Integer admissTimes, String orderName) {
return ResultVoUtil.success(dao.huoQuYiZhuMingZi(inpatientNo, admissTimes, StringUtil.isContainChinese(orderName)));
}
/**
* 获取患者个人的频率
*
* @param patNo 住院号
* @param times 住院次数
* @return 返回自己的医嘱频率
*/
@Deprecated
public ResultVo> huoQuGeRenPinLv(String patNo, Integer times) {
return ResultVoUtil.success(dao.huoQuGeRenPinLv(patNo, times));
}
/**
* 获取医嘱的数据
* 可以根据,医嘱时间区间,执行频率,医嘱名
*
* @param param 查询条件
* @return 返回分页数据,同时做了树状图,这样会有一个问题,那就是开了套餐的数据查询不出来
*/
public ResultVo> huoQuYiZhuShuJu(YiZhuFeiYongChaXunTiaoJian param) {
QueryWrapper> qw = new QueryWrapper<>();
qw.eq("a.inpatient_no", param.getPatNo()).eq("a.admiss_times", param.getTimes());
// qw.orderByDesc("a.act_order_no");
qw.orderByAsc("a.order_time");
List yiZhuList = dao.huoQuYiZhuShuJu(qw);
// 还有那些没有被匹配的子级医嘱
Map wuFuJiYiZhu = yiZhuList.stream().collect(Collectors.toMap(XinZhenYzActOrder::getActOrderNo, a -> a, (k1, k2) -> k1));
if (ListUtil.isBlank(yiZhuList)) {
return ResultVoUtil.fail(ExceptionEnum.NO_DATA_EXIST);
}
// 做成树状图
Map map = new HashMap<>();
List tree = new ArrayList<>();
for (XinZhenYzActOrder item : yiZhuList) {
if (item.getParentNo() == null) {
tree.add(item);
wuFuJiYiZhu.remove(item.getActOrderNo());
}
map.put(item.getActOrderNo(), item);
EntityStringTrim.beanAttributeValueTrim(item);
if ("00".equals(item.getSerial())) {
item.setGroupNoName("项目");
item.setSerialName("项目");
} else {
if ("01".equals(item.getSerial())) {
item.setSerialName("小包装");
} else if ("99".equals(item.getSerial())) {
item.setSerialName("大包装");
}
}
}
for (XinZhenYzActOrder item : yiZhuList) {
XinZhenYzActOrder actOrder = map.get(item.getParentNo());
if (actOrder != null) {
wuFuJiYiZhu.remove(item.getActOrderNo());
if (actOrder.getChildren() == null) {
actOrder.setChildren(new ArrayList<>());
actOrder.setOrderGroup("┌");
}
item.setOrderGroup("丨");
actOrder.getChildren().add(item);
}
}
if (!wuFuJiYiZhu.isEmpty()) {
tree.addAll(wuFuJiYiZhu.values());
}
// 删除前后空格
EntityStringTrim.beanAttributeValueTrimList(tree);
List list = new ArrayList<>();
for (XinZhenYzActOrder zy : tree) {
list.add(zy);
if (ListUtil.notBlank(zy.getChildren())) {
zy.getChildren().get(zy.getChildren().size() - 1).setOrderGroup("└");
list.addAll(zy.getChildren());
zy.setChildren(null);
}
}
return ResultVoUtil.success(list);
}
/**
* 获取搜索的项目信息,如药品和项目
*
* @param code 拼音首字母,中文,编码来进行搜索
* @return 返回项目信息
*/
public ResultVo> huoQuXiangMu(String code) {
code = StringUtil.isContainChinese(code);
// 药品
List list = dao.yiZhuYaoPing(code, publicServer.getGroupNo());
// 项目
list.addAll(dao.yiZhuXiangMu(code));
// 模板
list.addAll(dao.composeOrders(code, redisLikeService.getUserInfoByToken().getDeptCode()));
EntityStringTrim.beanAttributeValueTrimList(list);
return ResultVoUtil.success(list);
}
/**
* 获取父医嘱
*
* @param patNo 住院号
* @param times 次数
* @return
*/
public ResultVo> getParentOrders(String patNo, String times) {
return ResultVoUtil.success(dao.getParentOrders(patNo, times));
}
/**
* 确认医嘱 , 这个是最新的正确的
*
* @param param 数据
* @return 返回提示
*/
public ResultVo