package thyyxxk.webserver.service.casefrontsheet;
import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import thyyxxk.webserver.config.exception.ExceptionEnum;
import thyyxxk.webserver.dao.his.casefrontsheet.HuiZhenShenQingDao;
import thyyxxk.webserver.entity.ResultVo;
import thyyxxk.webserver.entity.casefrontsheet.YshHzRecord;
import thyyxxk.webserver.entity.datamodify.GetDropdownBox;
import thyyxxk.webserver.service.PublicServer;
import thyyxxk.webserver.utils.ListUtil;
import thyyxxk.webserver.utils.ResultVoUtil;
import thyyxxk.webserver.utils.StringUtil;
import thyyxxk.webserver.utils.TokenUtil;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
/**
*
* 描述: 会诊申请
*
*
* @author xc
* @date 2021-05-07 11:01
*/
@Service
@Slf4j
public class HuiZhenShenQingService {
private final HuiZhenShenQingDao dao;
private final PublicServer publicServer;
public HuiZhenShenQingService(HuiZhenShenQingDao dao, PublicServer publicServer) {
this.dao = dao;
this.publicServer = publicServer;
}
/**
* @return 返回会诊级别
*/
public ResultVo> huiZhenLeiBie() {
return ResultVoUtil.success(dao.getYshZdHzLevel());
}
/**
* 远程搜索科室
*
* @param code 模糊查询
* @return 返回科室
*/
public ResultVo> queryDept(String code) {
return ResultVoUtil.success(dao.getZdUnitCode(StringUtil.isContainChinese(code)));
}
/**
* 会诊申请
*
* @param param 申请需要插入的数据
* @return 返回状态
*/
public ResultVo submitHuiZhenShenQing(YshHzRecord param) {
log.info("会诊申请====>申请人:{},数据:{}", TokenUtil.getTokenUserId(), JSON.toJSONString(param));
publicServer.huanZheJieSuan(param.getInpatientNo(), param.getAdmissTimes());
/*
* 获取一个新的医嘱号
* 需要一套指令 先把表锁住 在查询出医嘱号 在加一更新加一就完事了
*/
dao.lockTable();
float actOrderNo = dao.getActOrderNo() + 1;
dao.updateActOrderNo(actOrderNo);
//下面是给申请次数 加一
param.setReqTimes(dao.getMaxReqTimes(param.getInpatientNo(), param.getAdmissTimes()) + 1);
param.setInputDate(new Date());
param.setActOrderNo((int) actOrderNo);
param.setInputId(TokenUtil.getTokenUserId());
param.setReqDate(param.getInputDate());
param.setOrderCode(getOrderCode("00" + param.getHzType()));
param.setOrderName(String.format("请%s进行院内会诊", param.getReqDeptName()));
//插入会诊申请
dao.chaRuHuiZhenShenQing(param);
//申请成功了就还需要插入一条医嘱
dao.chaRuYiZhu(param);
log.info("插入数据:{}", JSON.toJSONString(param));
return ResultVoUtil.success(ExceptionEnum.SUCCESS_AND_NOTIFICATION, "会诊申请成功,正在通知会诊医生。 (〜^㉨^)〜
");
}
/**
* 查询会诊的信息
*
* @param inpatientNo 住院号
* @param admissTimes 住院次数
* @return 返回
*/
public ResultVo> chaKanHuiZhenShenQing(String inpatientNo, int admissTimes) {
return ResultVoUtil.success(dao.chaKanHuiZhenShenQing(inpatientNo, admissTimes, null));
}
/**
* 删除会诊申请 要同时删除 会诊申请 和 一条医嘱
*
* @param inpatientNo 住院号
* @param admissTimes 住院次数
* @param actOrderNo 医嘱号
* @param reqTimes 申请次数
* @return 返回
*/
public ResultVo shanChuHuiZhenShenQing(String inpatientNo, int admissTimes, BigDecimal actOrderNo, int reqTimes) {
List huiZhenXinXi = dao.chaKanHuiZhenShenQing(inpatientNo, admissTimes, actOrderNo);
if (ListUtil.isBlank(huiZhenXinXi)) {
return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, "没有查询到对应信息可能已经被删除了。");
}
if (StringUtil.notBlank(huiZhenXinXi.get(0).getStatusFlag()) && huiZhenXinXi.get(0).getStatusFlag().trim().equals("2")) {
return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, "该会诊已经完成了无法删除。");
}
//会诊申请是根据 住院号,住院次数,申请次数 来获取到 一条
dao.shanChuShenQing(inpatientNo, admissTimes, reqTimes);
//医嘱 只要根据医嘱号来删除
dao.shanChuYiZhu(actOrderNo);
log.info("删除会诊申请==》操作人:{},住院号:{},住院次数:{},医嘱号:{},申请次数:{}", TokenUtil.getTokenUserId(), inpatientNo, admissTimes, actOrderNo, reqTimes);
return ResultVoUtil.success(ExceptionEnum.SUCCESS_AND_NOTIFICATION, "删除成功");
}
/**
* 查询会诊的医生
*
* @param deptCode 科室的code
* @param hzType 会诊的级别
* @return 返回 医生的code 和 name
*/
public ResultVo> huiZhenYiSheng(String deptCode, String hzType) {
return ResultVoUtil.success(dao.huiZhenYiSheng(deptCode, "00" + hzType));
}
/**
* 获取患者的主诊断
*
* @param patNo 住院号
* @param times 住院次数
* @param flag 1-本院诊断 2-医保诊断
* @return 对应数据
*/
public ResultVo> huoQuHuanZheZhuYaoZhenDuan(String patNo, Integer times, Integer flag) {
return ResultVoUtil.success(dao.huoQuHuanZheZhuYaoZhenDuan(patNo, times, flag == 1 ? "ba_first_page1" : "zy_dis_diag_yb"));
}
/**
* 用来获取 order_code 这个是写死的
*
* @param hzType 会诊的级别
* @return 返回 order_code
*/
public String getOrderCode(String hzType) {
switch (hzType) {
case "001":
return "01425";
case "002":
return "01426";
case "003":
return "01427";
default:
return "500";
}
}
}