index.vue 9.7 KB

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