package thyyxxk.webserver.service.zhuyuanyisheng;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.dynamic.datasource.annotation.DS;
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.ibatis.session.ExecutorType;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.jetbrains.annotations.NotNull;
import org.springframework.stereotype.Service;
import thyyxxk.webserver.config.exception.BizException;
import thyyxxk.webserver.config.exception.ExceptionEnum;
import thyyxxk.webserver.constants.sidicts.ChargeStatus;
import thyyxxk.webserver.dao.his.zhuyuanyisheng.YiZhuLuRuDao;
import thyyxxk.webserver.entity.ResultVo;
import thyyxxk.webserver.entity.RoleCode;
import thyyxxk.webserver.entity.casefrontsheet.SheetOverview;
import thyyxxk.webserver.entity.datamodify.GetDropdownBox;
import thyyxxk.webserver.entity.datamodify.SelectV2;
import thyyxxk.webserver.entity.datamodify.YzActOrder;
import thyyxxk.webserver.entity.datamodify.ZyDetailCharge;
import thyyxxk.webserver.entity.dictionary.CodeName;
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.OneClickOrder;
import thyyxxk.webserver.entity.zhuyuanyisheng.ZyOrderZk;
import thyyxxk.webserver.entity.zhuyuanyisheng.yizhuluru.*;
import thyyxxk.webserver.service.PublicServer;
import thyyxxk.webserver.service.inpatient.casefrontsheet.CaseFrontSheetMainService;
import thyyxxk.webserver.service.externalhttp.DrgWebServices;
import thyyxxk.webserver.service.redislike.RedisLikeService;
import thyyxxk.webserver.service.zhuyuanyisheng.yizhuverify.Repel;
import thyyxxk.webserver.service.zhuyuanyisheng.yizhuverify.YiZhuCheckData;
import thyyxxk.webserver.utils.*;
import java.math.BigDecimal;
import java.util.*;
import java.util.stream.Collectors;
/**
*
* 描述: 医嘱录入
*
*
* @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 DrgWebServices drgWebServices;
private final CaseFrontSheetMainService caseFrontSheetMainService;
private final SqlSessionFactory sqlSessionFactory;
/**
* 转科的医嘱编码
*/
private final String ZK_CODE = "06286";
private final String ITEM = "00";
private final String 出院带药 = "007";
public YiZhuLuRuServer(YiZhuLuRuDao dao, PublicServer publicServer, RedisLikeService redisLikeService, DrgWebServices drgWebServices, CaseFrontSheetMainService caseFrontSheetMainService, SqlSessionFactory sqlSessionFactory) {
this.dao = dao;
this.publicServer = publicServer;
this.redisLikeService = redisLikeService;
this.drgWebServices = drgWebServices;
this.caseFrontSheetMainService = caseFrontSheetMainService;
this.sqlSessionFactory = sqlSessionFactory;
}
public ResultVo getOrderNo() {
return ResultVoUtil.success(publicServer.getActOrderNo().stripTrailingZeros().toPlainString());
}
public ResultVo> getMyPatient() {
return ResultVoUtil.success(dao.getMyPatient(TokenUtil.getInstance().getTokenUserId()));
}
/**
* 获取患者的医嘱
*
* @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())
.orderByAsc("a.act_order_no");
List yiZhuList = dao.selectOrderNo(qw);
if (ListUtil.isBlank(yiZhuList)) {
return ResultVoUtil.fail(ExceptionEnum.NO_DATA_EXIST, "该患者还没有开医嘱。");
}
List list = getOrderList(yiZhuList);
return ResultVoUtil.success(list);
}
/**
* 设置医嘱号的数状图
*
* @param yiZhuList 医嘱数据
* @return s
*/
@NotNull
public static List getOrderList(List yiZhuList) {
// 还有那些没有被匹配的子级医嘱
Map wuFuJiYiZhu = yiZhuList.stream().collect(Collectors.toMap(XinZhenYzActOrder::getActOrderNo, a -> a, (k1, k2) -> k1));
// 做成树状图
Map map = new HashMap<>(yiZhuList.size());
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());
}
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 list;
}
/**
* 获取搜索的项目信息,如药品和项目
*
* @param code 拼音首字母,中文,编码来进行搜索
* @return 返回项目信息
*/
@DS("his")
public ResultVo> huoQuXiangMu(String code, String groupNo) {
code = StringUtil.isContainChinese(code);
// 药品
List list = dao.yiZhuYaoPing(code, groupNo);
// 项目
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 返回父医嘱
*/
@Deprecated
public ResultVo> getParentOrders(String patNo, Integer times) {
return ResultVoUtil.success(dao.getParentOrders(patNo, times));
}
/**
* 把有错误的子医嘱纠正回来,子医嘱要跟随父医嘱的频率 等
*
* @param list 患者的数据
*/
public void correctSubOrders(List list) {
// 父医嘱
Map parentOrder = new HashMap<>(list.size());
list.forEach(item -> parentOrder.put(item.getActOrderNo(), item));
list.forEach(item -> {
if (item.getParentNo() != null && parentOrder.containsKey(item.getParentNo())) {
XinZhenYzActOrder order = parentOrder.get(item.getParentNo());
// 判断是否需要更新
if (updateSubOrders(order, item)) {
dao.updateSubOrderStatus(item.getActOrderNo(), order);
}
}
});
}
private boolean updateSubOrders(XinZhenYzActOrder parent, XinZhenYzActOrder children) {
if (!parent.getOrderTime().equals(children.getOrderTime())) {
return true;
}
if (!parent.getStartTime().equals(children.getStartTime())) {
return true;
}
if (parent.getEndTime() != null && !parent.getEndTime().equals(children.getEndTime())) {
return true;
}
if (!parent.getFrequCode().equals(children.getFrequCode())) {
return true;
}
return !parent.getGroupNo().equals(children.getGroupNo());
}
/**
* xc确认医嘱 , 这个是最新的正确的
*
* @param param 数据
* @return 返回提示
*/
public ResultVo