CaoYaoYiZhuService.java 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314
  1. package thyyxxk.webserver.service.zhuyuanyisheng;
  2. import com.alibaba.fastjson.JSON;
  3. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  4. import com.baomidou.mybatisplus.core.metadata.IPage;
  5. import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
  6. import lombok.Getter;
  7. import lombok.extern.slf4j.Slf4j;
  8. import org.jetbrains.annotations.NotNull;
  9. import org.springframework.stereotype.Service;
  10. import thyyxxk.webserver.config.exception.ExceptionEnum;
  11. import thyyxxk.webserver.constants.GetDateFormat;
  12. import thyyxxk.webserver.constants.YesOrNo;
  13. import thyyxxk.webserver.dao.his.inpatient.XiangMuLuRuDao;
  14. import thyyxxk.webserver.dao.his.zhuyuanyisheng.CaoYaoYiZhuDao;
  15. import thyyxxk.webserver.dao.his.zhuyuanyisheng.YiZhuLuRuDao;
  16. import thyyxxk.webserver.entity.ResultVo;
  17. import thyyxxk.webserver.entity.datamodify.GetDropdownBox;
  18. import thyyxxk.webserver.entity.login.UserInfo;
  19. import thyyxxk.webserver.entity.zhuyuanyisheng.caoyaoyizhu.CaoYaoChaXunTiaoJian;
  20. import thyyxxk.webserver.entity.zhuyuanyisheng.caoyaoyizhu.YzActOrderCy;
  21. import thyyxxk.webserver.entity.zhuyuanyisheng.caoyaoyizhu.YzActOrderCyDetail;
  22. import thyyxxk.webserver.entity.zhuyuanyisheng.caoyaoyizhu.YzOrderPatternCy;
  23. import thyyxxk.webserver.entity.zhuyuanyisheng.yizhuluru.XinZhenYiZhu;
  24. import thyyxxk.webserver.entity.zhuyuanyisheng.yizhuluru.XinZhenYzActOrder;
  25. import thyyxxk.webserver.entity.zhuyuanyisheng.yizhuluru.YiZhuMingChen;
  26. import thyyxxk.webserver.service.PublicServer;
  27. import thyyxxk.webserver.service.hospitalizationCosts.HospitalizationCostsService;
  28. import thyyxxk.webserver.utils.*;
  29. import java.math.BigDecimal;
  30. import java.util.*;
  31. /**
  32. * <p>
  33. * 描述:
  34. * </p>
  35. *
  36. * @author xc
  37. * @date 2022-02-26 08:39
  38. */
  39. @Service
  40. @Slf4j
  41. public class CaoYaoYiZhuService {
  42. private final CaoYaoYiZhuDao dao;
  43. private final PublicServer publicServer;
  44. private final YiZhuLuRuDao yiZhuLuRuDao;
  45. private final YiZhuLuRuServer yiZhuLuRuServer;
  46. @Getter
  47. public enum CaoYaoEnumStatusFlag {
  48. 申请退药("T"),
  49. 删除("d"),
  50. 收费("2"),
  51. 配药中("3");
  52. private final String flag;
  53. CaoYaoEnumStatusFlag(String flag) {
  54. this.flag = flag;
  55. }
  56. }
  57. public CaoYaoYiZhuService(CaoYaoYiZhuDao dao,
  58. PublicServer publicServer,
  59. YiZhuLuRuDao yiZhuLuRuDao,
  60. YiZhuLuRuServer yiZhuLuRuServer) {
  61. this.dao = dao;
  62. this.publicServer = publicServer;
  63. this.yiZhuLuRuDao = yiZhuLuRuDao;
  64. this.yiZhuLuRuServer = yiZhuLuRuServer;
  65. }
  66. public ResultVo<List<YzActOrderCy>> huoQuCaoYaoShuJu(CaoYaoChaXunTiaoJian param) {
  67. QueryWrapper<?> qw = new QueryWrapper<>();
  68. qw.eq("inpatient_no", param.getPatNo());
  69. qw.eq("admiss_times", param.getTimes());
  70. qw.orderByDesc("input_date");
  71. if (StringUtil.notBlank(param.getStartTime())) {
  72. qw.ge("input_date", param.getStartTime());
  73. qw.le("input_date", param.getEndTime());
  74. }
  75. List<YzActOrderCy> list = dao.huoQuCaoYaoShuJu(qw);
  76. if (ListUtil.notBlank(list)) {
  77. for (YzActOrderCy item : list) {
  78. item.setDaiJianFei(item.getQuantityDj().multiply(item.getOrderJeDj()));
  79. item.setJiaGe(item.getQuantity().multiply(item.getOrderJe()));
  80. item.setZongJia(item.getDaiJianFei().add(item.getJiaGe()));
  81. }
  82. }
  83. return ResultVoUtil.success(list);
  84. }
  85. public ResultVo<List<YzActOrderCyDetail>> huoQuChaoYaoMingXi(BigDecimal orderNo) {
  86. return ResultVoUtil.success(dao.huoQuChaoYaoMingXi(orderNo));
  87. }
  88. public ResultVo<List<GetDropdownBox>> fuYongFangFa() {
  89. return ResultVoUtil.success(dao.fuYongFangFa());
  90. }
  91. public ResultVo<List<YiZhuMingChen>> huoQuCaoYao(String queryName, Integer groupNo) {
  92. String name = StringUtil.englishToCapital(queryName);
  93. QueryWrapper<?> qw = new QueryWrapper<>();
  94. qw.and(q -> q
  95. .like("py_code", name)
  96. .or()
  97. .like("name", name)
  98. .or()
  99. .like("d_code", name)
  100. .or()
  101. .like("code", name)
  102. )
  103. .eq("group_no", groupNo);
  104. return ResultVoUtil.success(dao.huoQuCaoYao(qw));
  105. }
  106. public ResultVo<IPage<YzOrderPatternCy>> huoQuMuBan(String queryName, String deptCode, long currentPage, long pageSize, long total) {
  107. IPage<YzOrderPatternCy> page = new Page<>(currentPage, pageSize, total == 0);
  108. String name = StringUtil.englishToCapital(queryName);
  109. QueryWrapper<?> qw = new QueryWrapper<>();
  110. qw.and(q -> q
  111. .like("py_code", name)
  112. .or()
  113. .like("d_code", name)
  114. .or()
  115. .like("pattern_name", name)
  116. );
  117. qw.groupBy("pattern_name");
  118. dao.huoQuMuBan(page, qw);
  119. return ResultVoUtil.success(page);
  120. }
  121. public ResultVo<List<YzOrderPatternCy>> muBanXiangQing(String name, String deptCode) {
  122. return ResultVoUtil.success(dao.muBanXiangQing(name, deptCode));
  123. }
  124. public ResultVo<Boolean> chongFuMuBanMing(String name) {
  125. return ResultVoUtil.success(dao.chongFuMuBanMing(name) > 1);
  126. }
  127. public ResultVo<String> cunMuBan(YzOrderPatternCy param) {
  128. log.info("插入模板草药模板:{}", JSON.toJSONString(param));
  129. String py = PingYinUtils.pyShouZiMuDaXie(param.getPatternName());
  130. if (py.length() > 7) {
  131. py = py.substring(0, 7);
  132. }
  133. String wb = PingYinUtils.getWBCode(param.getPatternName());
  134. if (wb.length() > 7) {
  135. wb = wb.substring(0, 7);
  136. }
  137. dao.chaRuMuBan(param.getList(), param.getPatternName(),
  138. TokenUtil.getInstance().getTokenUserId(), py, wb,
  139. param.getDeptCode());
  140. return ResultVoUtil.success(ExceptionEnum.SUCCESS_AND_EL_MESSAGE);
  141. }
  142. public ResultVo<Map<String, List<String>>> baoCunCaoYao(YzActOrderCy param) {
  143. if (ListUtil.isBlank(param.getList())) {
  144. return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, "请先选择需要上传的数据。");
  145. }
  146. // 药品 code
  147. Set<String> yaoPingCode = new HashSet<>(param.getList().size());
  148. publicServer.huanZheJieSuan(param.getInpatientNo(), param.getAdmissTimes());
  149. BigDecimal sum = new BigDecimal(0);
  150. for (YzActOrderCyDetail item : param.getList()) {
  151. sum = sum.add(item.getQuantity().multiply(item.getRetprice()));
  152. yaoPingCode.add(item.getChargeCode().trim() + item.getSerial().trim() + item.getGroupNo().trim());
  153. }
  154. XinZhenYiZhu patInfo = yiZhuLuRuDao.queryPatientInfo(param.getInpatientNo(), param.getAdmissTimes());
  155. Map<String, XinZhenYzActOrder> drug = yiZhuLuRuServer.getDrugInformation(yaoPingCode, patInfo.getZkWard());
  156. // 错误信息
  157. Map<String, List<String>> errorMap = new HashMap<>(param.getList().size());
  158. // 获取医生开药品的权限
  159. UserInfo userInfo = yiZhuLuRuDao.selectedUserInfoByCode(TokenUtil.getInstance().getTokenUserId());
  160. for (int i = 0; i < param.getList().size(); i++) {
  161. YzActOrderCyDetail item = param.getList().get(i);
  162. XinZhenYzActOrder feiYongXinXi = drug.get(item.getChargeCode().trim() + item.getSerial().trim() + item.getGroupNo().trim());
  163. List<String> errorMessage = limitation(feiYongXinXi, userInfo, item);
  164. if (ListUtil.notBlank(errorMessage)) {
  165. errorMap.put("第" + (i + 1) + "个,名称:" + item.getChargeCodeName(), errorMessage);
  166. }
  167. }
  168. if (!errorMap.isEmpty()) {
  169. return ResultVoUtil.fail(ExceptionEnum.ERROR_MESSAGE, "请修改有错误的数据。", errorMap);
  170. }
  171. param.setOrderJe(sum);
  172. param.setInputId(TokenUtil.getInstance().getTokenUserId());
  173. // 设置代煎费
  174. param.setOrderJeDj(dao.huoQuDaiJianFei());
  175. param.setPageNo(publicServer.getTheDrugListNo());
  176. XinZhenYiZhu huanZheXinXi = yiZhuLuRuDao.queryPatientInfo(param.getInpatientNo(), param.getAdmissTimes());
  177. param.setOrderNo(publicServer.getActOrderNo());
  178. try {
  179. // 生成草药和医嘱
  180. generateHerbs(param, huanZheXinXi);
  181. } catch (Exception e) {
  182. log.error("插入草药错误:{}", e.getMessage());
  183. dao.manualTransactions(param.getInpatientNo(), param.getAdmissTimes(), param.getOrderNo());
  184. return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, e.getMessage());
  185. }
  186. List<String> content = new ArrayList<>();
  187. content.add(String.format("草药医嘱名:<span style='color:#409eff'>【%s】</span><br>" +
  188. "剂数:<span style='color:#409eff'>【%s】</span><br>" +
  189. "患者名:<span style='color:#409eff'>【%s】<br></span>" +
  190. "床位:<span style='color:#409eff'>【%s】</span>", param.getOrderName(), param.getQuantity().toString(), huanZheXinXi.getName(), huanZheXinXi.getBedNo()));
  191. try {
  192. publicServer.faSongXiaoXi(huanZheXinXi, content, "新增草药或颗粒医嘱", TokenUtil.getInstance().getTokenUserId());
  193. } catch (Exception ignore) {
  194. }
  195. return ResultVoUtil.success(ExceptionEnum.SUCCESS_AND_EL_MESSAGE);
  196. }
  197. public void generateHerbs(YzActOrderCy param, XinZhenYiZhu huanZheXinXi) {
  198. dao.chaRuCaoYaoYiZhu(param, huanZheXinXi.getDeptCode(), huanZheXinXi.getDeptCode(), param.getExecDept());
  199. dao.chaRuCaoYaoXiangQing(param.getList(), param.getOrderNo());
  200. String orderName = param.getGroupNo().equals("81") ?
  201. "草药医嘱:" :
  202. "草药颗粒医嘱:" + param.getOrderName() + param.getQuantity() + "剂";
  203. dao.chaRuYiZhu(param, orderName,
  204. huanZheXinXi.getDeptCode(),
  205. huanZheXinXi.getDeptCode(),
  206. param.getExecDept(),
  207. PublicServer.getInfantFlag(huanZheXinXi.getInpatientNo()));
  208. }
  209. @NotNull
  210. private static List<String> limitation(XinZhenYzActOrder feiYongXinXi,
  211. UserInfo us,
  212. YzActOrderCyDetail item) {
  213. List<String> errorMessage = new ArrayList<>();
  214. if (feiYongXinXi == null) {
  215. errorMessage.add("没有找到药品信息,请联系药剂药房。");
  216. } else {
  217. if (feiYongXinXi.getDelFlag() == 1) {
  218. errorMessage.add("药品已经被停用了,请联系药剂科");
  219. }
  220. if (feiYongXinXi.getYpLevel() > us.getDoctorLevel()) {
  221. errorMessage.add("您没有开此药品的权限");
  222. }
  223. if (!"028".equals(feiYongXinXi.getBillItemZy()) && YesOrNo.YES.getCode().equals(us.getDoctorZy())) {
  224. errorMessage.add("您没有开此药品的权限,请联系医务部。");
  225. }
  226. if (BigUtils.bigDaYu(item.getQuantity(), feiYongXinXi.getStockAmount())) {
  227. errorMessage.add("药品领量大于药品的库存,当前库存量" + feiYongXinXi.getStockAmount().stripTrailingZeros().toPlainString());
  228. }
  229. if (feiYongXinXi.getDeptRestrictions() > 0) {
  230. errorMessage.add("该药品禁止在患者所在的科室使用。");
  231. }
  232. if (feiYongXinXi.getVisibleFlagZy() == 1) {
  233. errorMessage.add("该药品禁止住院患者使用。");
  234. }
  235. }
  236. return errorMessage;
  237. }
  238. /**
  239. * 删除草药模板
  240. * 管理员和有医嘱模板编辑,权限的可以直接删除
  241. * 科室主任有权限删除本科室的模板
  242. *
  243. * @param name 模板名称
  244. * @param deptCode 科室编码
  245. * @return 返回提示
  246. */
  247. public ResultVo<String> shanChuMuBan(String name, String deptCode) {
  248. YzOrderPatternCy mb = dao.caoYaoMuBanXiangQing(name);
  249. // 如果有这个权限直接删除
  250. if (publicServer.needRule(YiZhuPublicService.MU_BAN_BIAN_JI_QUAN_XIAN)) {
  251. // 本人创建的也可以直接删除
  252. if (mb.getCreateId().equals(TokenUtil.getInstance().getTokenUserId())) {
  253. return shanChuCaoYaoMuBan(name);
  254. }
  255. // 科主任 可以删除自己科室的模板
  256. if (publicServer.needRule(YiZhuPublicService.KE_ZHU_REN_BIAN_MA)) {
  257. if (mb.getDeptCode().trim().equals(deptCode)) {
  258. return shanChuCaoYaoMuBan(name);
  259. }
  260. }
  261. } else {
  262. return shanChuCaoYaoMuBan(name);
  263. }
  264. return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, "您没有权限删除。");
  265. }
  266. private ResultVo<String> shanChuCaoYaoMuBan(String name) {
  267. dao.shanChuMuBan(name);
  268. return ResultVoUtil.success(ExceptionEnum.SUCCESS_AND_EL_MESSAGE);
  269. }
  270. public ResultVo<String> shanChuCaoYao(String patNo, Integer times, BigDecimal orderNo) {
  271. YzActOrderCy cy = dao.caoYaoXinXi(patNo, times, orderNo);
  272. if (cy == null) {
  273. return ResultVoUtil.fail(ExceptionEnum.LOGICAL_ERROR, "没有查询到原来的信息。");
  274. }
  275. log.info("删除草药==》操作人:{}", TokenUtil.getInstance().getTokenUserId());
  276. String message;
  277. if (CaoYaoEnumStatusFlag.收费.getFlag().equals(cy.getStatusFlag())) {
  278. dao.genXingCaoYaoShanChuBiaoZhi(patNo, times, orderNo, CaoYaoEnumStatusFlag.删除.getFlag());
  279. dao.shanChuYiZhu(orderNo);
  280. message = "无需申请退药成功。";
  281. } else {
  282. dao.genXingCaoYaoShanChuBiaoZhi(patNo, times, orderNo, CaoYaoEnumStatusFlag.申请退药.getFlag());
  283. message = "申请退药成功。";
  284. }
  285. return ResultVoUtil.success(ExceptionEnum.SUCCESS_AND_EL_MESSAGE, message);
  286. }
  287. }