index.vue 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352
  1. <template>
  2. <div class="m-4">
  3. <div>
  4. <XTTitle title="查房" @click="callTitleClick" />
  5. <div class="flex justify-between my-4">
  6. <XTTab
  7. type="check"
  8. :width="160"
  9. :selected="activeKey"
  10. :data="tabData"
  11. @item-click="callTab"
  12. />
  13. <XTForm :form-data="formData" @change="callFormChange" @click="callFormClick" />
  14. </div>
  15. <div class="flex mb-2" v-if="siftData.length">
  16. <Sift :data="siftData" />
  17. </div>
  18. <BasicTable @register="registerTable">
  19. <template #bodyCell="{ column, record }">
  20. <template v-if="column.key === 'name'">
  21. <span :class="['table-dot', 'table-dot--' + record.status]" />
  22. <span :title="record.name">{{ record.name }}</span>
  23. </template>
  24. <template v-if="column.dataIndex === 'updatorName'">
  25. <Image
  26. v-if="record.updateAvatar"
  27. :src="record.updateAvatar"
  28. style="width: 20; height: 20px"
  29. />
  30. {{ record.updatorName }}
  31. </template>
  32. <template v-if="column.key === 'gender'">
  33. <Icon
  34. v-if="record.gender == 'pb_sex_man'"
  35. icon="icon-xt-male_sm|iconfont"
  36. color="#0057FF"
  37. />
  38. <Icon
  39. v-if="record.gender == 'pb_sex_woman'"
  40. icon="icon-xt-female_sm|iconfont"
  41. color="#FF0066"
  42. />({{ record.age }})</template
  43. >
  44. <template v-if="column.key === 'patrolTime'">
  45. {{ record.patrolTime ? dayjs(record.patrolTime).format('YYYY-MM-DD') : '' }}
  46. </template>
  47. <template v-if="column.key === 'action'">
  48. <TableAction
  49. :dropDownActions="[
  50. {
  51. auth: 'storage:config:query',
  52. tooltip: '查房记录',
  53. label: '查房记录',
  54. onClick: handleDetail.bind(null, record),
  55. },
  56. {
  57. auth: 'archives:patrolWard:edit',
  58. tooltip: '编辑',
  59. label: '编辑',
  60. onClick: handleEdit.bind(null, record),
  61. },
  62. {
  63. auth: 'archives:patrolWard:followOrNo',
  64. tooltip: '关注',
  65. label: '关注',
  66. ifShow: record.status > 1,
  67. popConfirm: {
  68. title: '是否确定要关注?',
  69. placement: 'left',
  70. confirm: handleCancel.bind(null, record),
  71. },
  72. },
  73. {
  74. auth: 'archives:patrolWard:followOrNo',
  75. tooltip: '取消关注',
  76. label: '取消关注',
  77. ifShow: record.status == 1,
  78. popConfirm: {
  79. title: '是否确定要取消关注?',
  80. placement: 'left',
  81. confirm: handleClick.bind(null, record),
  82. },
  83. },
  84. ]"
  85. :actions="[
  86. {
  87. auth: 'archives:patrolWard:query',
  88. icon: 'icon-xt-ward_default|iconfont',
  89. tooltip: '查房',
  90. onClick: handleView.bind(null, record),
  91. },
  92. ]"
  93. />
  94. </template>
  95. </template>
  96. </BasicTable>
  97. </div>
  98. <FormModal @register="registerModal" @success="handleSuccess" />
  99. <ViewDrawer @register="registerDrawerView" @success="handleSuccess" />
  100. </div>
  101. </template>
  102. <script setup lang="ts">
  103. import { XTTitle } from '/@/components/XTTitle/index';
  104. import { XTTab } from '/@/components/XTTab/index';
  105. import { XTForm } from '/@/components/XTForm/index';
  106. import { Icon } from '/@/components/Icon';
  107. import { Image } from 'ant-design-vue';
  108. import { BasicTable, useTable, TableAction } from '/@/components/TableCard';
  109. import { checkColumns, BasicTabActive, BasicTab } from './data';
  110. import { ref } from 'vue';
  111. import { useRouter } from 'vue-router';
  112. import {
  113. checkQueryCheckRoomRecord,
  114. checkQueryPersonNumber,
  115. checkFollowOrNo,
  116. } from '/@/api/biz/visit/checkApi';
  117. import { onMounted, reactive } from 'vue';
  118. import dayjs from 'dayjs';
  119. import { useModal } from '/@/components/Modal';
  120. import FormModal from './formModal.vue';
  121. import ViewDrawer from './viewDrawer.vue';
  122. import { useDrawer } from '@/components/Drawer';
  123. import { useMessage } from '/@/hooks/web/useMessage';
  124. // const bizDictOptions = reactive<any>({});
  125. //路由跳转
  126. const router = useRouter();
  127. const activeKey = ref(BasicTabActive);
  128. const tabData = ref(BasicTab);
  129. const [registerModal, { openModal }] = useModal();
  130. const [registerDrawerView, { openDrawer, openDrawer: openDrawerView }] = useDrawer();
  131. onMounted(async () => {
  132. getTab();
  133. console.log('🚀 ~ file: index.vue:118 ~ onMounted ~ tabData.value:', tabData.value);
  134. });
  135. const [registerTable, { reload, clearSelectedRowKeys }] = useTable({
  136. api: checkQueryCheckRoomRecord,
  137. // exportAuthList: ['sys:log:export'],
  138. rowKey: 'id',
  139. columns: checkColumns,
  140. showIndexColumn: true,
  141. bordered: true,
  142. actionColumn: {
  143. width: 200,
  144. title: '操作',
  145. dataIndex: 'action',
  146. },
  147. beforeFetch: handleBeforeFetch,
  148. afterFetch: handleAfterFetch,
  149. });
  150. // 筛选数据
  151. const siftData = ref([]);
  152. // formdata
  153. const formData = [
  154. {
  155. name: 'tableSort',
  156. componentType: 'Select',
  157. placeholder: '请选择',
  158. width: 120,
  159. defaultValue: 'st_patrol_time',
  160. dicts: [
  161. { label: '按查房时间', value: 'st_patrol_time' },
  162. { label: '按姓氏', value: 'st_family_name' },
  163. ],
  164. },
  165. {
  166. name: 'name',
  167. componentType: 'Input',
  168. placeholder: '请输入患者姓名',
  169. width: 200,
  170. prefix: 'icon-xt-search',
  171. },
  172. ];
  173. const formValue = reactive({
  174. name: '',
  175. tableSort: 'st_patrol_time',
  176. }) as any;
  177. async function getTab() {
  178. const personNumber = await checkQueryPersonNumber();
  179. console.log('🚀 ~ file: index.vue:104 ~ onMounted ~ stats:', personNumber);
  180. tabData.value = tabData.value.map(ele => {
  181. if (ele.key == '0') {
  182. ele.value = personNumber.all;
  183. }
  184. if (ele.key == '1') {
  185. ele.value = personNumber.attention;
  186. }
  187. if (ele.key == '2') {
  188. ele.value = personNumber.newPatient;
  189. }
  190. if (ele.key == '3') {
  191. ele.value = personNumber.dialysisPatients;
  192. }
  193. if (ele.key == '4') {
  194. ele.value = personNumber.noDialysisPatients;
  195. }
  196. return ele;
  197. });
  198. }
  199. // 表格请求之前,对参数进行处理, 添加默认 排序
  200. function handleBeforeFetch(params) {
  201. return {
  202. ...params,
  203. patientType: activeKey.value == '0' ? '0' : activeKey.value,
  204. name: formValue.name,
  205. orders: [],
  206. sortType: formValue.tableSort,
  207. };
  208. }
  209. function handleAfterFetch(data) {
  210. // data.forEach(item => {
  211. // item.status = 2;
  212. // });
  213. return data;
  214. }
  215. // 详情按钮事件
  216. function handleView(record: Recordable) {
  217. console.log(record);
  218. openDrawerView(true, {
  219. record,
  220. });
  221. }
  222. //查房记录事件
  223. function handleDetail(record: Recordable) {
  224. router.push({
  225. path: '../../bizArchives/detail',
  226. query: {
  227. id: record.id,
  228. accessId: record.accessId,
  229. name: record.name,
  230. gender: record.gender,
  231. age: record.age,
  232. activeKeys: 5,
  233. },
  234. });
  235. }
  236. // 编辑按钮事件
  237. function handleEdit(record: Recordable) {
  238. openModal(true, {
  239. record,
  240. isUpdate: true,
  241. });
  242. }
  243. // 取消按钮事件
  244. const { createMessage } = useMessage();
  245. async function handleCancel(record: Recordable) {
  246. await checkFollowOrNo(record.patientBasicId);
  247. createMessage.success('关注成功!');
  248. clearSelectedRowKeys();
  249. await getTab();
  250. await reload();
  251. }
  252. async function handleClick(record: Recordable) {
  253. await checkFollowOrNo(record.patientBasicId);
  254. createMessage.success('取消关注成功!');
  255. clearSelectedRowKeys();
  256. await getTab();
  257. await reload();
  258. }
  259. // 弹窗回调事件
  260. async function handleSuccess({ isUpdate, values }) {
  261. console.log(isUpdate);
  262. console.log(values);
  263. await getTab();
  264. await reload();
  265. }
  266. // 回调
  267. async function callTab(data) {
  268. activeKey.value = data.value;
  269. await getTab();
  270. await reload();
  271. }
  272. function callTitleClick(data) {
  273. if (data.type == 'add') {
  274. openDrawer(true, {
  275. isUpdate: false,
  276. record: data,
  277. });
  278. }
  279. }
  280. async function callFormChange(data) {
  281. formValue.name = data.name ? data.name : '';
  282. // formValue.patientName = data.patientName ? data.patientName : '';
  283. formValue.tableSort = data.tableSort ? data.tableSort : '';
  284. await getTab();
  285. await reload();
  286. }
  287. async function callFormClick(data) {
  288. if (data.name == 'filter') {
  289. const record = [];
  290. siftData.value.forEach(ele => {
  291. const obj = {
  292. field: ele.field,
  293. value: ele.value,
  294. } as any;
  295. if (ele.isDict) {
  296. obj.value = ele.dict;
  297. }
  298. record.push(obj);
  299. });
  300. openDrawer(true, {
  301. record,
  302. });
  303. }
  304. }
  305. </script>
  306. <style lang="less" scoped>
  307. .table-dot {
  308. display: inline-block;
  309. width: 10px;
  310. height: 10px;
  311. margin-right: 6px;
  312. border-radius: 50%;
  313. &--1 {
  314. background-color: #3cf;
  315. }
  316. &--2 {
  317. background-color: #f7b500;
  318. }
  319. &--3 {
  320. background-color: #d3d8dd;
  321. }
  322. &--4 {
  323. background-color: #1bc1b3;
  324. }
  325. }
  326. ::v-deep(.ant-btn-link) {
  327. color: rgb(61 65 85 / 100%);
  328. }
  329. </style>