PublicServer.java 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745
  1. package thyyxxk.webserver.service;
  2. import com.alibaba.fastjson.JSON;
  3. import com.alibaba.fastjson.JSONObject;
  4. import com.baomidou.dynamic.datasource.annotation.DS;
  5. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  6. import lombok.extern.slf4j.Slf4j;
  7. import org.apache.commons.collections4.ListUtils;
  8. import org.jetbrains.annotations.NotNull;
  9. import org.springframework.scheduling.annotation.Async;
  10. import org.springframework.stereotype.Service;
  11. import org.springframework.transaction.annotation.Transactional;
  12. import thyyxxk.webserver.config.exception.BizException;
  13. import thyyxxk.webserver.config.exception.ExceptionEnum;
  14. import thyyxxk.webserver.constants.Capacity;
  15. import thyyxxk.webserver.constants.Message;
  16. import thyyxxk.webserver.constants.RestrictedDrugLevels;
  17. import thyyxxk.webserver.constants.Ysjb;
  18. import thyyxxk.webserver.dao.his.PublicDao;
  19. import thyyxxk.webserver.dao.his.inpatient.TransferInOfExpensesDao;
  20. import thyyxxk.webserver.dao.his.settings.SettingsDao;
  21. import thyyxxk.webserver.entity.ResultVo;
  22. import thyyxxk.webserver.entity.casefrontsheet.YshHzRecord;
  23. import thyyxxk.webserver.entity.datamodify.GetDropdownBox;
  24. import thyyxxk.webserver.entity.datamodify.ZyDetailCharge;
  25. import thyyxxk.webserver.entity.dictionary.CodeName;
  26. import thyyxxk.webserver.entity.login.UserInfo;
  27. import thyyxxk.webserver.entity.publicapi.ZkList;
  28. import thyyxxk.webserver.entity.settings.notification.SendMessageParam;
  29. import thyyxxk.webserver.entity.socketmessage.SocketMessage;
  30. import thyyxxk.webserver.entity.inpatient.ZyActpatient;
  31. import thyyxxk.webserver.entity.zhuyuanyisheng.PatientAllergenInfo;
  32. import thyyxxk.webserver.entity.zhuyuanyisheng.caoyaoyizhu.YzActOrderCy;
  33. import thyyxxk.webserver.entity.zhuyuanyisheng.jianyanjiancha.YshYjReq;
  34. import thyyxxk.webserver.entity.zhuyuanyisheng.shoushu.OpRecord;
  35. import thyyxxk.webserver.entity.zhuyuanyisheng.yizhuluru.XinZhenYiZhu;
  36. import thyyxxk.webserver.entity.zhuyuanyisheng.yizhuluru.YaoPinXiangMu;
  37. import thyyxxk.webserver.service.redislike.RedisLikeService;
  38. import thyyxxk.webserver.utils.*;
  39. import thyyxxk.webserver.websocket.WebSocketServer;
  40. import java.lang.reflect.InvocationTargetException;
  41. import java.math.BigDecimal;
  42. import java.util.*;
  43. import java.util.stream.Collectors;
  44. import java.util.stream.Stream;
  45. /**
  46. * <p>
  47. * 描述: 公共接口
  48. * </p>
  49. *
  50. * @author xc
  51. * @date 2021-09-17 10:54
  52. */
  53. @Service
  54. @Slf4j
  55. public class PublicServer {
  56. private final PublicDao dao;
  57. private final TransferInOfExpensesDao transferInOfExpensesDao;
  58. private final RedisLikeService redisLikeService;
  59. private final SettingsDao settingsDao;
  60. public PublicServer(PublicDao dao, TransferInOfExpensesDao transferInOfExpensesDao, RedisLikeService redisLikeService, SettingsDao settingsDao) {
  61. this.dao = dao;
  62. this.transferInOfExpensesDao = transferInOfExpensesDao;
  63. this.redisLikeService = redisLikeService;
  64. this.settingsDao = settingsDao;
  65. }
  66. /**
  67. * 手术日期格式
  68. *
  69. * @param opStartDate 手术开始时间
  70. * @param opEndDate 手术结束时间
  71. * @param anstStartDate 麻醉开始时间
  72. * @param anstEndDate 麻醉结束时间
  73. */
  74. public static void surgeryTimeLimit(Date opStartDate, Date opEndDate, Date anstStartDate, Date anstEndDate) {
  75. if (anstStartDate != null) {
  76. if (DateUtil.shiJianDaXiao(opStartDate, anstStartDate, "<")) {
  77. throw new BizException(ExceptionEnum.LOGICAL_ERROR, "麻醉开始时间要大于手术开始时间.");
  78. }
  79. long opDate = opEndDate.getTime() - opStartDate.getTime();
  80. long anstDate = anstEndDate.getTime() - anstStartDate.getTime();
  81. if (opDate >= anstDate) {
  82. throw new BizException(ExceptionEnum.LOGICAL_ERROR, "手术麻醉时间一定要比手术时间长.");
  83. }
  84. }
  85. }
  86. /**
  87. * 获取用户的角色信息
  88. *
  89. * @return 返回角色
  90. */
  91. public ResultVo<List<Integer>> getRoleCode() {
  92. return ResultVoUtil.success(redisLikeService.getUserInfoByToken().getRoles());
  93. }
  94. /**
  95. * @param jueSeBianMa 不需要限制的角色id
  96. * @return Boolean
  97. */
  98. public Boolean noNeedRule(int... jueSeBianMa) {
  99. return getaBoolean(jueSeBianMa, getRoleCode().getData());
  100. }
  101. /**
  102. * @param jueSeBianMa 不需要限制的角色id
  103. * @return Boolean
  104. */
  105. public Boolean noNeedRule(List<Integer> role, int... jueSeBianMa) {
  106. return getaBoolean(jueSeBianMa, role);
  107. }
  108. /**
  109. * @param jueSeBianMa 不需要限制的角色id
  110. * @return Boolean
  111. */
  112. public Boolean needRule(int... jueSeBianMa) {
  113. return !getaBoolean(jueSeBianMa, getRoleCode().getData());
  114. }
  115. /**
  116. * @param jueSeBianMa 不需要限制的角色id
  117. * @return Boolean
  118. */
  119. public Boolean needRule(List<Integer> role, int... jueSeBianMa) {
  120. return !getaBoolean(jueSeBianMa, role);
  121. }
  122. public Boolean getaBoolean(int[] jueSeBianMa, List<Integer> roleCode) {
  123. if (ListUtil.isBlank(roleCode)) {
  124. return true;
  125. }
  126. if (roleCode.contains(1)) {
  127. return false;
  128. }
  129. for (Integer i : jueSeBianMa) {
  130. if (roleCode.contains(i)) {
  131. return false;
  132. }
  133. }
  134. return true;
  135. }
  136. /**
  137. * 获取新的医嘱号
  138. *
  139. * @return 返回医嘱号
  140. */
  141. public float getActOrderNo() {
  142. dao.lockTable();
  143. float actOrderNo = dao.getActOrderNo() + 1;
  144. dao.updateActOrderNo(actOrderNo);
  145. return actOrderNo;
  146. }
  147. /**
  148. * 获取模板的编码
  149. *
  150. * @return 返回编码信息
  151. */
  152. public String getPatternCode() {
  153. dao.lockTable();
  154. Integer patternCode = dao.getPatternCode() + 1;
  155. dao.updatePatternCode(patternCode);
  156. return patternCode.toString();
  157. }
  158. /**
  159. * 获取医嘱模板下面的 子级 排序号
  160. *
  161. * @return 返回序号
  162. */
  163. public float getPatternOrderCode() {
  164. dao.lockTable();
  165. float patternOrderCode = dao.getPatternOrderCode() + 1;
  166. dao.updatePatternOrderCode(patternOrderCode);
  167. return patternOrderCode;
  168. }
  169. /**
  170. * @return 返回说明模板的编码
  171. */
  172. public Integer getYjTemplateNo() {
  173. dao.lockYshConfig();
  174. Integer tempNo = dao.tempNo() + 1;
  175. dao.updateTempNo(tempNo);
  176. return tempNo;
  177. }
  178. /**
  179. * @return 返回申请号
  180. */
  181. public Integer getReqPageNo() {
  182. dao.lockYshConfig();
  183. Integer reqNo = dao.getReqNo() + 1;
  184. dao.updateReqNo(reqNo);
  185. return reqNo;
  186. }
  187. /**
  188. * @param inpatientNo 住院号
  189. * @return 返回婴儿标志
  190. */
  191. public static int getInfantFlag(String inpatientNo) {
  192. if (StringUtil.isBlank(inpatientNo)) {
  193. return 0;
  194. }
  195. if (inpatientNo.contains("$")) {
  196. return 1;
  197. }
  198. return 0;
  199. }
  200. /**
  201. * 返回
  202. *
  203. * @param inpatientNo 住院号
  204. * @return 返回新住院号
  205. */
  206. public String getInpatientNo(String inpatientNo) {
  207. if (StringUtil.isBlank(inpatientNo)) {
  208. return "";
  209. }
  210. if (inpatientNo.contains("$")) {
  211. inpatientNo = inpatientNo.split("\\$")[0];
  212. }
  213. return inpatientNo;
  214. }
  215. /**
  216. * 获取最大流水号
  217. *
  218. * @param inpatientNo 住院号
  219. * @param admissTimes 住院次数
  220. * @return 返回 流水
  221. */
  222. public Integer getMaxDetailSn(String inpatientNo, Integer admissTimes) {
  223. return transferInOfExpensesDao.getMaxDetailSn(inpatientNo, admissTimes);
  224. }
  225. /**
  226. * 获取科室的子科室和本科
  227. *
  228. * @param deptCode 科室代码
  229. * @return 返回科室
  230. */
  231. public List<String> getKeShiLieBiaoList(String deptCode) {
  232. if (noNeedRule(1)) {
  233. Map<String, GetDropdownBox> map = dao.getKeShiLieBiao(deptCode).stream().collect(Collectors.toMap(GetDropdownBox::getCode, a -> a, (k1, k2) -> k1));
  234. if (StringUtil.isBlank(map.get(deptCode).getParentCode())) {
  235. return new ArrayList<>(map.keySet());
  236. }
  237. return Stream.of(deptCode).collect(Collectors.toList());
  238. }
  239. return new ArrayList<>();
  240. }
  241. /**
  242. * 获取科室的子科室和本科
  243. *
  244. * @param deptCodeList 科室代码
  245. * @return 返回科室
  246. */
  247. public List<String> getKeShiLieBiaoList(List<String> deptCodeList) {
  248. if (ListUtil.isBlank(deptCodeList)) {
  249. return new ArrayList<>();
  250. }
  251. return dao.getKeShiLieBiaoList(deptCodeList);
  252. }
  253. /**
  254. * 获取人员信息
  255. *
  256. * @param code 人员代码
  257. * @return 返回人员
  258. */
  259. public ResultVo<List<GetDropdownBox>> getRenYuan(String code) {
  260. return ResultVoUtil.success(dao.getRenYuan(StringUtil.isContainChinese(code)));
  261. }
  262. /**
  263. * 搜索项目信息
  264. *
  265. * @param pyCode 拼音码
  266. * @return 返回项目信息
  267. */
  268. public ResultVo<List<GetDropdownBox>> getChargeCode(String pyCode) {
  269. log.info("获取编码:{}", pyCode);
  270. return ResultVoUtil.success(dao.getChargeCode(StringUtil.isContainChinese(pyCode)));
  271. }
  272. /**
  273. * 获取科室信息
  274. *
  275. * @return 返回科室
  276. */
  277. public ResultVo<List<GetDropdownBox>> getDept() {
  278. return ResultVoUtil.success(dao.getDept());
  279. }
  280. public ResultVo<List<GetDropdownBox>> queryDept(String code) {
  281. return ResultVoUtil.success(dao.queryDept(StringUtil.isContainChinese(code)));
  282. }
  283. /**
  284. * 获取这个人的账页号
  285. *
  286. * @param inpatientNo 住院号
  287. * @param admissTimes 住院次数
  288. * @return 返回有用的账页号
  289. */
  290. public Integer getLedgerSn(String inpatientNo, Integer admissTimes) {
  291. if (StringUtil.isBlank(inpatientNo) || admissTimes == null) {
  292. return 0;
  293. }
  294. inpatientNo = getInpatientNo(inpatientNo);
  295. return dao.getLedgerSn(inpatientNo, admissTimes);
  296. }
  297. /**
  298. * 更新患者的退费对应的正流水号
  299. *
  300. * @param inpatientNo 住院号
  301. * @param admissTimes 住院次数
  302. * @param ledger 账页号
  303. */
  304. public void genXingYuanLiuShuiBiaoZhi(String inpatientNo, Integer admissTimes, Integer ledger) {
  305. dao.chongZhiZhenLiuShui(inpatientNo, admissTimes, ledger);
  306. // 这里是重置 正流水号
  307. List<Integer> huoQuTuiFeiYuanLiuShui = dao.huoQuTuiFeiYuanLiuShui(inpatientNo, admissTimes, ledger);
  308. if (ListUtil.notBlank(huoQuTuiFeiYuanLiuShui)) {
  309. List<List<Integer>> fenGeFuLiuShui = ListUtils.partition(huoQuTuiFeiYuanLiuShui, 50);
  310. for (List<Integer> integers : fenGeFuLiuShui) {
  311. dao.genXingFuShuDuiYingZhenLiuShui(inpatientNo, admissTimes, ledger, integers);
  312. }
  313. }
  314. // 这里是判断正数的是否没有了,如果正数的没有了 那么负数的就要更新为空
  315. List<Integer> xuYaoQingKongDeFuLiuShui = new ArrayList<>();
  316. List<Integer> zhenShuLiuShuiMap = dao.zhenShuLiuShui(inpatientNo, admissTimes, ledger);
  317. List<Integer> fuShuLiuShui = dao.fuShuLiuShui(inpatientNo, admissTimes, ledger);
  318. for (Integer integer : fuShuLiuShui) {
  319. if (!zhenShuLiuShuiMap.contains(integer) && !xuYaoQingKongDeFuLiuShui.contains(integer)) {
  320. xuYaoQingKongDeFuLiuShui.add(integer);
  321. }
  322. }
  323. if (ListUtil.notBlank(xuYaoQingKongDeFuLiuShui)) {
  324. List<List<Integer>> list = ListUtils.partition(xuYaoQingKongDeFuLiuShui, 50);
  325. for (List<Integer> integers : list) {
  326. dao.chongZhiFuShuYuanLiuShui(inpatientNo, admissTimes, ledger, integers);
  327. }
  328. }
  329. // 这里判断是否重复退费,退多了
  330. Map<Integer, ZyDetailCharge> chongFuYuanLiuShuiMap = dao.chongFuTuiFeiLiuShui(inpatientNo, admissTimes, ledger).stream().collect(Collectors.toMap(ZyDetailCharge::getOriDetailSn, a -> a, (k1, k2) -> k1));
  331. if (!chongFuYuanLiuShuiMap.isEmpty()) {
  332. List<ZyDetailCharge> chongFuTuiFeiZhenShu = dao.getZhenShuLiuShui(inpatientNo, admissTimes, ledger, chongFuYuanLiuShuiMap.keySet());
  333. List<Integer> xuYaoChongZhiLiuShui = new ArrayList<>();
  334. if (ListUtil.notBlank(chongFuTuiFeiZhenShu)) {
  335. for (ZyDetailCharge zyDetailCharge : chongFuTuiFeiZhenShu) {
  336. ZyDetailCharge zy = chongFuYuanLiuShuiMap.get(zyDetailCharge.getDetailSn());
  337. if (BigUtils.bigXiaoYu(zyDetailCharge.getChargeFee(), zy.getChargeFee().negate())) {
  338. xuYaoChongZhiLiuShui.add(zyDetailCharge.getDetailSn());
  339. }
  340. }
  341. }
  342. // 这里更新
  343. if (ListUtil.notBlank(xuYaoChongZhiLiuShui)) {
  344. dao.chongFuTuiFeiChongZhi(inpatientNo, admissTimes, ledger, xuYaoChongZhiLiuShui);
  345. }
  346. }
  347. // 这个是判断 trans_flag_yb = 2 费用相加 不为 0 的 就重置一下
  348. if (!BigUtils.dengYu(dao.zhenFuXingDiFeiYong(inpatientNo, admissTimes, ledger), 0)) {
  349. dao.chongXingZhengFuXiangDi(inpatientNo, admissTimes, ledger);
  350. }
  351. }
  352. /**
  353. * 获取员工信息
  354. *
  355. * @param code 编码
  356. * @return 返回
  357. */
  358. public UserInfo huoQuYuanGongXinXi(String code) {
  359. if (StringUtil.isBlank(code)) {
  360. return new UserInfo();
  361. }
  362. return dao.huoQuYuanGongBianMa(code);
  363. }
  364. public List<String> huoQuBingFangDeKeShi(String deptCode) {
  365. if (getRoleCode().getData().contains(1) || getRoleCode().getData().contains(8) || StringUtil.isBlank(deptCode)) {
  366. return new ArrayList<>();
  367. }
  368. List<String> keShiDaiMa = dao.bingFangSuoSuKeShi(deptCode);
  369. if (ListUtil.isBlank(keShiDaiMa)) {
  370. keShiDaiMa.add(deptCode);
  371. }
  372. return keShiDaiMa;
  373. }
  374. /**
  375. * 这里的住院号是没有 处理过得
  376. *
  377. * @param inpatientNo 住院号
  378. * @return 返回病人基本信息
  379. */
  380. public ZyActpatient huoQuHuanZheXinXi(String inpatientNo) {
  381. if (StringUtil.isBlank(inpatientNo)) {
  382. throw new BizException(ExceptionEnum.NULL_POINTER, "住院号为空。");
  383. }
  384. ZyActpatient zyActpatient = dao.getHuanZheJiBenXinXi(inpatientNo);
  385. log.info("查询患者的信息在院:住院号{}", inpatientNo);
  386. if (zyActpatient == null) {
  387. throw new BizException(ExceptionEnum.NULL_POINTER, "没有查询到患者的基本信息。");
  388. }
  389. zyActpatient.setInfantFlag(getInfantFlag(zyActpatient.getInpatientNo()));
  390. zyActpatient.setInpatientNo(getInpatientNo(zyActpatient.getInpatientNo()));
  391. return zyActpatient;
  392. }
  393. /**
  394. * 这里是重置流水
  395. *
  396. * @param patNo 住院号
  397. * @param times 住院次数
  398. */
  399. @Transactional(rollbackFor = Exception.class)
  400. public void chongZhiLiuShui(String patNo, Integer times) {
  401. List<ZyDetailCharge> paiXu = dao.huoQuZhongYeFeiYong(patNo, times);
  402. log.info("获取数据:{}", JSON.toJSONString(paiXu));
  403. int maxDetailSn = dao.maxDetailSn(patNo, times);
  404. List<List<ZyDetailCharge>> fenDuan = ListUtils.partition(paiXu, 100);
  405. for (List<ZyDetailCharge> zyDetailCharges : fenDuan) {
  406. dao.chongZhiLiuShui(patNo, times, zyDetailCharges, maxDetailSn);
  407. }
  408. for (List<ZyDetailCharge> zyDetailCharges : fenDuan) {
  409. dao.chongZhiLiuShui(patNo, times, zyDetailCharges, 0);
  410. }
  411. }
  412. /**
  413. * 获取麻醉方式
  414. *
  415. * @return 返回数据
  416. */
  417. public ResultVo<List<GetDropdownBox>> maZuiFangShi() {
  418. return ResultVoUtil.success(dao.maZuiFangShi());
  419. }
  420. public Integer huoQuJianYanJianChaXuHao() {
  421. dao.jianYanJianChaSuo();
  422. Integer xuHao = dao.jianYanJianChaXuHao() + 1;
  423. dao.genXingJianYanJianChaXuHao(xuHao);
  424. return xuHao;
  425. }
  426. public Integer huoQuShouShuHao() {
  427. dao.suoZhuShouShu();
  428. Integer index = dao.shouShuXuHao() + 1;
  429. dao.genXingShouShuXuHao(index);
  430. return index;
  431. }
  432. /**
  433. * 获取药品单号
  434. *
  435. * @return 药品单号
  436. */
  437. public Integer getTheDrugListNo() {
  438. dao.lockTable();
  439. Integer index = dao.caoYaoDanHao() + 1;
  440. dao.genXingCaoYaoDanHao(index);
  441. return Integer.valueOf(DateUtil.formatDatetime(new Date(), "yyMMdd") + index);
  442. }
  443. public String getGroupNo() {
  444. String groupNo = "71";
  445. if (DateUtil.timeIsInRound(DateUtil.formatDatetime(new Date(), "HH:mm:ss"), "08:00:00", "19:59:59")) {
  446. groupNo = "73";
  447. }
  448. return groupNo;
  449. }
  450. public void huanZheJieSuan(String patNo, Integer times) {
  451. if (StringUtil.isBlank(patNo) || times == null) {
  452. throw new BizException(ExceptionEnum.LOGICAL_ERROR, "住院号不能为空。");
  453. }
  454. Integer settleType = dao.jieSuanXinXi(patNo, times);
  455. if (settleType == null) {
  456. throw new BizException(ExceptionEnum.LOGICAL_ERROR, "没有查询到患者的信息。");
  457. }
  458. if (settleType == 1) {
  459. throw new BizException(ExceptionEnum.LOGICAL_ERROR, "患者已经结算无法进行操作了。");
  460. }
  461. }
  462. public void huoQuGaiYiZhuXiaXiangMu(BigDecimal orderNo) {
  463. YshHzRecord hz = dao.huiZhen(orderNo);
  464. if (hz != null) {
  465. if (hz.getStatusFlag().trim().equals("2")) {
  466. throw new BizException(ExceptionEnum.LOGICAL_ERROR, "该医嘱下的会诊,已经完成无法删除了。");
  467. }
  468. return;
  469. }
  470. YshYjReq yj = dao.yiJi(orderNo);
  471. if (yj != null) {
  472. if (yj.getReceiveFlag().trim().equals("2")) {
  473. throw new BizException(ExceptionEnum.LOGICAL_ERROR, String.format("该医嘱下【%s】,已经完成无法删除了。", yj.getReqType().trim().equals("2") ? "检验" : "检查"));
  474. }
  475. return;
  476. }
  477. OpRecord shouShu = dao.shouShu(orderNo);
  478. if (shouShu != null) {
  479. if (!shouShu.getStatus().trim().equals("1")) {
  480. throw new BizException(ExceptionEnum.LOGICAL_ERROR, "该医嘱下的手术,无法被删除。");
  481. }
  482. return;
  483. }
  484. YzActOrderCy caoYao = dao.caoYao(orderNo);
  485. if (caoYao != null) {
  486. if (caoYao.getStatusFlag().trim().equals("4")) {
  487. throw new BizException(ExceptionEnum.LOGICAL_ERROR, "该医嘱下的草药已经发药,无法删除。");
  488. }
  489. }
  490. }
  491. /**
  492. * 药品限制
  493. *
  494. * @param listCode 药品的编码以及规格 做成code
  495. * @return 返回提示
  496. */
  497. public String yaoPinXianZhi(List<String> listCode, boolean delFlag) {
  498. StringBuilder sb = new StringBuilder();
  499. QueryWrapper<?> qw = new QueryWrapper<>();
  500. qw.in("rtrim(code) + rtrim(serial)", listCode);
  501. Map<String, YaoPinXiangMu> map = dao.huoQuYaoPinPiPeiXinXi(qw).stream().collect(Collectors.toMap(YaoPinXiangMu::getZdCode, a -> a, (k1, k2) -> k1));
  502. return yaoPingXiangMuXianZhi(map, sb, "药品", delFlag);
  503. }
  504. public String xiangMuXianZhi(List<String> listCode, boolean delFlag) {
  505. Map<String, YaoPinXiangMu> map = dao.huoQuXiangMuXinXi(listCode).stream().collect(Collectors.toMap(YaoPinXiangMu::getZdCode, a -> a, (k1, k2) -> k1));
  506. StringBuilder sb = new StringBuilder();
  507. return yaoPingXiangMuXianZhi(map, sb, "项目", delFlag);
  508. }
  509. @NotNull
  510. public String yaoPingXiangMuXianZhi(Map<String, YaoPinXiangMu> map, StringBuilder sb, String name, boolean delFlag) {
  511. for (YaoPinXiangMu item : map.values()) {
  512. if (delFlag && item.getDelFlag() == 1) {
  513. sb.append(cuoWuXinXi(item.getZdCode(), "00".equals(item.getSerial().trim()) ? "医嘱名:" + item.getName() + " 项目名:" + item.getZdName() : "" + item.getName(), name + "已被停用"));
  514. }
  515. if (StringUtil.isBlank(item.getNationalCode()) && !delFlag) {
  516. sb.append(cuoWuXinXi(item.getZdCode(), "00".equals(item.getSerial().trim()) ? "医嘱名:" + item.getName() + " 项目名:" + item.getZdName() : "" + item.getName(), name + "没有匹配医保编码"));
  517. }
  518. }
  519. return sb.toString();
  520. }
  521. public String cuoWuXinXi(String code, String name, String xinXi) {
  522. return "编码:<span style='color:teal'>【" + code + "】</span><br>" + "名称:<span style='color:#a5673f'>【" + name + "】 </span><br>" + "<span style='color:red'>" + xinXi + "</span><br>";
  523. }
  524. @Async
  525. public void sendDoctorNotification(XinZhenYiZhu huanZheXinXi, String content, String title, String sender, List<String> userCodeList) {
  526. sendDoctorNotification(huanZheXinXi, Collections.singletonList(content), title, sender, userCodeList);
  527. }
  528. @Async
  529. public void sendDoctorNotification(XinZhenYiZhu huanZheXinXi, List<String> content, String title, String sender, List<String> userCodeList) {
  530. JSONObject obj = new JSONObject();
  531. obj.put("message", title);
  532. // 消息数量
  533. obj.put("count", content.size());
  534. // 发送通知类
  535. List<SocketMessage> socketMessage1 = new ArrayList<>();
  536. List<SocketMessage> socketMessage2 = new ArrayList<>();
  537. for (String s : content) {
  538. SocketMessage faSongNeiRong = new SocketMessage();
  539. faSongNeiRong.setSender(sender);
  540. faSongNeiRong.setContent(s);
  541. // 雪花算法
  542. faSongNeiRong.setId(SnowFlakeId.instance().nextId());
  543. faSongNeiRong.setPatId(huanZheXinXi.getInpatientNo() + "_" + huanZheXinXi.getAdmissTimes());
  544. faSongNeiRong.setTitle(title);
  545. socketMessage1.add(faSongNeiRong);
  546. for (String huShi : userCodeList) {
  547. SocketMessage jieShouFang = new SocketMessage();
  548. jieShouFang.setMsgId(faSongNeiRong.getId());
  549. jieShouFang.setSender(faSongNeiRong.getSender());
  550. jieShouFang.setReceiver(huShi);
  551. socketMessage2.add(jieShouFang);
  552. }
  553. }
  554. List<List<SocketMessage>> fenGeFaSongFang = ListUtils.partition(socketMessage1, 20);
  555. List<List<SocketMessage>> fenGeJieShouFang = ListUtils.partition(socketMessage2, 20);
  556. for (List<SocketMessage> item : fenGeFaSongFang) {
  557. dao.chaRuTongZhiXinXi(item);
  558. }
  559. for (List<SocketMessage> item : fenGeJieShouFang) {
  560. dao.chaRuJieShouShuJu(item);
  561. }
  562. userCodeList.forEach(code -> WebSocketServer.sendMessageByUserCode(code, SocketMsg.socketVo(Message.SYSTEM_NOTIFICATION, obj)));
  563. }
  564. /**
  565. * @param huanZheXinXi 患者信息
  566. * @param content 内容
  567. * @param title 标题
  568. * @param userCode 发送人id
  569. */
  570. @Async
  571. public void faSongXiaoXi(XinZhenYiZhu huanZheXinXi, List<String> content, String title, String userCode) {
  572. List<String> huShiBianMa = dao.huoQuHuanZheBingFangDeHuShi(huanZheXinXi.getDeptCode());
  573. sendDoctorNotification(huanZheXinXi, content, title, userCode, huShiBianMa);
  574. }
  575. public ResultVo<String> makePyCode(String tableName, String idColumn, String nameColumn, String pyColumn) {
  576. List<CodeName> list = dao.originalList(tableName, idColumn, nameColumn, pyColumn);
  577. if (null == list || list.isEmpty()) {
  578. return ResultVoUtil.fail(ExceptionEnum.NO_DATA_EXIST, "没有需要更改的数据。");
  579. }
  580. for (CodeName item : list) {
  581. String pycode = PingYinUtils.pyShouZiMuDaXie(item.getName());
  582. dao.updatePycode(tableName, idColumn, item.getCode(), pyColumn, pycode);
  583. log.info("修复:{},{},{}", item.getCode(), item.getName(), pycode);
  584. }
  585. return ResultVoUtil.success("修复拼音码成功,共修复 " + list.size() + " 条。");
  586. }
  587. @DS("his")
  588. public ResultVo<List<GetDropdownBox>> getAllergens(String name) {
  589. return ResultVoUtil.success(dao.getAllergens(StringUtil.isContainChinese(name)));
  590. }
  591. public ResultVo<List<PatientAllergenInfo>> getPatientAllergens(String patNo) {
  592. return ResultVoUtil.success(dao.getPatientAllergens(patNo));
  593. }
  594. public ResultVo<Boolean> whetherThePatientHasAllergens(String PatNo) {
  595. return ResultVoUtil.success(dao.whetherThePatientHasAllergens(PatNo) > 0);
  596. }
  597. public ResultVo<Integer> newPatientAllergens(String patNo, String allergenCode, int allergenType) {
  598. if (StringUtil.isBlank(patNo)) {
  599. return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, "没有患者住院号");
  600. }
  601. PatientAllergenInfo info = new PatientAllergenInfo();
  602. info.setAllergenCode(allergenCode);
  603. info.setPatNo(patNo);
  604. info.setType(allergenType);
  605. dao.newPatientAllergens(info);
  606. return ResultVoUtil.success(info.getId());
  607. }
  608. public ResultVo<String> removePatientAllergens(Integer id) {
  609. dao.removePatientAllergens(id);
  610. return ResultVoUtil.success(ExceptionEnum.SUCCESS_AND_NOTIFICATION);
  611. }
  612. /**
  613. * @param name 名称
  614. * @return 获取药品信息
  615. */
  616. public ResultVo<List<GetDropdownBox>> getDrugInfo(String name) {
  617. return ResultVoUtil.success(dao.getDrugInfo(StringUtil.isContainChinese(name)));
  618. }
  619. public ResultVo<List<GetDropdownBox>> getBldCat(String name) {
  620. return ResultVoUtil.success(dao.getBldCat(StringUtil.isContainChinese(name)));
  621. }
  622. /**
  623. * 获取转科列表
  624. *
  625. * @return
  626. */
  627. public ResultVo<List<ZkList>> getTheTransferList() {
  628. List<ZkList> list = dao.getTheTransferList();
  629. for (ZkList zkList : list) {
  630. zkList.setValue(JSON.toJSONString(zkList));
  631. }
  632. return ResultVoUtil.success(list);
  633. }
  634. public ResultVo<Map<String, Object>> getPeopleToFillInInformation() throws InvocationTargetException, IllegalAccessException {
  635. Map<String, Object> map = new HashMap<>(Capacity.EIGHT);
  636. map.put("restrictedDrugLevels", EnumToJson.toJson(RestrictedDrugLevels.values()));
  637. map.put("ysjbData", EnumToJson.toJson(Ysjb.values()));
  638. map.put("deptData", getDept().getData());
  639. map.put("empPosition", dao.getEmpPosition());
  640. map.put("empInmark", dao.getEmpInmark());
  641. map.put("zdIfcadre", dao.getZdIfcadre());
  642. map.put("zdEmpTitle", dao.getZdEmpTitle());
  643. map.put("mzyZdChargeType", dao.getMzyZdChargeType());
  644. return ResultVoUtil.success(map);
  645. }
  646. public ResultVo<Boolean> idVerification(String idCard) {
  647. return ResultVoUtil.success(IdCardUtil.isValidatedIdCard(idCard));
  648. }
  649. public Integer getPersonnelCode() {
  650. dao.lockThePersonnelCodeTable();
  651. Integer code = dao.getPersonnelCode();
  652. dao.updateStaffCodeTable(code);
  653. return code;
  654. }
  655. public ResultVo<String> sendMessage(SendMessageParam param) {
  656. settingsDao.insertNewMessage(SnowFlakeId.instance().nextId(), param.getMessage());
  657. JSONObject obj = new JSONObject();
  658. obj.put("message", param.getMessage());
  659. if (null != param.getRefreshDelay()) {
  660. int delay = param.getRefreshDelay() * 1000;
  661. obj.put("refreshDelay", delay);
  662. }
  663. WebSocketServer.sendMessageToAll(SocketMsg.socketVo(Message.SYSTEM_NOTIFICATION, obj));
  664. log.info("发送全体消息 => 操作员:{},消息体:{}", TokenUtil.getTokenUserId(), obj);
  665. return ResultVoUtil.success();
  666. }
  667. public void sendSystemAnnouncement() {
  668. Map<String, String> map = redisLikeService.getMessage();
  669. JSONObject obj = new JSONObject();
  670. obj.put("data", map);
  671. WebSocketServer.sendMessageToAll(SocketMsg.socketVo(Message.SYSTEM_ANNOUNCEMENT, obj));
  672. }
  673. }