YiZhuLuRuServer.java 64 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530
  1. package thyyxxk.webserver.service.zhuyuanyisheng;
  2. import cn.hutool.core.util.StrUtil;
  3. import cn.hutool.crypto.SecureUtil;
  4. import cn.hutool.db.DbUtil;
  5. import com.alibaba.fastjson.JSONObject;
  6. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  7. import com.baomidou.mybatisplus.core.metadata.IPage;
  8. import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
  9. import lombok.RequiredArgsConstructor;
  10. import lombok.extern.slf4j.Slf4j;
  11. import org.apache.ibatis.session.ExecutorType;
  12. import org.apache.ibatis.session.SqlSession;
  13. import org.apache.ibatis.session.SqlSessionFactory;
  14. import org.jetbrains.annotations.NotNull;
  15. import org.springframework.stereotype.Service;
  16. import thyyxxk.webserver.config.envionment.YzConfig;
  17. import thyyxxk.webserver.config.exception.BizException;
  18. import thyyxxk.webserver.config.exception.ExceptionEnum;
  19. import thyyxxk.webserver.dao.his.zhuyuanyisheng.YiZhuLuRuDao;
  20. import thyyxxk.webserver.entity.ResultVo;
  21. import thyyxxk.webserver.entity.RoleCode;
  22. import thyyxxk.webserver.entity.casefrontsheet.request.SheetOverview;
  23. import thyyxxk.webserver.entity.datamodify.GetDropdownBox;
  24. import thyyxxk.webserver.entity.datamodify.SelectV2;
  25. import thyyxxk.webserver.entity.datamodify.YzActOrder;
  26. import thyyxxk.webserver.entity.datamodify.ZyDetailCharge;
  27. import thyyxxk.webserver.entity.dictionary.CodeName;
  28. import thyyxxk.webserver.entity.inpatient.patient.Overview;
  29. import thyyxxk.webserver.entity.inpatient.patient.Patient;
  30. import thyyxxk.webserver.entity.login.UserInfo;
  31. import thyyxxk.webserver.entity.medicalinsurance.inpatient.SiLimitRequest;
  32. import thyyxxk.webserver.entity.medicine.YpZdGroupName;
  33. import thyyxxk.webserver.entity.medicine.vo.YpZdGroupNameVo;
  34. import thyyxxk.webserver.entity.zhuyuanyisheng.OneClickOrder;
  35. import thyyxxk.webserver.entity.zhuyuanyisheng.ZyOrderZk;
  36. import thyyxxk.webserver.entity.zhuyuanyisheng.dto.doctorAuth.DoctorAuthParams;
  37. import thyyxxk.webserver.entity.zhuyuanyisheng.vo.doctorAuth.DoctorAuthRest;
  38. import thyyxxk.webserver.entity.zhuyuanyisheng.yizhuluru.*;
  39. import thyyxxk.webserver.http.drg.DrgWebApi;
  40. import thyyxxk.webserver.service.PublicServer;
  41. import thyyxxk.webserver.service.hutoolcache.DrugCache;
  42. import thyyxxk.webserver.service.hutoolcache.ExtraCache;
  43. import thyyxxk.webserver.service.hutoolcache.UserCache;
  44. import thyyxxk.webserver.service.inpatient.casefrontsheet.CaseFrontSheetMainService;
  45. import thyyxxk.webserver.service.medicalinsurance.SiChargeLimitService;
  46. import thyyxxk.webserver.service.zhuyuanyisheng.yizhuverify.Repel;
  47. import thyyxxk.webserver.service.zhuyuanyisheng.yizhuverify.YiZhuCheckData;
  48. import thyyxxk.webserver.utils.*;
  49. import java.math.BigDecimal;
  50. import java.time.Duration;
  51. import java.time.Instant;
  52. import java.util.*;
  53. import java.util.stream.Collectors;
  54. /**
  55. * <p>
  56. * 描述: 医嘱录入
  57. * </p>
  58. *
  59. * @author xc
  60. * @date 2022-01-04 16:59
  61. */
  62. @Service
  63. @Slf4j
  64. @RequiredArgsConstructor
  65. public class YiZhuLuRuServer {
  66. private final YiZhuLuRuDao dao;
  67. private final PublicServer publicServer;
  68. private final CaseFrontSheetMainService caseFrontSheetMainService;
  69. private final SqlSessionFactory sqlSessionFactory;
  70. private final SiChargeLimitService siChargeLimitService;
  71. private final UserCache userCache;
  72. private final ExtraCache extraCache;
  73. private final YzConfig yzConfig;
  74. private final DrgWebApi drgWebApi;
  75. private final String ITEM = "00";
  76. private final DrugCache drugCache;
  77. public ResultVo<String> getOrderNo() {
  78. return ResultVoUtil.success(publicServer.getActOrderNo().stripTrailingZeros().toPlainString());
  79. }
  80. public ResultVo<List<Patient>> getMyPatient() {
  81. return ResultVoUtil.success(dao.getMyPatient(TokenUtil.getInstance().getTokenUserId()));
  82. }
  83. /**
  84. * 获取患者的医嘱
  85. *
  86. * @param param 查询条件 住院号,住院时间
  87. * @return 返回医嘱数据
  88. */
  89. public ResultVo<List<XinZhenYzActOrder>> huoQuYiZhuShuJu(YiZhuFeiYongChaXunTiaoJian param) {
  90. List<XinZhenYzActOrder> xinZhenYzActOrders = dao.selectOrderNo(param.buildQw());
  91. return ResultVoUtil.success(xinZhenYzActOrders);
  92. }
  93. /**
  94. * 设置医嘱号的数状图
  95. *
  96. * @param yiZhuList 医嘱数据
  97. * @return s
  98. */
  99. @NotNull
  100. public static List<XinZhenYzActOrder> getOrderList(List<XinZhenYzActOrder> yiZhuList) {
  101. if (ListUtil.isBlank(yiZhuList)) {
  102. return new ArrayList<>();
  103. }
  104. // 还有那些没有被匹配的子级医嘱
  105. Map<BigDecimal, XinZhenYzActOrder> wuFuJiYiZhu = yiZhuList.stream().collect(Collectors.toMap(XinZhenYzActOrder::getActOrderNo, a -> a, (k1, k2) -> k1));
  106. // 做成树状图
  107. Map<BigDecimal, XinZhenYzActOrder> map = new HashMap<>(yiZhuList.size());
  108. List<XinZhenYzActOrder> tree = new ArrayList<>();
  109. for (XinZhenYzActOrder item : yiZhuList) {
  110. if (item.getParentNo() == null) {
  111. tree.add(item);
  112. wuFuJiYiZhu.remove(item.getActOrderNo());
  113. }
  114. map.put(item.getActOrderNo(), item);
  115. EntityStringTrim.beanAttributeValueTrim(item);
  116. if ("00".equals(item.getSerial())) {
  117. item.setGroupNoName("项目");
  118. item.setSerialName("项目");
  119. } else {
  120. if ("01".equals(item.getSerial())) {
  121. item.setSerialName("小包装");
  122. } else if ("99".equals(item.getSerial())) {
  123. item.setSerialName("大包装");
  124. }
  125. }
  126. }
  127. for (XinZhenYzActOrder item : yiZhuList) {
  128. XinZhenYzActOrder actOrder = map.get(item.getParentNo());
  129. if (actOrder == null) {
  130. continue;
  131. }
  132. if (actOrder.getParentNo() != null) {
  133. item.setParentNo(null);
  134. item.setOrderName("注意此医嘱成组有误,请重新选择父医嘱,父医嘱不能是其他医嘱的子医嘱。");
  135. item.setStatusFlag("6");
  136. continue;
  137. }
  138. wuFuJiYiZhu.remove(item.getActOrderNo());
  139. if (actOrder.getChildren() == null) {
  140. actOrder.setChildren(new ArrayList<>());
  141. actOrder.setOrderGroup("┌");
  142. }
  143. item.setOrderGroup("└");
  144. actOrder.getChildren().add(item);
  145. }
  146. if (!wuFuJiYiZhu.isEmpty()) {
  147. tree.addAll(wuFuJiYiZhu.values());
  148. }
  149. List<XinZhenYzActOrder> list = new ArrayList<>();
  150. for (XinZhenYzActOrder zy : tree) {
  151. list.add(zy);
  152. if (ListUtil.notBlank(zy.getChildren())) {
  153. zy.getChildren().get(zy.getChildren().size() - 1).setOrderGroup("└");
  154. list.addAll(zy.getChildren());
  155. zy.setChildren(null);
  156. }
  157. }
  158. return list;
  159. }
  160. /**
  161. * 获取搜索的项目信息,如药品和项目
  162. *
  163. * @param code 拼音首字母,中文,编码来进行搜索
  164. * @return 返回项目信息
  165. */
  166. public ResultVo<List<YiZhuMingChen>> huoQuXiangMu(String code, String groupNo) {
  167. code = StringUtil.isContainChinese(code);
  168. // 药品
  169. List<YiZhuMingChen> list = dao.yiZhuYaoPing(code, groupNo);
  170. // 项目
  171. list.addAll(dao.yiZhuXiangMu(code));
  172. // 模板
  173. list.addAll(dao.composeOrders(code, userCache.getUserInfoByToken().getDeptCode()));
  174. EntityStringTrim.beanAttributeValueTrimList(list);
  175. return ResultVoUtil.success(list);
  176. }
  177. /**
  178. * 把有错误的子医嘱纠正回来,子医嘱要跟随父医嘱的频率 等
  179. *
  180. * @param list 患者的数据
  181. */
  182. public void correctSubOrders(List<XinZhenYzActOrder> list) {
  183. // 父医嘱
  184. Map<BigDecimal, XinZhenYzActOrder> parentOrder = new HashMap<>(list.size());
  185. list.forEach(item -> parentOrder.put(item.getActOrderNo(), item));
  186. list.forEach(item -> {
  187. if (item.getParentNo() != null && parentOrder.containsKey(item.getParentNo())) {
  188. XinZhenYzActOrder order = parentOrder.get(item.getParentNo());
  189. // 判断是否需要更新
  190. if (updateSubOrders(order, item)) {
  191. dao.updateSubOrderStatus(item.getActOrderNo(), order);
  192. }
  193. }
  194. });
  195. }
  196. private boolean updateSubOrders(XinZhenYzActOrder parent, XinZhenYzActOrder children) {
  197. if (!parent.getOrderTime().equals(children.getOrderTime())) {
  198. return true;
  199. }
  200. if (!parent.getStartTime().equals(children.getStartTime())) {
  201. return true;
  202. }
  203. if (parent.getEndTime() != null && !parent.getEndTime().equals(children.getEndTime())) {
  204. return true;
  205. }
  206. if (!parent.getFrequCode().equals(children.getFrequCode())) {
  207. return true;
  208. }
  209. return !parent.getGroupNo().equals(children.getGroupNo());
  210. }
  211. /**
  212. * xc确认医嘱 , 这个是最新的正确的
  213. *
  214. * @param param 数据
  215. * @return 返回提示
  216. */
  217. public ResultVo<Map<String, Object>> confirmOrders(XinZhenYiZhu param) {
  218. // 判断是否开了出院医嘱后的医嘱
  219. if (!yzConfig.getPrescribeMedicalAdviceAfterDischarge()) {
  220. YzActOrder ourOrderInfo = dao.selectFinallyOutOrderInfo(param.getInpatientNo(), param.getAdmissTimes());
  221. if (ourOrderInfo != null) {
  222. if (dao.prescribeMedicalAdviceAfterDischarge(param.getInpatientNo(), param.getAdmissTimes(), ourOrderInfo.getStartTime(), ourOrderInfo.getActOrderNo()) > 0) {
  223. return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, "有医嘱开在了出院医嘱后无法确认。");
  224. }
  225. }
  226. }
  227. QueryWrapper<?> qw = getConfirmQueryWrapper(param.getInpatientNo(), param.getAdmissTimes());
  228. param.setList(dao.selectOrderNo(qw));
  229. List<XinZhenYzActOrder> yiZhuList = param.getList();
  230. if (ListUtil.isBlank(yiZhuList)) {
  231. return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, "没有需要确认的医嘱.");
  232. }
  233. // 把错误的子医嘱更正回来
  234. correctSubOrders(param.getList());
  235. String userCode = TokenUtil.getInstance().getTokenUserId();
  236. XinZhenYiZhu patInfo = dao.queryPatientInfo(param.getInpatientNo(), param.getAdmissTimes());
  237. List<XinZhenYzActOrder> confirmYzList = new ArrayList<>();
  238. YiZhuCheckData checkData = new YiZhuCheckData(dao).checkForRestrictedMedication();
  239. checkData.init(yiZhuList, patInfo).judgeExclusion();
  240. Map<String, Object> checkMap = checkData.startCheck(confirmYzList::add);
  241. if (checkData.multipleExclusions()) {
  242. return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, "一次性不能确认多条全排斥医嘱。");
  243. }
  244. if (checkData.getFailed()) {
  245. return ResultVoUtil.fail(ExceptionEnum.ERROR_MESSAGE, "请修改错误的医嘱", checkMap);
  246. }
  247. Repel repel = checkData.getRepel();
  248. if (repel != null && repel.getCount() > 0) {
  249. // 把全排斥医嘱变成临时防止给药方式错误,并且停止其他医嘱
  250. dao.stopOrder(param.getInpatientNo(), param.getAdmissTimes(), repel.getDate(), userCode, repel.getOrderNo());
  251. }
  252. SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH);
  253. YiZhuLuRuDao mapper = sqlSession.getMapper(YiZhuLuRuDao.class);
  254. Date now = new Date();
  255. try {
  256. ListUtil.partitionAndFunc(confirmYzList, 50, (list) -> {
  257. for (XinZhenYzActOrder item : list) {
  258. if (StringUtil.notBlank(item.getSuperiorDoctor())) {
  259. mapper.confirmOrdersSuperiorDoctor(item.getActOrderNo(), item.getSuperiorDoctor(), now);
  260. } else {
  261. mapper.confirmOrders(item.getActOrderNo(), userCode, now);
  262. }
  263. }
  264. sqlSession.commit();
  265. });
  266. } finally {
  267. sqlSession.close();
  268. }
  269. drgOrderUpdate(patInfo.getInpatientNo() + "_" + patInfo.getAdmissTimes() + "_" + patInfo.getLedgerSn());
  270. sendAMessageToTheNurse(param, userCode, patInfo, "新增医嘱");
  271. return ResultVoUtil.success(ExceptionEnum.SUCCESS_AND_EL_MESSAGE);
  272. }
  273. /**
  274. * 出院医嘱质控校验
  275. * 暂时废弃
  276. *
  277. * @param param 患者信息
  278. */
  279. @Deprecated
  280. private void dischargeQCVerification(XinZhenYiZhu param) {
  281. if (param.getInpatientNo().contains("$")) {
  282. return;
  283. }
  284. if (dao.selectDischargeOrde(param, TokenUtil.getInstance().getTokenUserId()) > 0) {
  285. SheetOverview overview = new SheetOverview();
  286. overview.setBah(param.getInpatientNo());
  287. overview.setTimes(param.getAdmissTimes());
  288. overview.setInOutFlag(1);
  289. ResultVo<Map<String, List<CodeName>>> result = caseFrontSheetMainService.sheetVerification(overview);
  290. if (!result.getCode().equals(ExceptionEnum.SUCCESS.getCode())) {
  291. throw new BizException(ExceptionEnum.LOGICAL_ERROR, result.getMessage());
  292. }
  293. if (!result.getData().get("force").isEmpty()) {
  294. throw new BizException(ExceptionEnum.LOGICAL_ERROR, "未通过病案首页质控,无法确认出院医嘱。");
  295. }
  296. }
  297. }
  298. /**
  299. * 在开医嘱时 drg 需要调用一下这个接口,接口已经做了异步的请求
  300. *
  301. * @param patientNo 患者id
  302. */
  303. public void drgOrderUpdate(String patientNo) {
  304. try {
  305. JSONObject jsonDrg = new JSONObject();
  306. jsonDrg.put("visit_id", Collections.singletonList(patientNo));
  307. jsonDrg.put("scene_type", 1);
  308. drgWebApi.etlClient(jsonDrg);
  309. } catch (Exception ignored) {
  310. }
  311. }
  312. private void sendAMessageToTheNurse(XinZhenYiZhu param, String inputCode, XinZhenYiZhu patInfo, String name) {
  313. List<String> content = new ArrayList<>();
  314. for (XinZhenYzActOrder item : param.getList()) {
  315. String sb = notificationStyle("医嘱名", "409eff", item.getOrderName()) +
  316. notificationStyle("医嘱时间", "409eff", DateUtil.formatDatetime(item.getStartTime())) +
  317. notificationStyle("床位", "409eff", patInfo.getBedNo()) +
  318. notificationStyle("患者姓名", "409eff", patInfo.getName()) +
  319. notificationStyle("频次", "409eff", item.getFrequCode());
  320. content.add(sb);
  321. }
  322. publicServer.faSongXiaoXi(patInfo, content, name, inputCode);
  323. }
  324. private String notificationStyle(String name, String color, String content) {
  325. return String.format("%s:<span style='color: #%s'>%s</span><br>", name, color, content);
  326. }
  327. /**
  328. * 录入 单条医嘱 新的 下面的保存医嘱的都无效了
  329. *
  330. * @param param 参数
  331. * @return 错误信息和提示
  332. */
  333. public ResultVo<Map<String, Object>> enterOrders(XinZhenYiZhu param) {
  334. XinZhenYzActOrder oldOrderNo = dao.getActOrderNoOne(param.getActOrderNo());
  335. String userCode = TokenUtil.getInstance().getTokenUserId();
  336. if (oldOrderNo != null) {
  337. if (!"1".equals(oldOrderNo.getStatusFlag().trim())) {
  338. return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, "该医嘱不是录入状态无法保存.");
  339. }
  340. if (!oldOrderNo.getInpatientNo().trim().equals(param.getInpatientNo())) {
  341. return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, "两次医嘱录入时患者不一致。");
  342. }
  343. if (!oldOrderNo.getEnterOper().equals(userCode)) {
  344. return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, "医嘱录入人不是您,无法修改。");
  345. }
  346. }
  347. XinZhenYiZhu huanZheXinXi = dao.queryPatientInfo(param.getInpatientNo(), param.getAdmissTimes());
  348. XinZhenYzActOrder data = param.getData();
  349. if (ITEM.equals(data.getSerial().trim())) {
  350. data.setGroupNo("00");
  351. }
  352. YiZhuCheckData checkData = new YiZhuCheckData(dao);
  353. Map<String, Object> errorMessageMap = checkData.init(data, huanZheXinXi)
  354. .startCheck(null);
  355. if (checkData.getFailed()) {
  356. return ResultVoUtil.fail(ExceptionEnum.ERROR_MESSAGE, "请修改有错误的医嘱。", errorMessageMap);
  357. }
  358. // 如果是 子医嘱 的话就拿到父医嘱的频率
  359. if (data.getParentNo() != null) {
  360. String frequCode = dao.selectParentNo(data.getParentNo().stripTrailingZeros().toPlainString());
  361. if (StringUtil.notBlank(frequCode)) {
  362. data.setFrequCode(frequCode);
  363. }
  364. }
  365. if (checkData.getPassTheAudit()) {
  366. List<String> ZK_CODE_LIST = new ArrayList<>();
  367. List<YzZdOrderItemConfirm> value = extraCache.getYzZdOrderItemConfirm();
  368. if (value != null) {
  369. for (YzZdOrderItemConfirm yzCode : value) {
  370. if (yzCode.getItemName().equals("转科")) {
  371. ZK_CODE_LIST.add(yzCode.getOrderCode());
  372. }
  373. }
  374. }
  375. if (ZK_CODE_LIST.contains(data.getOrderCode())) {
  376. ZyOrderZk transferData = new ZyOrderZk();
  377. transferData
  378. .setActOrderNo(param.getActOrderNo())
  379. .setNewDept(data.getZkDeptCode())
  380. .setNewWard(data.getZkWardCode())
  381. .setOldWard(huanZheXinXi.getDeptCode())
  382. .setOldDept(huanZheXinXi.getZkWard());
  383. // 先删除转科在插入
  384. dao.deleteTransferOrder(param.getActOrderNo());
  385. dao.insertDoctorSOrder(transferData);
  386. }
  387. // 判断是不是抗菌药物
  388. XinZhenYzActOrder kssItem = checkData.getDrugData(data.getOrderCode().trim() + data.getSerial().trim() + data.getGroupNo().trim());
  389. if (kssItem != null && kssItem.getKjywFlag() != null && kssItem.getKjywFlag() == 1) {
  390. YzActRecordKss kss = new YzActRecordKss();
  391. kss.setActOrderNo(data.getActOrderNo());
  392. kss.setChargeCode(data.getOrderCode());
  393. kss.setYyfs(data.getYyfs());
  394. kss.setSsqk(data.getSsqk());
  395. kss.setYysj(data.getYysj());
  396. // 删除抗菌药物信息
  397. dao.deleteAntimicrobialInformation(param.getActOrderNo());
  398. dao.insertAntimicrobialInformation(param.getActOrderNo(),
  399. kss, userCode, param.getInpatientNo(), param.getAdmissTimes());
  400. }
  401. }
  402. dao.deleteOrderNo(param.getActOrderNo());
  403. dao.insertEntryOrder(huanZheXinXi, param.getData(), userCode);
  404. // 更新授权医生
  405. if (StringUtil.notBlank(param.getData().getSuperiorDoctor())) {
  406. dao.updateAuthorizedDoctor(param.getData().getActOrderNo(), param.getData().getSuperiorDoctor());
  407. }
  408. // 项目不触发
  409. if (param.getData().getParentNo() == null && !param.getData().getSerial().equals("00")) {
  410. String selectSupplyCode = dao.selectSupplyCode(param.getData().getSupplyCode().trim());
  411. if (StringUtil.isBlank(selectSupplyCode)) {
  412. selectSupplyCode = "044";
  413. }
  414. // 子医嘱跟随父医嘱
  415. dao.howOftenTheSubPhysicianOrderIsModified(param.getData(), selectSupplyCode);
  416. }
  417. QueryWrapper<?> qw = getQueryWrapper(param, data);
  418. Map<String, Object> successMap = new HashMap<>();
  419. successMap.put("code", 200);
  420. successMap.put("data", getOrderList(dao.selectOrderNo(qw)));
  421. return ResultVoUtil.success(ExceptionEnum.SUCCESS_AND_EL_MESSAGE, "添加成功。", successMap);
  422. }
  423. @NotNull
  424. private static QueryWrapper<?> getQueryWrapper(XinZhenYiZhu param, XinZhenYzActOrder data) {
  425. QueryWrapper<?> qw = new QueryWrapper<>();
  426. qw.eq("a.inpatient_no", param.getInpatientNo());
  427. qw.eq("a.admiss_times", param.getAdmissTimes());
  428. qw.eq("a.status_flag", "1");
  429. // 不是子节点,就需要查询 子节点
  430. if (data.getParentNo() == null) {
  431. qw.and(wrapper -> wrapper.eq("a.act_order_no", param.getActOrderNo())
  432. .or()
  433. .eq("a.parent_no", param.getActOrderNo())
  434. );
  435. } else {
  436. // 如果是子节点就返回自己
  437. qw.eq("a.act_order_no", data.getActOrderNo());
  438. }
  439. qw.orderByAsc("a.act_order_no");
  440. return qw;
  441. }
  442. /**
  443. * 把医嘱模板中的数据插入到 患者的医嘱表中
  444. *
  445. * @param param 参数
  446. * @return 返回插入的医嘱
  447. */
  448. public ResultVo<JSONObject> insertTemplateOrder(XinZhenYiZhu param) {
  449. if (StringUtil.isBlank(param.getInpatientNo())) {
  450. return ResultVoUtil.fail(ExceptionEnum.ERROR_MESSAGE, "请先选择患者.");
  451. }
  452. XinZhenYiZhu patInfo = dao.queryPatientInfo(param.getInpatientNo(), param.getAdmissTimes());
  453. if (patInfo == null) {
  454. return ResultVoUtil.fail(ExceptionEnum.ERROR_MESSAGE, "请先选择患者.");
  455. }
  456. List<BigDecimal> returnOrderList = new ArrayList<>();
  457. List<XinZhenYzActOrder> list = param.getList();
  458. List<XinZhenYzActOrder> resList = new ArrayList<>();
  459. Map<BigDecimal, XinZhenYzActOrder> map = new HashMap<>(list.size());
  460. String userCode = TokenUtil.getInstance().getTokenUserId();
  461. for (XinZhenYzActOrder item : list) {
  462. if (item.getParentNo() == null) {
  463. resList.add(item);
  464. }
  465. map.put(item.getActOrderNo(), item);
  466. }
  467. list.forEach(item -> {
  468. if (item.getParentNo() != null) {
  469. XinZhenYzActOrder mapItem = map.get(item.getParentNo());
  470. if (mapItem != null) {
  471. if (mapItem.getChildren() == null) {
  472. mapItem.setChildren(new ArrayList<>());
  473. }
  474. mapItem.getChildren().add(item);
  475. }
  476. }
  477. });
  478. templateInsertToOrder(resList, patInfo, userCode, returnOrderList);
  479. JSONObject js = getNewOrderData(returnOrderList);
  480. return ResultVoUtil.success(ExceptionEnum.SUCCESS_AND_EL_MESSAGE, "插入模板数据成功。", js);
  481. }
  482. /**
  483. * 把模板数据插入到医嘱中
  484. *
  485. * @param resList 医嘱数据
  486. * @param patInfo 患者信息
  487. * @param userCode 用户编码
  488. * @param returnOrderList 返回的医嘱号
  489. */
  490. public void templateInsertToOrder(List<XinZhenYzActOrder> resList,
  491. XinZhenYiZhu patInfo,
  492. String userCode,
  493. List<BigDecimal> returnOrderList) {
  494. CacheOnce<XinZhenYzActOrder> drug = new CacheOnce<>();
  495. SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH);
  496. YiZhuLuRuDao mapper = sqlSession.getMapper(YiZhuLuRuDao.class);
  497. for (XinZhenYzActOrder item : resList) {
  498. setTempInfo(drug, item, patInfo);
  499. item.setActOrderNo(publicServer.getActOrderNo());
  500. returnOrderList.add(item.getActOrderNo());
  501. mapper.insertEntryOrder(patInfo, item, userCode);
  502. if (ListUtil.notBlank(item.getChildren())) {
  503. for (XinZhenYzActOrder children : item.getChildren()) {
  504. setTempInfo(drug, children, patInfo);
  505. children.setActOrderNo(publicServer.getActOrderNo());
  506. returnOrderList.add(children.getActOrderNo());
  507. children.setParentNo(item.getActOrderNo());
  508. mapper.insertEntryOrder(patInfo, children, userCode);
  509. }
  510. }
  511. }
  512. try {
  513. sqlSession.commit();
  514. } finally {
  515. DbUtil.close(sqlSession);
  516. }
  517. }
  518. private void setTempInfo(CacheOnce<XinZhenYzActOrder> drug, XinZhenYzActOrder data, XinZhenYiZhu patInfo) {
  519. XinZhenYzActOrder feiYongXinXi = drug.get(
  520. data.getOrderCode().trim() + data.getSerial().trim() + data.getGroupNo().trim(),
  521. (temp) -> dao.drugDataOne(temp, patInfo.getZkWard(), null)
  522. );
  523. YiZhuCheckData.calculateDrugAmount(data, feiYongXinXi);
  524. }
  525. /**
  526. * 删除单条医嘱
  527. *
  528. * @param orderNo 医嘱号
  529. * @return 提示
  530. */
  531. public ResultVo<String> toDeleteAnOrder(String orderNo) {
  532. XinZhenYzActOrder oldData = dao.getActOrderNoOne(orderNo);
  533. String message = judgeWhetherItCanBeDeleted(oldData);
  534. if (StringUtil.notBlank(message)) {
  535. return ResultVoUtil.fail(ExceptionEnum.ERROR_MESSAGE, message);
  536. }
  537. dao.toDeleteAnOrder(orderNo, oldData.getInpatientNo());
  538. dao.deleteGroup(orderNo);
  539. return ResultVoUtil.success(ExceptionEnum.SUCCESS_AND_EL_MESSAGE);
  540. }
  541. /**
  542. * 删除多条录入的医嘱
  543. *
  544. * @param param 参数
  545. * @return 返回提示
  546. */
  547. public ResultVo<Map<String, String>> deleteMultipleOrders(XinZhenYiZhu param) {
  548. QueryWrapper<?> qw = new QueryWrapper<>();
  549. List<BigDecimal> list = new ArrayList<>();
  550. param.getList().forEach(item -> {
  551. list.add(item.getActOrderNo());
  552. });
  553. qw.in("act_order_no", list);
  554. List<XinZhenYzActOrder> deleteOrderList = dao.getOrdersToDelete(qw);
  555. if (ListUtil.isBlank(deleteOrderList)) {
  556. return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, "没有找到原医嘱可能已经被删除了");
  557. }
  558. Map<String, String> map = new HashMap<>();
  559. deleteOrderList.forEach(item -> {
  560. String error = judgeWhetherItCanBeDeleted(item);
  561. if (StringUtil.notBlank(error)) {
  562. map.put(item.getActOrderNo().stripTrailingZeros().toPlainString(), error);
  563. }
  564. });
  565. if (map.isEmpty()) {
  566. dao.deleteParentChildRelationship(param.getInpatientNo(), param.getAdmissTimes(), list);
  567. dao.deleteMultipleOrders(qw);
  568. return ResultVoUtil.fail(ExceptionEnum.SUCCESS_AND_EL_MESSAGE);
  569. }
  570. return ResultVoUtil.fail(ExceptionEnum.ERROR_MESSAGE, "删除失败", map);
  571. }
  572. private String judgeWhetherItCanBeDeleted(XinZhenYzActOrder oldData) {
  573. StringBuilder str = new StringBuilder();
  574. if (oldData == null) {
  575. return "没有找到原医嘱可能已经被删除了";
  576. }
  577. if (!("1".equals(oldData.getStatusFlag()) || "2".equals(oldData.getStatusFlag()))) {
  578. str.append("该医嘱不是录入或确认状态,无法删除");
  579. }
  580. if (!oldData.getEnterOper().equals(TokenUtil.getInstance().getTokenUserId())) {
  581. str.append("该医嘱录入人不是您,无法删除.");
  582. }
  583. return str.toString();
  584. }
  585. public ResultVo<Map<BigDecimal, String>> stopOrder(XinZhenYiZhu param) {
  586. if (ListUtil.isBlank(param.getList())) {
  587. return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, "请先选择数据");
  588. }
  589. Map<BigDecimal, String> map = new HashMap<>();
  590. param.getList().forEach(item -> {
  591. BigDecimal id = item.getActOrderNo();
  592. if (item.getEndTime() == null) {
  593. map.put(id, "停止时间不能为空,或该医嘱已经停止了。");
  594. } else {
  595. if (DateUtil.shiJianDaXiao(item.getEndTime(), item.getStartTime(), "<")) {
  596. map.put(id, "停止时间不能小于医嘱的开始时间。");
  597. }
  598. }
  599. });
  600. if (map.isEmpty()) {
  601. String tokenUserId = TokenUtil.getInstance().getTokenUserId();
  602. dao.setStopTime(param.getList(), tokenUserId, param.getInpatientNo(), param.getAdmissTimes());
  603. XinZhenYiZhu patInfo = dao.queryPatientInfo(param.getInpatientNo(), param.getAdmissTimes());
  604. publicServer.faSongXiaoXi(patInfo, StrUtil.format("停止【{}】条", param.getList().size()), "停止医嘱", tokenUserId);
  605. return ResultVoUtil.success(ExceptionEnum.SUCCESS_AND_EL_MESSAGE);
  606. }
  607. return ResultVoUtil.fail(ExceptionEnum.NULL_POINTER, "请修改错误", map);
  608. }
  609. /**
  610. * 获取某一个费用的详细信息
  611. *
  612. * @param code 编码
  613. * @param serial 00-项目 01-小包装的药品 99-大包装
  614. * @param deptCode 科室编码
  615. * @param groupNo 药房编码
  616. * @param seniorDoctor 授权医生
  617. * @param flag 医嘱状态标志
  618. * @return 返回该费用的一些详细信息,以及一些提示信息。
  619. */
  620. public ResultVo<Map<String, Object>> huoQuFeiYongXinXi(String code, String serial,
  621. String deptCode,
  622. String groupNo,
  623. String seniorDoctor,
  624. String flag) {
  625. Map<String, Object> map = new HashMap<>();
  626. // 一些提示
  627. List<String> prompt = new ArrayList<>();
  628. boolean permissionPrompt = false;
  629. // 加载项目信息
  630. if (ITEM.equals(serial.trim())) {
  631. List<XinZhenYzActOrder> xiangMu = dao.huoQuXiangMu(code);
  632. for (XinZhenYzActOrder item : xiangMu) {
  633. if (item.getDelFlag() == 1) {
  634. return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, String.format("该医嘱下的【%s】,已经被停用了,请联系物价科。", item.getOrderName()));
  635. } else if (StringUtil.isBlank(item.getNationalCode())) {
  636. prompt.add(String.format("该医嘱下面的【%s】,没有医保编码,请注意。", item.getOrderName()));
  637. } else {
  638. prompt.add(String.format("该医嘱下【%s】,医保码为:【%s】。", item.getOrderName(), item.getNationalCode()));
  639. }
  640. }
  641. if (ListUtil.isBlank(xiangMu)) {
  642. if ("1".equals(flag)) {
  643. Integer paiChiYiZhu = dao.shiFouPaiChiYiZhu(code);
  644. if (paiChiYiZhu != null) {
  645. switch (paiChiYiZhu) {
  646. case 1:
  647. prompt.add("全排斥医嘱");
  648. break;
  649. case 2:
  650. prompt.add("单组排斥医嘱");
  651. break;
  652. case 3:
  653. prompt.add("多组斥医嘱");
  654. break;
  655. default:
  656. break;
  657. }
  658. }
  659. }
  660. }
  661. } else {
  662. String key = code.trim() + serial.trim();
  663. YaoPinXinXi yp = dao.huoQuYaoPin(key);
  664. // 新开的医嘱才需要判断这个
  665. if (flag.equals("1")) {
  666. if (yp == null) {
  667. return ResultVoUtil.fail(ExceptionEnum.NO_DATA_EXIST, "该医嘱下的药品,可能已经被停用了,请联系药剂科。");
  668. }
  669. yp.setDrugFlag(getDrugFlagByLargeCategories(yp.getCategoriesFlag()));
  670. YaoPinXinXi disable = dao.huoQuJinYongXinXi(key, groupNo);
  671. if (disable != null && disable.getVisibleFlagZy() == 1) {
  672. return ResultVoUtil.fail(ExceptionEnum.NO_DATA_EXIST, "该药品禁止住院使用。");
  673. }
  674. if (StringUtil.notBlank(deptCode)) {
  675. if (dao.restrictedUseInTheDepartment(code.trim(), deptCode) > 0) {
  676. return ResultVoUtil.fail(ExceptionEnum.NO_DATA_EXIST, "该药品禁止在患者所在的科室使用。");
  677. }
  678. }
  679. Integer yiShenDengJi = dao.huoQuYiShenDengJi(TokenUtil.getInstance().getTokenUserId());
  680. int yiShen = yiShenDengJi == null ? 0 : yiShenDengJi;
  681. int superior = 0;
  682. if (StringUtil.notBlank(seniorDoctor) && !"null".equals(seniorDoctor)) {
  683. Integer superiorRank = dao.huoQuYiShenDengJi(seniorDoctor);
  684. superior = superiorRank == null ? 0 : superiorRank;
  685. }
  686. if (yp.getYpLevel() > yiShen && yp.getYpLevel() > superior) {
  687. permissionPrompt = true;
  688. }
  689. if (yp.getKjywFlag() == 1) {
  690. prompt.add("抗菌药物,需填写抗菌药物医嘱附注");
  691. }
  692. if (yp.getSelfFlagYb() == 1) {
  693. prompt.add("该药品医保自费药品,如符合条件请填写记账,不是请填写自费");
  694. }
  695. if (StringUtil.isBlank(yp.getNationalCode())) {
  696. prompt.add("该药品医保没有匹配医保码");
  697. } else {
  698. prompt.add(String.format("药品医保码为:【%s】", yp.getNationalCode()));
  699. }
  700. if (disable != null && disable.getStockAmount() != null && BigUtils.bigXiaoYu(disable.getStockAmount(), 10)) {
  701. prompt.add(String.format("该药品剩余数量为:【%s】", disable.getStockAmount().stripTrailingZeros().toPlainString()));
  702. }
  703. if (yp.getPsFlag() == 1) {
  704. prompt.add("此药品为皮试药品");
  705. }
  706. flagEquals1AddPrompt(prompt, yp.getJbFlag(), "该药品为【国家基本药物】");
  707. flagEquals1AddPrompt(prompt, yp.getHighWarningFlag(), "该药品为【高警示药品】");
  708. flagEquals1AddPrompt(prompt, yp.getWinningBidderFlag(), "该药品为【国家组织药品集中采购中标药品】");
  709. flagEquals1AddPrompt(prompt, yp.getFocusMonitorFlag(), "该药品为【重点监控药品】");
  710. }
  711. List<YaoPingJiLiang> yaoPingJiLiang = new ArrayList<>();
  712. if (StringUtil.notBlank(yp.getWeighUnit())) {
  713. yaoPingJiLiang.add(new YaoPingJiLiang(yp.getWeighUnit(), yp.getWeighUnitName(), yp.getWeight()));
  714. }
  715. if (StringUtil.notBlank(yp.getVolUnit())) {
  716. yaoPingJiLiang.add(new YaoPingJiLiang(yp.getVolUnit(), yp.getVolUnitName(), yp.getVolum()));
  717. }
  718. if (StringUtil.notBlank(yp.getPackUnit())) {
  719. yaoPingJiLiang.add(new YaoPingJiLiang(yp.getPackUnit(), yp.getPackUnitName(), yp.getPackSize()));
  720. }
  721. map.put("yaoPingJiLiang", yaoPingJiLiang);
  722. map.put("data", yp);
  723. }
  724. map.put("prompt", prompt);
  725. map.put("permissionPrompt", permissionPrompt);
  726. return ResultVoUtil.success(map);
  727. }
  728. public DrugCache.YpInfo getYaoPingJiLiang(String code, String serial) {
  729. String key = code.trim() + serial.trim();
  730. return drugCache.get(key);
  731. }
  732. private void flagEquals1AddPrompt(List<String> prompt, String flag, String message) {
  733. if ("1".equals(flag)) {
  734. prompt.add(message);
  735. }
  736. }
  737. private String getDrugFlagByLargeCategories(String val) {
  738. if (StringUtil.isBlank(val)) {
  739. return "z";
  740. }
  741. switch (val) {
  742. case "0":
  743. return "d";
  744. case "1":
  745. return "i";
  746. default:
  747. return "z";
  748. }
  749. }
  750. /**
  751. * 获取医嘱频率
  752. *
  753. * @return 返回频率
  754. */
  755. public ResultVo<List<GetDropdownBox>> getFrequency() {
  756. return ResultVoUtil.success(dao.selectFrequency());
  757. }
  758. /**
  759. * @return 给药方式
  760. */
  761. public ResultVo<List<SelectV2>> getSupplyType() {
  762. return ResultVoUtil.success(dao.selectSupplyType());
  763. }
  764. /**
  765. * 获取执行科室
  766. *
  767. * @param code 五笔,拼音,中文,编码
  768. * @return 返回对应的数据
  769. */
  770. public ResultVo<List<GetDropdownBox>> huoQuZhiXinKeShi(String code) {
  771. return ResultVoUtil.success(dao.huoQuZhiXinKeShi(StringUtil.isContainChinese(code)));
  772. }
  773. /**
  774. * 这里是校验模板的数据
  775. *
  776. * @param param 模板数据
  777. * @return 返回提示信息
  778. */
  779. public ResultVo<Map<String, Object>> singleDataCheck(XinZhenYiZhu param) {
  780. param.getList().get(0).setActOrderNo(new BigDecimal(param.getList().get(0).getId()));
  781. YiZhuCheckData checkData = new YiZhuCheckData(dao);
  782. checkData.init(param.getList(), null);
  783. Map<String, Object> errorMessage = checkData.startCheck(null);
  784. Map<String, Object> returnMap = new HashMap<>();
  785. returnMap.put("data", param.getList().get(0));
  786. returnMap.put("message", errorMessage.get(param.getList().get(0).getId()));
  787. return ResultVoUtil.success(returnMap);
  788. }
  789. public ResultVo<String> doesTheTemplateExist(String name) {
  790. if (dao.duplicateTemplateName(name, TokenUtil.getInstance().getTokenUserId()) == 0) {
  791. return ResultVoUtil.success();
  792. }
  793. return ResultVoUtil.fail(ExceptionEnum.NO_DATA_EXIST, "模板名称重复");
  794. }
  795. /**
  796. * 保存模板 数据
  797. *
  798. * @param param 模板数据
  799. * @return 成功
  800. */
  801. public ResultVo<String> saveTemplate(YzOrderPattern param) {
  802. // 如果名字重复了,那么就修改原来的模板
  803. YzOrderPattern yzOrderPattern = dao.yuanLaiDeMuBanBianMa(param.getPatternName(), TokenUtil.getInstance().getTokenUserId());
  804. UserInfo userInfo = userCache.getUserInfoByToken();
  805. if (null == yzOrderPattern) {
  806. yzOrderPattern = new YzOrderPattern();
  807. }
  808. String patternCode = yzOrderPattern.getPatternCode();
  809. // 有原来的模板名称而且 还要是自己创建的才能删除,否则就只能创建新的模板了
  810. if (StringUtil.notBlank(patternCode) && userInfo.getCode().equals(yzOrderPattern.getInputId())) {
  811. // 更新的时候先删除模板 原来的模板
  812. dao.shanChuLaoMuBan(patternCode);
  813. param.setPatternCode(patternCode);
  814. } else {
  815. // 设置新的模板号
  816. param.setPatternCode(publicServer.getPatternCode());
  817. }
  818. String py = PingYinUtils.pyShouZiMuDaXie(param.getPatternName());
  819. String wb = PingYinUtils.getWBCode(param.getPatternName());
  820. param.setPyCode(py.length() > 9 ? py.substring(0, 9) : py);
  821. param.setDCode(wb.length() > 9 ? wb.substring(0, 9) : wb);
  822. param.setInputId(TokenUtil.getInstance().getTokenUserId());
  823. param.setDeptCode(userInfo.getDeptCode());
  824. dao.chaRuMuBan(param);
  825. Map<String, XinZhenYzActOrder> map = param.getList().stream().collect(Collectors.toMap(XinZhenYzActOrder::getId, a -> a, (k1, k2) -> k1));
  826. for (XinZhenYzActOrder item : param.getList()) {
  827. // 设置模板号
  828. item.setActOrderNo(publicServer.getPatternOrderCode());
  829. if (item.getParentNo() != null && map.containsKey(item.getParentNo().stripTrailingZeros().toPlainString())) {
  830. item.setParentNo(map.get(item.getParentNo().stripTrailingZeros().toPlainString()).getActOrderNo());
  831. }
  832. }
  833. dao.chaRuMuBanShuJu(param.getList(), param.getPatternCode());
  834. return ResultVoUtil.success();
  835. }
  836. /***
  837. * 获取项目信息
  838. * @param xiangMuCode 项目编码
  839. * @return 返回数据
  840. */
  841. public Map<String, List<XinZhenYzActOrder>> getProjectInformation(Set<String> xiangMuCode) {
  842. if (!xiangMuCode.isEmpty()) {
  843. return dao.huoQuXiangMuXinXi(xiangMuCode).stream().collect(Collectors.groupingBy(item -> item.getOrderCode().trim()));
  844. }
  845. return new HashMap<>(0);
  846. }
  847. /**
  848. * 获取药品信息
  849. *
  850. * @param yaoPingCode 药品编码
  851. * @return 返回数据
  852. */
  853. public Map<String, XinZhenYzActOrder> getDrugInformation(Set<String> yaoPingCode, String dept) {
  854. if (!yaoPingCode.isEmpty()) {
  855. return dao.huoQuYaoPinXinXi(yaoPingCode, dept).stream().collect(Collectors.toMap(item -> item.getOrderCode().trim() + item.getSerial().trim() + item.getGroupNo(), a -> a, (k1, k2) -> k1));
  856. }
  857. return new HashMap<>(0);
  858. }
  859. /**
  860. * 获取医嘱录入的模板
  861. *
  862. * @param code 模板编码
  863. * @param deptCode 科室编码
  864. * @param muBanLeiXing 项目类型
  865. * @param currentPage 当前页
  866. * @param total 总数
  867. * @return 返回模板
  868. */
  869. public ResultVo<IPage<YzOrderPattern>> huoQuYiZhuMuBan(String code, String deptCode, Integer muBanLeiXing, long currentPage, long total) {
  870. IPage<YzOrderPattern> page = new Page<>();
  871. if (total == 0) {
  872. page.setTotal(dao.huoQuMuBanTotal(StringUtil.isContainChinese(code), TokenUtil.getInstance().getTokenUserId(), deptCode, muBanLeiXing));
  873. }
  874. page.setRecords(dao.huoQuMuBan(StringUtil.isContainChinese(code), TokenUtil.getInstance().getTokenUserId(), deptCode, muBanLeiXing, currentPage));
  875. return ResultVoUtil.success(page);
  876. }
  877. /**
  878. * 获取 我的医嘱模板的最大医嘱码
  879. *
  880. * @return 最大排序码
  881. */
  882. public ResultVo<Integer> getDoctorSOrderTemplateMaxSortNo() {
  883. Integer sortCode = dao.getMyTemplateMaxSortNo(TokenUtil.getInstance().getTokenUserId());
  884. return ResultVoUtil.success(sortCode == null ? 0 : sortCode);
  885. }
  886. private String getActOrderNo() {
  887. Random random = new Random();
  888. String a = String.valueOf(random.nextInt(5) + 1);
  889. String b = String.valueOf(random.nextInt(99999));
  890. return a + b;
  891. }
  892. /**
  893. * 获取模板数据
  894. *
  895. * @param code 模板的编码
  896. * @return 返回数据
  897. */
  898. public ResultVo<List<YzActOrder>> huoQuMuBanShuJu(String code) {
  899. List<YzActOrder> muBanShuJu = dao.huoQuMuBanShuJu(code);
  900. Map<BigDecimal, YzActOrder> map = new HashMap<>(muBanShuJu.size());
  901. List<YzActOrder> tree = new ArrayList<>();
  902. for (YzActOrder item : muBanShuJu) {
  903. item.setId(getActOrderNo());
  904. if (item.getParentNo() == null) {
  905. tree.add(item);
  906. }
  907. map.put(item.getActOrderNo(), item);
  908. }
  909. for (YzActOrder item : muBanShuJu) {
  910. YzActOrder yzActOrder = map.get(item.getParentNo());
  911. if (yzActOrder != null) {
  912. item.setParentNo(new BigDecimal(yzActOrder.getId()));
  913. item.setIsChildren(true);
  914. if (yzActOrder.getChildren() == null) {
  915. yzActOrder.setChildren(new ArrayList<>());
  916. }
  917. yzActOrder.getChildren().add(item);
  918. // 没有副医嘱的就返回到最上层
  919. } else if (!tree.contains(item)) {
  920. item.setParentNo(null);
  921. tree.add(item);
  922. }
  923. }
  924. return ResultVoUtil.success(tree);
  925. }
  926. /**
  927. * 删除医嘱模板
  928. *
  929. * @param patternCode 模板的编码
  930. * @return 提示
  931. */
  932. public ResultVo<String> deleteADoctorSOrderTemplate(String patternCode) {
  933. if (StringUtil.isBlank(patternCode)) {
  934. return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, "模板编号为空。");
  935. }
  936. YzOrderPattern yzOrderPattern = dao.huoQuMuBanXinXi(patternCode);
  937. EntityStringTrim.beanAttributeValueTrim(yzOrderPattern);
  938. if (yzOrderPattern == null) {
  939. return ResultVoUtil.fail(ExceptionEnum.NULL_POINTER, "没有查询到对应的模板信息。");
  940. }
  941. String userId = TokenUtil.getInstance().getTokenUserId();
  942. List<Integer> role = publicServer.getRoleCode().getData();
  943. if (publicServer.needRule(role, RoleCode.PHYSICIAN_S_ORDER_TEMPLATEEDIT)) {
  944. return startDeletingTemplates(patternCode);
  945. }
  946. if (userId.equals(yzOrderPattern.getInputId())) {
  947. return startDeletingTemplates(patternCode);
  948. }
  949. // 主任可以删除本科室的任意模板
  950. if (publicServer.needRule(role, RoleCode.DIRECTOR) && dao.userDeptCode(userId).equals(yzOrderPattern.getDeptCode())) {
  951. return startDeletingTemplates(patternCode);
  952. }
  953. return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, "您没有权限删除这个模板。");
  954. }
  955. /**
  956. * 删除父模板以及下面的子模板 数据
  957. *
  958. * @param patternCode 模板编码
  959. */
  960. private ResultVo<String> startDeletingTemplates(String patternCode) {
  961. dao.shanChuMuBan(patternCode);
  962. return ResultVoUtil.success(ExceptionEnum.SUCCESS_AND_EL_MESSAGE, "删除成功。");
  963. }
  964. /**
  965. * 收藏医嘱模板或者取消收藏
  966. * 如果以及收藏了就删除,没有就收藏
  967. *
  968. * @param patternCode 模板号
  969. * @return 提示
  970. */
  971. public ResultVo<String> collectDoctorSOrderTemplate(String patternCode) {
  972. String userId = TokenUtil.getInstance().getTokenUserId();
  973. String saveTheDoctorSOrderNumber = dao.whetherToSaveTheDoctorSOrderTemplate(patternCode, userId);
  974. if (StringUtil.notBlank(saveTheDoctorSOrderNumber)) {
  975. dao.shanChuMuBan(saveTheDoctorSOrderNumber);
  976. return ResultVoUtil.success(ExceptionEnum.SUCCESS_AND_EL_MESSAGE, "已取消删除。");
  977. } else {
  978. YzOrderPattern yzOrderPattern = dao.huoQuMuBanXinXi(patternCode);
  979. EntityStringTrim.beanAttributeValueTrim(yzOrderPattern);
  980. dao.chaRuShouCang(publicServer.getPatternCode(), yzOrderPattern.getPatternName() + "(收藏)", yzOrderPattern.getPyCode(), yzOrderPattern.getDCode(), dao.userDeptCode(userId), userId, yzOrderPattern.getPatternCode());
  981. return ResultVoUtil.success(ExceptionEnum.SUCCESS_AND_EL_MESSAGE, "收藏成功。");
  982. }
  983. }
  984. /**
  985. * 删除或修改模板
  986. *
  987. * @param patternCode 模板点吗
  988. * @param patternName 模板名称
  989. * @param sortNo 排序号
  990. * @param flag 标志 1-修改 2- 删除 3-收藏和取消收藏
  991. * @return 返回给前端提示
  992. */
  993. public ResultVo<String> muBanCaoZuo(String patternCode, String patternName, String deptCode, Integer sortNo, Integer flag) {
  994. if (StringUtil.isBlank(patternCode)) {
  995. return ResultVoUtil.fail(ExceptionEnum.NULL_POINTER, "模板编码为空。");
  996. }
  997. YzOrderPattern yzOrderPattern = dao.huoQuMuBanXinXi(patternCode);
  998. if (yzOrderPattern == null) {
  999. return ResultVoUtil.fail(ExceptionEnum.NULL_POINTER, "没有查询到对应的模板信息。");
  1000. }
  1001. EntityStringTrim.beanAttributeValueTrim(yzOrderPattern);
  1002. String inputId = TokenUtil.getInstance().getTokenUserId();
  1003. List<Integer> role = publicServer.getRoleCode().getData();
  1004. // 管理员 和 医务部的无视 规则
  1005. if (!role.contains(1) && !role.contains(38) && flag != 3) {
  1006. // 只有模板在不等于 自己的时候触发
  1007. if (!inputId.equals(yzOrderPattern.getInputId())) {
  1008. if ("2".equals(yzOrderPattern.getInputType()) && !role.contains(11)) {
  1009. return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, "该模板为科室模板您没有权限修改或删除,请联系科主任进行修改。");
  1010. } else if ("1".equals(yzOrderPattern.getInputType())) {
  1011. return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, "该模板为全院模板,无法删除或修改。");
  1012. }
  1013. }
  1014. }
  1015. if (flag == 1) {
  1016. if (StringUtil.isBlank(patternName)) {
  1017. return ResultVoUtil.fail(ExceptionEnum.NULL_POINTER, "模板名称不能为空。");
  1018. }
  1019. if (patternName.trim().equals(yzOrderPattern.getPatternName().trim()) && sortNo.equals(yzOrderPattern.getSortNo())) {
  1020. return ResultVoUtil.fail(ExceptionEnum.INTERNAL_SERVER_ERROR, "数据没有变化,请勿点击。");
  1021. }
  1022. dao.genXingMuBan(patternName.trim(), PingYinUtils.pyShouZiMuDaXie(patternName), PingYinUtils.getWBCode(patternName), yzOrderPattern.getPatternCode(), sortNo);
  1023. return ResultVoUtil.success(ExceptionEnum.SUCCESS_AND_EL_MESSAGE, "修改成功。");
  1024. } else if (flag == 2) {
  1025. // 删除父模板以及下面的子模板 数据
  1026. dao.shanChuMuBan(yzOrderPattern.getPatternCode());
  1027. return ResultVoUtil.success(ExceptionEnum.SUCCESS_AND_EL_MESSAGE, "删除成功。");
  1028. } else if (flag == 3) {
  1029. // 收藏模板
  1030. String collectCode = dao.chongFuShouCang(inputId, patternCode);
  1031. if (collectCode == null) {
  1032. dao.chaRuShouCang(publicServer.getPatternCode(), yzOrderPattern.getPatternName() + "(收藏)", yzOrderPattern.getPyCode(), yzOrderPattern.getDCode(), deptCode, inputId, yzOrderPattern.getPatternCode());
  1033. return ResultVoUtil.success(ExceptionEnum.SUCCESS_AND_EL_MESSAGE, "收藏成功。");
  1034. } else {
  1035. dao.shanChuMuBan(yzOrderPattern.getPatternCode());
  1036. return ResultVoUtil.success(ExceptionEnum.SUCCESS_AND_EL_MESSAGE, "已取消收藏。");
  1037. }
  1038. }
  1039. return ResultVoUtil.success();
  1040. }
  1041. /**
  1042. * 设置患者三级医生
  1043. *
  1044. * @param param 参数
  1045. * @return 返回值
  1046. */
  1047. public ResultVo<String> saveTheThirdLevelDoctor(Overview param) {
  1048. dao.updateTheThirdLevelDoctor(param);
  1049. return ResultVoUtil.success(ExceptionEnum.SUCCESS_AND_EL_MESSAGE);
  1050. }
  1051. /**
  1052. * 设置父子医嘱
  1053. *
  1054. * @param param 主医嘱 和 多个子医嘱
  1055. * @return 返回数据
  1056. */
  1057. public ResultVo<List<XinZhenYzActOrder>> associateOrders(XinZhenYiZhu param) {
  1058. XinZhenYzActOrder order = dao.getActOrderNoOne(param.getActOrderNo());
  1059. if (order.getParentNo() != null) {
  1060. return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, "操作失败,父医嘱不能为子医嘱。");
  1061. }
  1062. Set<BigDecimal> orderList = new HashSet<>();
  1063. orderList.add(order.getActOrderNo());
  1064. param.getAssociatedGroup().forEach(item -> {
  1065. dao.associateOrders(item, order);
  1066. orderList.add(item);
  1067. });
  1068. QueryWrapper<?> qw = new QueryWrapper<>();
  1069. qw.in("a.act_order_no", orderList);
  1070. return ResultVoUtil.success(ExceptionEnum.SUCCESS_AND_EL_MESSAGE, "关联成功。", dao.selectOrderNo(qw));
  1071. }
  1072. /**
  1073. * 确认 出院带药医嘱
  1074. *
  1075. * @param patNo 住院号
  1076. * @param times 住院次数
  1077. * @return
  1078. */
  1079. public ResultVo<Map<String, Object>> confirmTheDoctorSOrderWithMedicine(String patNo, Integer times) {
  1080. // 判断是否开了出院医嘱后的医嘱
  1081. if (!yzConfig.getPrescribeMedicalAdviceAfterDischarge()) {
  1082. YzActOrder ourOrderInfo = dao.selectFinallyOutOrderInfo(patNo, times);
  1083. if (ourOrderInfo != null) {
  1084. if (dao.prescribeMedicalAdviceAfterDischarge(patNo, times, ourOrderInfo.getStartTime(), ourOrderInfo.getActOrderNo()) > 0) {
  1085. return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, "有医嘱开在了出院医嘱后无法确认。");
  1086. }
  1087. }
  1088. }
  1089. QueryWrapper<?> qw = new QueryWrapper<>();
  1090. String 出院带药 = "007";
  1091. qw.eq("a.inpatient_no", patNo)
  1092. .eq("a.admiss_times", times)
  1093. .eq("a.status_flag", "1")
  1094. .eq("a.enter_oper", TokenUtil.getInstance().getTokenUserId())
  1095. .eq("isnull(a.supply_code,'0')", 出院带药);
  1096. XinZhenYiZhu patInfo = dao.queryPatientInfo(patNo, times);
  1097. patInfo.setList(dao.selectOrderNo(qw));
  1098. if (ListUtil.isBlank(patInfo.getList())) {
  1099. return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, "未查询到医嘱。");
  1100. }
  1101. String userCode = TokenUtil.getInstance().getTokenUserId();
  1102. // 出院带药需要生成药单 key 是不同的药房。不同的药房就要
  1103. YiZhuCheckData checkData = new YiZhuCheckData(dao)
  1104. .checkForRestrictedMedication();
  1105. checkData.init(patInfo.getList(), patInfo);
  1106. Map<String, Object> map = checkData.startCheck(null);
  1107. if (checkData.getPassTheAudit()) {
  1108. sendAMessageToTheNurse(patInfo, userCode, patInfo, "出院带药");
  1109. Date now = new Date();
  1110. ListUtil.batchList(patInfo.getList(), YiZhuLuRuDao.class, (mapper, item) -> {
  1111. if (StringUtil.notBlank(item.getSuperiorDoctor())) {
  1112. mapper.takeMedicineAfterDischargeStopOrderAndSuperiorDoctor(item.getActOrderNo(), item.getSuperiorDoctor(), now);
  1113. } else {
  1114. // 出院带药 确认了直接停止医嘱
  1115. mapper.takeMedicineAfterDischargeStopOrder(item.getActOrderNo(), userCode, now);
  1116. }
  1117. });
  1118. return ResultVoUtil.success(ExceptionEnum.SUCCESS_AND_EL_MESSAGE);
  1119. } else {
  1120. return ResultVoUtil.fail(ExceptionEnum.ERROR_MESSAGE, "请修改有错误的医嘱。", map);
  1121. }
  1122. }
  1123. public void insertATemplate(List<XinZhenYzActOrder> list, XinZhenYiZhu patInfo) {
  1124. String userCode = TokenUtil.getInstance().getTokenUserId();
  1125. list.forEach(item -> {
  1126. dao.insertEntryOrder(patInfo, item, userCode);
  1127. });
  1128. }
  1129. private void revertToTheDefaultState(XinZhenYzActOrder param, UserInfo us, BigDecimal parentNo) {
  1130. param.setActOrderNo(publicServer.getActOrderNo());
  1131. param.setStatusFlag("1");
  1132. Date newDate = new Date();
  1133. param.setOrderTime(newDate);
  1134. param.setStartTime(newDate);
  1135. param.setEndTime(null);
  1136. param.setEnterOper(us.getCode());
  1137. param.setSigner("");
  1138. param.setModifier("");
  1139. param.setParentNo(parentNo);
  1140. }
  1141. public ResultVo<JSONObject> copyOrder(CopyOrder copyOrder) {
  1142. QueryWrapper<?> qw = new QueryWrapper<>();
  1143. qw.eq("a.act_order_no", copyOrder.getActOrderNo());
  1144. List<XinZhenYzActOrder> yiZhuList = dao.selectOrderNo(qw);
  1145. if (ListUtil.isBlank(yiZhuList)) {
  1146. return ResultVoUtil.fail(ExceptionEnum.NULL_POINTER, "原医嘱已经不存在了。");
  1147. }
  1148. // 个人信息
  1149. UserInfo us = userCache.getUserInfoByToken();
  1150. // 存放生成的医嘱容器
  1151. List<BigDecimal> orderList = new ArrayList<>();
  1152. // 原来的医嘱
  1153. XinZhenYzActOrder fatherOrder = yiZhuList.get(0);
  1154. // 设置默认值
  1155. revertToTheDefaultState(fatherOrder, us, null);
  1156. fatherOrder.setExecUnit(copyOrder.getDeptCode());
  1157. fatherOrder.setFrequCode(copyOrder.getFrequCode());
  1158. orderList.add(fatherOrder.getActOrderNo());
  1159. // 查询子医嘱
  1160. QueryWrapper<?> childQw = new QueryWrapper<>();
  1161. // 根据父医嘱的住院号和住院次数查询医嘱,设置默认值会重新生成 actOrderNo ,所以需要使用 CopyOrder 中的 actOrderNo
  1162. childQw.eq("a.parent_no", copyOrder.getActOrderNo());
  1163. childQw.eq("a.inpatient_no", fatherOrder.getInpatientNo());
  1164. childQw.eq("a.admiss_times", fatherOrder.getAdmissTimes());
  1165. // 保存的子医嘱
  1166. List<XinZhenYzActOrder> childOrderList = dao.selectOrderNo(childQw);
  1167. // 存放医嘱容器
  1168. List<XinZhenYzActOrder> addOrderList = new ArrayList<>();
  1169. // 存放父医嘱
  1170. addOrderList.add(fatherOrder);
  1171. // 设置子医嘱默认值
  1172. if (ListUtil.notBlank(childOrderList)) {
  1173. childOrderList.forEach(item -> {
  1174. item.setExecUnit(copyOrder.getDeptCode());
  1175. item.setFrequCode(copyOrder.getFrequCode());
  1176. revertToTheDefaultState(item, us, fatherOrder.getActOrderNo());
  1177. orderList.add(item.getActOrderNo());
  1178. addOrderList.add(item);
  1179. });
  1180. }
  1181. // 获取患者信息
  1182. XinZhenYiZhu patInfo = dao.queryPatientInfo(copyOrder.getInpatientNo(), copyOrder.getAdmissTimes());
  1183. insertATemplate(addOrderList, patInfo);
  1184. JSONObject js = getNewOrderData(orderList);
  1185. return ResultVoUtil.success(ExceptionEnum.SUCCESS_AND_EL_MESSAGE, "复制成功。", js);
  1186. }
  1187. @NotNull
  1188. private JSONObject getNewOrderData(List<BigDecimal> orderList) {
  1189. QueryWrapper<?> newList = new QueryWrapper<>();
  1190. newList.in("a.act_order_no", orderList);
  1191. newList.orderByAsc("a.act_order_no");
  1192. List<XinZhenYzActOrder> newOrderList = getOrderList(dao.selectOrderNo(newList));
  1193. JSONObject js = new JSONObject();
  1194. js.put("list", orderList);
  1195. js.put("data", newOrderList);
  1196. return js;
  1197. }
  1198. public ResultVo<List<ZyDetailCharge>> queryFeeByOrderNo(BigDecimal actOrderNo) {
  1199. XinZhenYzActOrder yz = dao.getActOrderNoOne(actOrderNo.stripTrailingZeros().toPlainString());
  1200. if (yz == null) {
  1201. return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, "该医嘱未产生费用。");
  1202. }
  1203. List<ZyDetailCharge> feeList = dao.selectOrderFee(yz);
  1204. return ResultVoUtil.success(feeList);
  1205. }
  1206. public ResultVo<String> oneClickStopOrder(OneClickOrder param) {
  1207. param.setOrderNo(publicServer.getActOrderNo());
  1208. param.setNowDate(new Date());
  1209. param.setUserCode(TokenUtil.getInstance().getTokenUserId());
  1210. return executeOneClickStopOrder(param);
  1211. }
  1212. public ResultVo<String> executeOneClickStopOrder(OneClickOrder param) {
  1213. // 10507 固定医嘱号
  1214. int count = dao.oneClickStopOrder(param, param.getUserCode());
  1215. if (count > 0) {
  1216. // 生成医嘱
  1217. XinZhenYiZhu patInfo = dao.queryPatientInfo(param.getPatNo(), param.getTimes());
  1218. dao.insertOneClickStopOrder(param, patInfo);
  1219. return ResultVoUtil.success(ExceptionEnum.SUCCESS_AND_EL_MESSAGE, "操作成功,正在执行的长期医嘱停止到了【" + param.getDateStr() + "】");
  1220. }
  1221. return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, "没有需要停止的长期医嘱操作失败。");
  1222. }
  1223. /**
  1224. * 上级医生登录
  1225. *
  1226. * @return 信息
  1227. */
  1228. public ResultVo<DoctorAuthRest> doctorAuthorizationLogin(DoctorAuthParams userInfo) {
  1229. DoctorAuthRest u;
  1230. if (StrUtil.isNotBlank(userInfo.getPassword())) {
  1231. userInfo.setPassword(SecureUtil.md5(userInfo.getPassword()));
  1232. u = dao.doctorAuthorizationLogin(userInfo);
  1233. } else {
  1234. u = dao.doctorAuthorizationLoginByEmrSignPwd(userInfo);
  1235. }
  1236. if (u == null) {
  1237. return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, "密码错误或用户不存在。");
  1238. }
  1239. // 如果是项目
  1240. if (userInfo.getDrugCode().endsWith("_00")) {
  1241. return ResultVoUtil.success(u);
  1242. }
  1243. Integer drugLeven = dao.selectYpLevel(userInfo.getDrugCode());
  1244. if (drugLeven > (u.getDoctorLevel() + 1)) {
  1245. return ResultVoUtil.success(ExceptionEnum.LOGICAL_ERROR, StrUtil.format("该医生等级不足,药品等级【{}】,医生等级:【{}】", drugLeven, u.getDoctorLevel()));
  1246. }
  1247. return ResultVoUtil.success(u);
  1248. }
  1249. public ResultVo<String> updateOrderInstruction(BigDecimal orderNo, String str) {
  1250. dao.updateOrderInstruction(orderNo, str);
  1251. return ResultVoUtil.success(ExceptionEnum.SUCCESS_AND_EL_MESSAGE, "更新成功。");
  1252. }
  1253. public ResultVo<JSONObject> copyTableOrder(XinZhenYiZhu param) {
  1254. if (StringUtil.isBlank(param.getInpatientNo())) {
  1255. return ResultVoUtil.fail(ExceptionEnum.ERROR_MESSAGE, "请先选择患者.");
  1256. }
  1257. XinZhenYiZhu patInfo = dao.queryPatientInfo(param.getInpatientNo(), param.getAdmissTimes());
  1258. if (patInfo == null) {
  1259. return ResultVoUtil.fail(ExceptionEnum.ERROR_MESSAGE, "请先选择患者.");
  1260. }
  1261. List<XinZhenYzActOrder> list = param.getList();
  1262. Queue<BigDecimal> queue = new LinkedList<>();
  1263. // 保存 老 新 医嘱
  1264. Map<BigDecimal, BigDecimal> map = new HashMap<>();
  1265. for (XinZhenYzActOrder item : list) {
  1266. BigDecimal orderNo = publicServer.getActOrderNo();
  1267. queue.offer(orderNo);
  1268. map.put(item.getActOrderNo(), orderNo);
  1269. }
  1270. List<BigDecimal> returnOrderList = new LinkedList<>();
  1271. String userCode = TokenUtil.getInstance().getTokenUserId();
  1272. ListUtil.batchList(list, YiZhuLuRuDao.class, (mapper, item) -> {
  1273. item.setActOrderNo(queue.poll());
  1274. if (item.getParentNo() != null) {
  1275. item.setParentNo(map.get(item.getParentNo()));
  1276. }
  1277. returnOrderList.add(item.getActOrderNo());
  1278. mapper.insertEntryOrder(patInfo, item, userCode);
  1279. });
  1280. JSONObject js = getNewOrderData(returnOrderList);
  1281. return ResultVoUtil.success(js);
  1282. }
  1283. public ResultVo<String> analyzeSiChargeLimit(SiLimitRequest request) {
  1284. return ResultVoUtil.success(siChargeLimitService.analyzeSiChargeLimit(request));
  1285. }
  1286. public QueryWrapper<?> getConfirmQueryWrapper(String patNo, Integer times) {
  1287. return new QueryWrapper<>().eq("a.inpatient_no", patNo)
  1288. .eq("a.admiss_times", times)
  1289. .eq("a.status_flag", "1")
  1290. .eq("a.enter_oper", TokenUtil.getInstance().getTokenUserId())
  1291. // 排除出院带药的医嘱
  1292. .ne("isnull(a.self_buy,'0')", "4")
  1293. .orderByAsc("a.act_order_no");
  1294. }
  1295. public ResultVo<String> confirmYzCheck(String patNo, Integer times, Integer ledgerSn) {
  1296. QueryWrapper<?> qw = getConfirmQueryWrapper(patNo, times);
  1297. Set<String> orderCode = dao.selectOrderCode(qw);
  1298. if (orderCode == null || orderCode.isEmpty()) {
  1299. return ResultVoUtil.success("OK");
  1300. }
  1301. List<String> collect = orderCode
  1302. .stream()
  1303. .filter(Objects::nonNull)
  1304. .collect(Collectors.toList());
  1305. if (collect.isEmpty()) {
  1306. return ResultVoUtil.success("OK");
  1307. }
  1308. SiLimitRequest request = SiLimitRequest.builder()
  1309. .patNo(patNo).times(times)
  1310. .ledgerSn(ledgerSn)
  1311. .chargeList(collect)
  1312. .build();
  1313. return ResultVoUtil.success(siChargeLimitService.analyzeSiChargeLimit(request));
  1314. }
  1315. public ResultVo<Integer> getExceedingDischargeDays() {
  1316. return ResultVoUtil.success(yzConfig.getExceedingDischargeDays());
  1317. }
  1318. /**
  1319. * 更新手术病区的申请科室
  1320. *
  1321. * @param patNo 住院号
  1322. * @param times 次数
  1323. */
  1324. public void updateChargeByWardCode(String patNo, Integer times) {
  1325. if (StrUtil.isBlank(yzConfig.getShoushubingqu())) {
  1326. return;
  1327. }
  1328. String opRecordWard = dao.getOpRecordWard(patNo, times);
  1329. if (opRecordWard == null) {
  1330. return;
  1331. }
  1332. dao.updateChargeWard(patNo, times, opRecordWard, yzConfig.getShoushubingqu());
  1333. }
  1334. /**
  1335. * <el-option value="71" label="门诊" />
  1336. * <el-option value="73" label="住院" />
  1337. *
  1338. * @return
  1339. */
  1340. public Map<String, List<YpZdGroupNameVo>> getYpZdGroup() {
  1341. Map<String, List<YpZdGroupName>> value = extraCache.getYf();
  1342. String now = DateUtil.formatDate(new Date(), "HH:mm:ss");
  1343. Map<String, List<YpZdGroupNameVo>> map = new HashMap<>();
  1344. for (Map.Entry<String, List<YpZdGroupName>> item : value.entrySet()) {
  1345. item.getValue().forEach(i -> {
  1346. YpZdGroupNameVo vo = new YpZdGroupNameVo();
  1347. vo.setCode(i.getGroupNo());
  1348. vo.setName(i.getGroupName());
  1349. vo.setIsDefault(false);
  1350. if (StrUtil.isNotBlank(i.getStartTime()) && StrUtil.isNotBlank(i.getEndTime())) {
  1351. vo.setIsDefault(DateUtil.isInTimeRange(now, i.getStartTime(), i.getEndTime()));
  1352. }
  1353. map.computeIfAbsent(item.getKey(), (k) -> new ArrayList<>()).add(vo);
  1354. });
  1355. }
  1356. return map;
  1357. }
  1358. }