CaoYaoYiZhuService.java 13 KB

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