YiZhuLuRu.vue 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444
  1. <template>
  2. <el-container>
  3. <el-header>
  4. <el-date-picker
  5. v-model="dateRange"
  6. :shortcuts="shortcuts"
  7. end-placeholder="结束日期"
  8. placeholder="选择日期"
  9. range-separator="至"
  10. size="mini"
  11. start-placeholder="开始日期"
  12. style="width: 220px"
  13. type="daterange"
  14. >
  15. </el-date-picker>
  16. 医嘱名称:
  17. <el-select v-model="orderName" :remote-method="remoteMethodChargeCode" clearable filterable remote style="width: 120px">
  18. <el-option v-for="item in yiZhuMingZiData" :key="item.code" :label="item.name" :value="item.code">
  19. <span>{{ item.name }}</span>
  20. </el-option>
  21. </el-select>
  22. 频率:
  23. <el-select v-model="pinLv" :disabled="zhuangTai === 8 || zhuangTai === 9" clearable filterable size="mini" style="width: 120px">
  24. <el-option v-for="item in huanZhePinLvData" :key="item.code" :label="item.name" :value="item.code">
  25. <span>{{ item.name }}</span>
  26. </el-option>
  27. </el-select>
  28. 状态:
  29. <el-select v-model="zhuangTai" filterable size="mini" style="width: 120px" @change="zhuangTaiXuanZhe">
  30. <el-option v-for="item in zhuangTaiList" :key="item.code" :label="item.name" :value="item.code">
  31. <span>{{ item.code }}</span>
  32. <el-divider direction="vertical"></el-divider>
  33. <span>{{ item.name }}</span>
  34. </el-option>
  35. </el-select>
  36. <el-divider direction="vertical"></el-divider>
  37. <el-button icon="el-icon-search" type="primary" @click="chaXunYiZhuClick(0)">查询</el-button>
  38. <el-divider style="margin: 2px 0"></el-divider>
  39. <el-tag effect="dark" type="info">录入</el-tag>
  40. <el-tag effect="dark" type="success">确认</el-tag>
  41. <el-tag effect="dark">执行</el-tag>
  42. <el-tag effect="dark" type="danger">停止</el-tag>
  43. <el-divider direction="vertical"></el-divider>
  44. <el-button :disabled="huanZheXinXi.timesBilled === 1" icon="el-icon-plus" type="primary" @click="addYiZhuClick"> 添加 </el-button>
  45. <el-button
  46. :disabled="xuanZhongDeShuJu.length === 0"
  47. type="warning"
  48. @click="
  49. chaoZuoBiaoZhi = 90;
  50. yiZhuChaoZuoDialog = true;
  51. yiZhuChaoZuoBiaoTi = '批量停止';
  52. "
  53. >批量停止
  54. </el-button>
  55. <el-divider direction="vertical"></el-divider>
  56. <el-button :disabled="xuanZhongDeShuJu.length === 0" type="success" @click="dianJiFuZhuXuanZhongYiZhu">复制选中医嘱 </el-button>
  57. </el-header>
  58. <el-main>
  59. <el-table
  60. ref="tableRef"
  61. :data="yiZhuPage.data"
  62. :height="windowSize.h / 1.5"
  63. :row-class-name="differChildrenRows"
  64. border
  65. class="eltable"
  66. highlight-current-row
  67. row-key="actOrderNo"
  68. @selection-change="huoQuXuanZhongDeShuJu"
  69. @select-all="quanXuanYiZhu"
  70. >
  71. <el-table-column fixed="left" type="index"></el-table-column>
  72. <el-table-column fixed="left" type="selection"></el-table-column>
  73. <el-table-column fixed="left" label="医嘱号" prop="actOrderNo" width="120">
  74. <template #default="scope">
  75. <el-tag :type="getYiZhuFlag(scope.row.statusFlag)" effect="dark">{{ scope.row.actOrderNo }} </el-tag>
  76. </template>
  77. </el-table-column>
  78. <el-table-column fixed="left" label="医嘱名称" prop="orderName" show-overflow-tooltip width="135"></el-table-column>
  79. <el-table-column label="剂量" prop="doseUnitName">
  80. <template #default="scope">
  81. <span>{{ scope.row.dose }} {{ scope.row.doseUnitName }}</span>
  82. </template>
  83. </el-table-column>
  84. <el-table-column label="频率" prop="frequCodeName"></el-table-column>
  85. <el-table-column label="给药方式" prop="supplyCodeName" show-overflow-tooltip></el-table-column>
  86. <el-table-column label="医嘱时间" prop="orderTime" show-overflow-tooltip></el-table-column>
  87. <el-table-column label="开始时间" prop="startTime" show-overflow-tooltip></el-table-column>
  88. <el-table-column label="录入人" prop="physicianName"></el-table-column>
  89. <el-table-column label="确认时间" prop="confirmTime" show-overflow-tooltip></el-table-column>
  90. <el-table-column label="确认人" prop="signerName"></el-table-column>
  91. <el-table-column label="结束时间" prop="endTime" show-overflow-tooltip></el-table-column>
  92. <el-table-column label="停止人" prop="modifierName" show-overflow-tooltip></el-table-column>
  93. <el-table-column label="紧急" prop="emergencyFlag">
  94. <template #default="scope">
  95. <span v-if="scope.row.emergencyFlag === '1'">是</span>
  96. </template>
  97. </el-table-column>
  98. <el-table-column label="医保自费" prop="ybSelfFlag">
  99. <template #default="scope">
  100. <span v-if="scope.row.ybSelfFlag === '1'">是</span>
  101. </template>
  102. </el-table-column>
  103. <el-table-column label="医生" prop="physicianName"></el-table-column>
  104. <el-table-column label="费用标志" prop="selfBuyName"></el-table-column>
  105. <el-table-column label="执行科室" prop="execUnitName"></el-table-column>
  106. <el-table-column label="领量" prop="drugQuanName">
  107. <template #default="scope">
  108. <span>{{ scope.row.drugQuan }} {{ scope.row.drugQuanName }}</span>
  109. </template>
  110. </el-table-column>
  111. <el-table-column label="类别" prop="drugFlagName">
  112. <template #default="scope">
  113. <span>{{ scope.row.drugFlag }} {{ scope.row.drugFlagName }}</span>
  114. </template>
  115. </el-table-column>
  116. <el-table-column label="药房" prop="groupNoName"></el-table-column>
  117. <el-table-column label="序号" prop="serialName"></el-table-column>
  118. <el-table-column fixed="right" label="操作" width="150">
  119. <template #default="scope">
  120. <el-dropdown :hide-on-click="false" size="small" split-button type="primary">
  121. 操作
  122. <template #dropdown>
  123. <el-dropdown-menu>
  124. <el-dropdown-item :disabled="scope.row.statusFlag === '5'" @click="dianJiYiZhuChaoZuo(scope.row, 1)">
  125. <span v-if="scope.row.emergencyFlag === '1'">取消紧急</span>
  126. <span v-else>设为紧急</span>
  127. </el-dropdown-item>
  128. <el-dropdown-item @click="dianJiYiZhuChaoZuo(scope.row, 2, '撤销医嘱')"> 撤销医嘱 </el-dropdown-item>
  129. <el-dropdown-item @click="dianJiYiZhuChaoZuo(scope.row, 3, '停止医嘱')"> 停止医嘱 </el-dropdown-item>
  130. </el-dropdown-menu>
  131. </template>
  132. </el-dropdown>
  133. </template>
  134. </el-table-column>
  135. </el-table>
  136. <el-pagination
  137. :current-page="yiZhuPage.currentPage"
  138. :page-size="yiZhuPage.pageSize"
  139. :page-sizes="[10, 20, 30, 40, 50]"
  140. :total="yiZhuPage.total"
  141. layout="total, sizes, prev, pager, next, jumper"
  142. @size-change="handleSizeChange"
  143. @current-change="handleCurrentChange"
  144. >
  145. </el-pagination>
  146. </el-main>
  147. <el-dialog v-model="yiZhuChaoZuoDialog" :close-on-click-modal="false" :close-on-press-escape="false" :show-close="false" :title="yiZhuChaoZuoBiaoTi" top="25%" width="30%">
  148. <div v-if="chaoZuoBiaoZhi === 2">
  149. 撤销原因:
  150. <el-input v-model="content" maxlength="100" rows="2" show-word-limit type="textarea"></el-input>
  151. </div>
  152. <div v-else-if="chaoZuoBiaoZhi === 3 || chaoZuoBiaoZhi === 90">
  153. 停止时间点:
  154. <el-date-picker v-model="tingZhiRiQi" format="YYYY-MM-DD HH:mm:ss" type="datetime" value-format="YYYY-MM-DD HH:mm:ss"> </el-date-picker>
  155. </div>
  156. <template #footer>
  157. <span class="dialog-footer">
  158. <el-button
  159. @click="
  160. yiZhuChaoZuoDialog = false;
  161. content = '';
  162. "
  163. >关闭</el-button
  164. >
  165. <el-button type="primary" @click="zhiXingChaoZuo">确认</el-button>
  166. </span>
  167. </template>
  168. </el-dialog>
  169. </el-container>
  170. </template>
  171. <script name="YiZhuLuRuZhuJian" setup>
  172. import { shortcuts } from '@/data/shortcuts';
  173. import { huoQuYiZhuMingCheng, huoQuYiZhuShuJu, piLiangXiuGaiTingZhiShiJian, yiZhuChaoZuo } from '@/api/zhu-yuan-yi-sheng/yi-zhu-lu-ru';
  174. import { fuZhiYiZhu, huanZhePinLvData, huanZheXinXi, youWuXuanZheHuanZhe } from '../public-js/zhu-yuan-yi-sheng';
  175. import { getDateRangeFormatDate, getFormatDatetime } from '@/utils/date';
  176. import store from '@/store';
  177. import { stringIsBlank, stringNotBlank } from '@/utils/blank-utils';
  178. import { getServerDateApi } from '@/api/public-api';
  179. import router from '@/router';
  180. const windowSize = computed(() => {
  181. return store.state.app.windowSize;
  182. });
  183. const user = computed(() => {
  184. return store.state.user.info;
  185. });
  186. const dateRange = ref([]);
  187. // 根据医嘱的名字来进行搜索
  188. let orderName = $ref('');
  189. const yiZhuMingZiData = ref([]);
  190. // 获取频率
  191. const pinLv = ref('');
  192. // 状态
  193. const zhuangTai = ref(0);
  194. // 分页
  195. const yiZhuPage = ref({
  196. currentPage: 1,
  197. pageSize: 30,
  198. total: 0,
  199. data: [],
  200. });
  201. const tableRef = ref(null);
  202. const remoteMethodChargeCode = (val) => {
  203. if (youWuXuanZheHuanZhe()) return;
  204. if (val.length > 1) {
  205. huoQuYiZhuMingCheng(huanZheXinXi.value.inpatientNo, huanZheXinXi.value.admissTimes, val).then((res) => {
  206. yiZhuMingZiData.value = res;
  207. });
  208. }
  209. };
  210. // 根据医嘱的名字来进行搜索 结束
  211. const zhuangTaiList = ref([
  212. { code: 0, name: '全部' },
  213. { code: 1, name: '录入' },
  214. { code: 2, name: '确认' },
  215. { code: 3, name: '执行' },
  216. { code: 5, name: '停止' },
  217. { code: 6, name: '可停止' },
  218. { code: 7, name: '可撤销' },
  219. { code: 8, name: '临时医嘱' },
  220. { code: 9, name: '长期医嘱' },
  221. ]);
  222. const zhuangTaiXuanZhe = (val) => {
  223. if (val >= 6) {
  224. orderName = '';
  225. pinLv.value = '';
  226. }
  227. };
  228. const chaXunYiZhuClick = (total) => {
  229. if (youWuXuanZheHuanZhe()) return;
  230. const dateS = getDateRangeFormatDate(dateRange.value);
  231. let data = {
  232. currentPage: yiZhuPage.value.currentPage,
  233. pageSize: yiZhuPage.value.pageSize,
  234. total: total,
  235. patNo: huanZheXinXi.value.inpatientNo,
  236. times: huanZheXinXi.value.admissTimes,
  237. startTime: dateS.startTime,
  238. endTime: dateS.endTime,
  239. frequCode: pinLv.value,
  240. orderName: orderName,
  241. zhuangTai: zhuangTai.value,
  242. };
  243. huoQuYiZhuShuJu(data)
  244. .then((res) => {
  245. yiZhuPage.value.total = res.total;
  246. yiZhuPage.value.data = res.records;
  247. })
  248. .catch((e) => {
  249. yiZhuPage.value.total = 0;
  250. yiZhuPage.value.data = [];
  251. });
  252. };
  253. const handleSizeChange = (val) => {
  254. yiZhuPage.value.pageSize = val;
  255. chaXunYiZhuClick(yiZhuPage.value.total);
  256. };
  257. const handleCurrentChange = (val) => {
  258. yiZhuPage.value.currentPage = val;
  259. chaXunYiZhuClick(yiZhuPage.value.total);
  260. };
  261. /* 添加子医嘱的背景颜色 */
  262. const differChildrenRows = ({ row }) => {
  263. if (row.isChildren) {
  264. return 'children-row';
  265. }
  266. };
  267. /**
  268. * 下面这里是添加医嘱了
  269. */
  270. const addYiZhuClick = () => {
  271. router.push({
  272. name: 'xinZengShuJu',
  273. params: {
  274. passRule: true,
  275. name: '添加医嘱',
  276. },
  277. query: {
  278. path: '/inpatient/zhuYuanYiSheng/yiZhuLuRu',
  279. },
  280. });
  281. };
  282. const dianJiYiZhuChaoZuo = ({ actOrderNo, orderName }, flag, name) => {
  283. chaoZuoBiaoZhi.value = flag;
  284. yiZhuHao.value = actOrderNo;
  285. if (flag === 1) {
  286. zhiXingChaoZuo();
  287. } else {
  288. yiZhuChaoZuoDialog = true;
  289. if (flag === 2) {
  290. yiZhuChaoZuoBiaoTi = '撤销医嘱';
  291. } else if (flag === 3) {
  292. yiZhuChaoZuoBiaoTi = '停止医嘱';
  293. }
  294. }
  295. };
  296. const zhiXingChaoZuo = () => {
  297. if (chaoZuoBiaoZhi.value === 90) {
  298. let data = {
  299. actOrderNoList: [],
  300. endTime: tingZhiRiQi.value,
  301. };
  302. xuanZhongDeShuJu.value.forEach((item) => {
  303. data.actOrderNoList.push(item.actOrderNo);
  304. });
  305. piLiangXiuGaiTingZhiShiJian(data).then((res) => {
  306. handleCurrentChange(yiZhuPage.value.currentPage);
  307. yiZhuChaoZuoDialog = false;
  308. });
  309. } else {
  310. let data = '';
  311. if (chaoZuoBiaoZhi.value === 2) {
  312. data = content.value;
  313. } else if (chaoZuoBiaoZhi.value === 3) {
  314. data = tingZhiRiQi.value;
  315. }
  316. yiZhuChaoZuo(yiZhuHao.value, chaoZuoBiaoZhi.value, data).then((res) => {
  317. handleCurrentChange(yiZhuPage.value.currentPage);
  318. yiZhuChaoZuoDialog = false;
  319. content.value = '';
  320. });
  321. }
  322. };
  323. let yiZhuChaoZuoDialog = $ref(false);
  324. const content = ref('');
  325. const tingZhiRiQi = ref('');
  326. const chaoZuoBiaoZhi = ref(0);
  327. const yiZhuHao = ref(0);
  328. let yiZhuChaoZuoBiaoTi = $ref('');
  329. const xuanZhongDeShuJu = ref([]);
  330. const huoQuXuanZhongDeShuJu = (val) => {
  331. xuanZhongDeShuJu.value = val;
  332. };
  333. // 用户切换全选和全不选 时 el-table中的全选不会选中子节点
  334. const toggleSelection = (row, selected) => {
  335. if (row) {
  336. row.forEach((item) => {
  337. tableRef.value.toggleRowSelection(item, selected);
  338. });
  339. }
  340. };
  341. /**
  342. * 切换全选和不全选
  343. * @type {boolean}
  344. */
  345. let quanXuanFlag = false; // 默认 为全不选
  346. const quanXuanYiZhu = (selection) => {
  347. quanXuanFlag = !quanXuanFlag;
  348. selection.forEach((item) => {
  349. if (stringNotBlank(item.children)) {
  350. toggleSelection(item.children, quanXuanFlag);
  351. }
  352. });
  353. if (!quanXuanFlag) {
  354. tableRef.value.clearSelection();
  355. }
  356. };
  357. /**
  358. * 点击复制医嘱
  359. */
  360. const dianJiFuZhuXuanZhongYiZhu = () => {
  361. fuZhiYiZhu.value = xuanZhongDeShuJu.value;
  362. };
  363. onActivated(() => {
  364. getServerDateApi().then((res) => {
  365. dateRange.value[0] = getFormatDatetime(res, 'YYYY-MM-DD');
  366. dateRange.value[1] = getFormatDatetime(res, 'YYYY-MM-DD');
  367. chaXunYiZhuClick(0);
  368. });
  369. });
  370. watch(
  371. () => huanZheXinXi.value,
  372. () => {
  373. getServerDateApi().then((res) => {
  374. if (dateRange.value === null) {
  375. dateRange.value = [];
  376. dateRange.value.push(getFormatDatetime(res, 'YYYY-MM-DD'));
  377. dateRange.value.push(getFormatDatetime(res, 'YYYY-MM-DD'));
  378. } else {
  379. dateRange.value[0] = getFormatDatetime(res, 'YYYY-MM-DD');
  380. dateRange.value[1] = getFormatDatetime(res, 'YYYY-MM-DD');
  381. }
  382. chaXunYiZhuClick(0);
  383. });
  384. }
  385. );
  386. function getYiZhuFlag(val) {
  387. if (stringIsBlank(val)) {
  388. return 'warning';
  389. }
  390. switch (val) {
  391. case '1':
  392. return 'info';
  393. case '2':
  394. return 'success';
  395. case '3':
  396. return '';
  397. case '4':
  398. return '';
  399. case '5':
  400. return 'danger';
  401. default:
  402. return 'warning';
  403. }
  404. }
  405. </script>
  406. <style scoped>
  407. :deep(.el-table .children-row) {
  408. background: rgba(145, 247, 145, 0.93);
  409. }
  410. :deep(.el-table) {
  411. --el-table-row-hover-background-color: #85dbfd7a;
  412. }
  413. :deep(.el-dropdown-menu__item) {
  414. font-size: 14px !important;
  415. height: 26px;
  416. line-height: 26px;
  417. font-weight: bold;
  418. }
  419. </style>