package thyyxxk.webserver.service.zhuyuanyisheng;
import cn.hutool.core.util.StrUtil;
import cn.hutool.crypto.SecureUtil;
import cn.hutool.db.DbUtil;
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.RequiredArgsConstructor;
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.envionment.YzConfig;
import thyyxxk.webserver.config.exception.BizException;
import thyyxxk.webserver.config.exception.ExceptionEnum;
import thyyxxk.webserver.dao.his.zhuyuanyisheng.YiZhuLuRuDao;
import thyyxxk.webserver.entity.ResultVo;
import thyyxxk.webserver.entity.RoleCode;
import thyyxxk.webserver.entity.casefrontsheet.request.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.medicalinsurance.inpatient.SiLimitRequest;
import thyyxxk.webserver.entity.medicine.YpZdGroupName;
import thyyxxk.webserver.entity.medicine.vo.YpZdGroupNameVo;
import thyyxxk.webserver.entity.zhuyuanyisheng.OneClickOrder;
import thyyxxk.webserver.entity.zhuyuanyisheng.ZyOrderZk;
import thyyxxk.webserver.entity.zhuyuanyisheng.dto.doctorAuth.DoctorAuthParams;
import thyyxxk.webserver.entity.zhuyuanyisheng.vo.doctorAuth.DoctorAuthRest;
import thyyxxk.webserver.entity.zhuyuanyisheng.yizhuluru.*;
import thyyxxk.webserver.http.drg.DrgWebApi;
import thyyxxk.webserver.service.PublicServer;
import thyyxxk.webserver.service.hutoolcache.DrugCache;
import thyyxxk.webserver.service.hutoolcache.ExtraCache;
import thyyxxk.webserver.service.hutoolcache.UserCache;
import thyyxxk.webserver.service.inpatient.casefrontsheet.CaseFrontSheetMainService;
import thyyxxk.webserver.service.medicalinsurance.SiChargeLimitService;
import thyyxxk.webserver.service.zhuyuanyisheng.yizhuverify.Repel;
import thyyxxk.webserver.service.zhuyuanyisheng.yizhuverify.YiZhuCheckData;
import thyyxxk.webserver.utils.*;
import java.math.BigDecimal;
import java.time.Duration;
import java.time.Instant;
import java.util.*;
import java.util.stream.Collectors;
/**
*
* 描述: 医嘱录入
*
*
* @author xc
* @date 2022-01-04 16:59
*/
@Service
@Slf4j
@RequiredArgsConstructor
public class YiZhuLuRuServer {
private final YiZhuLuRuDao dao;
private final PublicServer publicServer;
private final CaseFrontSheetMainService caseFrontSheetMainService;
private final SqlSessionFactory sqlSessionFactory;
private final SiChargeLimitService siChargeLimitService;
private final UserCache userCache;
private final ExtraCache extraCache;
private final YzConfig yzConfig;
private final DrgWebApi drgWebApi;
private final String ITEM = "00";
private final DrugCache drugCache;
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) {
List xinZhenYzActOrders = dao.selectOrderNo(param.buildQw());
return ResultVoUtil.success(xinZhenYzActOrders);
}
/**
* 设置医嘱号的数状图
*
* @param yiZhuList 医嘱数据
* @return s
*/
@NotNull
public static List getOrderList(List yiZhuList) {
if (ListUtil.isBlank(yiZhuList)) {
return new ArrayList<>();
}
// 还有那些没有被匹配的子级医嘱
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) {
continue;
}
if (actOrder.getParentNo() != null) {
item.setParentNo(null);
item.setOrderName("注意此医嘱成组有误,请重新选择父医嘱,父医嘱不能是其他医嘱的子医嘱。");
item.setStatusFlag("6");
continue;
}
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 返回项目信息
*/
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, userCache.getUserInfoByToken().getDeptCode()));
EntityStringTrim.beanAttributeValueTrimList(list);
return ResultVoUtil.success(list);
}
/**
* 把有错误的子医嘱纠正回来,子医嘱要跟随父医嘱的频率 等
*
* @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