patientInspectLogDetail.vue 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585
  1. <template>
  2. <view class="incidentDetail">
  3. <view class="head">
  4. <view class="tab" :class="{active: tab.value === dataInfo.tabActiveValue}" v-for="tab in dataInfo.tabs" :key="tab.id" @click="clickTab(tab.value)">
  5. {{tab.name}}<text v-if="tab.num !== ''">({{tab.num}})</text>
  6. </view>
  7. </view>
  8. <scroll-view scroll-y class="body">
  9. <!-- 基本信息 -->
  10. <template v-if="dataInfo.tabActiveValue === '1'">
  11. <view class="detail_head">
  12. <text class="title">基本信息</text>
  13. <view class="other">
  14. <view class="status">{{dataInfo.patientInspectLogData.state ? dataInfo.patientInspectLogData.state.name : ''}}</view>
  15. </view>
  16. </view>
  17. <view class="detail_item_wrap">
  18. <view class="deital_item">
  19. <text class="name">患者科室:</text>
  20. <text class="value">{{dataInfo.patientInspectLogData.deptName}}</text>
  21. </view>
  22. <view class="deital_item">
  23. <text class="name">患者姓名:</text>
  24. <text class="value">{{dataInfo.patientInspectLogData.patientName}}</text>
  25. <text class="value text_value">年龄:<text v-if="dataInfo.patientInspectLogData.age !== undefined">{{dataInfo.patientInspectLogData.age }}岁</text></text>
  26. </view>
  27. <view class="deital_item">
  28. <text class="name">住院号:</text>
  29. <text class="value">{{dataInfo.patientInspectLogData.patientCode}}</text>
  30. <text class="value text_value">床号:{{dataInfo.patientInspectLogData.bedNum }}</text>
  31. </view>
  32. <view class="deital_item">
  33. <text class="name">护理等级:</text>
  34. <text class="value">{{dataInfo.patientInspectLogData.careLevel ? dataInfo.patientInspectLogData.careLevel.name : ''}}</text>
  35. <text class="value text_value">危重等级:{{dataInfo.patientInspectLogData.illnessState ? dataInfo.patientInspectLogData.illnessState.name : ''}}</text>
  36. </view>
  37. </view>
  38. <view class="detail_head">
  39. <text class="title">陪检信息</text>
  40. </view>
  41. <view class="detail_item_wrap">
  42. <view class="deital_item">
  43. <text class="name">陪检方式:</text>
  44. <text class="value">{{dataInfo.patientInspectLogData.tripTypeDTO ? dataInfo.patientInspectLogData.tripTypeDTO.inspectMode : ''}}</text>
  45. </view>
  46. <view class="deital_item">
  47. <text class="name">携带设备:</text>
  48. <text class="value">{{dataInfo.patientInspectLogData.goodsList | filterNames('name')}}</text>
  49. </view>
  50. <view class="deital_item">
  51. <text class="name">出科时间:</text>
  52. <text class="value">{{dataInfo.patientInspectLogData.outDeptTime | formatDate('yyyy-MM-dd hh:mm')}}</text>
  53. </view>
  54. <view class="deital_item">
  55. <text class="name">出科人:</text>
  56. <text class="value">{{dataInfo.patientInspectLogData.outDeptUserDTO ? dataInfo.patientInspectLogData.outDeptUserDTO.name : ''}}</text>
  57. </view>
  58. </view>
  59. <view class="detail_head">
  60. <text class="title">最新操作</text>
  61. </view>
  62. <view class="detail_item_wrap">
  63. <view class="deital_item">
  64. <text class="name">签到时间:</text>
  65. <text class="value">{{dataInfo.patientInspectLogData.signTime | formatDate('yyyy-MM-dd hh:mm')}}</text>
  66. </view>
  67. <view class="deital_item">
  68. <text class="name">签到人:</text>
  69. <text class="value">{{dataInfo.patientInspectLogData.signUserDTO ? dataInfo.patientInspectLogData.signUserDTO.name : ''}}</text>
  70. </view>
  71. <view class="deital_item">
  72. <text class="name">签到科室:</text>
  73. <text class="value">{{dataInfo.patientInspectLogData.signDeptDTO ? dataInfo.patientInspectLogData.signDeptDTO.dept : ''}}</text>
  74. </view>
  75. </view>
  76. <view class="detail_head">
  77. <text class="title">回科信息</text>
  78. </view>
  79. <view class="detail_item_wrap">
  80. <view class="deital_item">
  81. <text class="name">回科时间:</text>
  82. <text class="value">{{dataInfo.patientInspectLogData.backDeptTime | formatDate('yyyy-MM-dd hh:mm')}}</text>
  83. </view>
  84. <view class="deital_item">
  85. <text class="name">回科人:</text>
  86. <text class="value">{{dataInfo.patientInspectLogData.backDeptUserDTO ? dataInfo.patientInspectLogData.backDeptUserDTO.name : ''}}</text>
  87. </view>
  88. </view>
  89. </template>
  90. <!-- 检查信息 -->
  91. <template v-if="dataInfo.tabActiveValue === '2'">
  92. <view class="info">
  93. <view v-for="item in dataInfo.valueList" :key="item.id" class="infoItem">
  94. <view class="name">检查项目:<text class="fwb">{{item.inspectName}}</text></view>
  95. <view class="name">检查单号:<text>{{item.inspectCode}}</text></view>
  96. <view class="name">状态:<text>{{item.inspectState ? item.inspectState.name : ''}}</text></view>
  97. <view class="name">检查地点:<text>{{item.execDept ? item.execDept.dept : ''}}</text></view>
  98. </view>
  99. </view>
  100. </template>
  101. <!-- 流程图 -->
  102. <template v-if="dataInfo.tabActiveValue === '3'">
  103. <view class="process_item_wrap">
  104. <view class="process_item" v-for="item in dataInfo.logList" :key="item.id">
  105. <view class="process_item_top">
  106. <view class="name">{{item.operationType ? item.operationType.name : '' }}</view>
  107. <view class="value" v-if="item.remark">({{item.remark}})</view>
  108. </view>
  109. <view class="process_item_bottom">
  110. <text class="name">{{item.operationTime | formatDate('yyyy-MM-dd hh:mm')}}</text>
  111. <text class="value" v-if="item.username">{{item.username}}</text>
  112. </view>
  113. </view>
  114. </view>
  115. </template>
  116. </scroll-view>
  117. <view class="foot_common_btns">
  118. <button @click="goBack()" type="default" class="primaryButton btn gray">返回</button>
  119. <button v-if="dataInfo.from == 'patientInpectLogList' && dataInfo.patientInspectLogData.state && dataInfo.patientInspectLogData.state.value === '4'" @click="tagClick(dataInfo.patientInspectLogData)" type="default" class="primaryButton btn">标记回科</button>
  120. </view>
  121. <!-- 弹窗 -->
  122. <showModel :title="models.title" :icon="models.icon" :disjunctor="models.disjunctor" :content="models.content" @ok="ok" @cancel="cancel" @know="know" :operate="models.operate"></showModel>
  123. </view>
  124. </template>
  125. <script>
  126. import { get, post, SM, deleteIt, webHandle } from "../../http/http.js";
  127. export default {
  128. data(){
  129. return {
  130. selectData: {},
  131. // 弹窗model
  132. models: {
  133. disjunctor: false,
  134. },
  135. dataInfo: {
  136. tabs: [
  137. {id: 1, name: '基本信息', value: '1', num: ''},
  138. {id: 2, name: '检查信息', value: '2', num: ''},
  139. {id: 3, name: '流程信息', value: '3', num: ''},
  140. ],
  141. tabActiveValue: 1,//当前选择的tab
  142. patientInspectLogId: undefined,//闭环ID
  143. patientInspectLogData: {},//闭环对象
  144. valueList: [],//检查信息
  145. logList: [],//流程图
  146. from: '',//跳转来源
  147. }
  148. }
  149. },
  150. methods: {
  151. // 标记回科
  152. tagClick(data){
  153. this.selectData = data;
  154. this.models = {
  155. disjunctor: true,
  156. title: "提示",
  157. content: `您确认${data.patientName}患者已回科吗?`,
  158. icon: "warn",
  159. operate: {
  160. ok: "确定",
  161. cancel: "取消",
  162. },
  163. };
  164. },
  165. //确定
  166. ok() {
  167. this.models.disjunctor = false;
  168. uni.showLoading({
  169. title: "加载中",
  170. mask: true,
  171. });
  172. post("/nurse/patientInspect/setPatientInspectBackDept", {
  173. pilId: this.selectData.id,
  174. }).then((res) => {
  175. uni.hideLoading();
  176. let _this = this;
  177. if (res.state == 200) {
  178. uni.showToast({
  179. icon: "none",
  180. mask: true,
  181. title: "操作成功!",
  182. });
  183. setTimeout(() => {
  184. _this.toList();
  185. },300)
  186. } else {
  187. uni.showToast({
  188. icon: 'none',
  189. title: res.msg || '请求数据失败!'
  190. });
  191. }
  192. })
  193. },
  194. //取消
  195. cancel() {
  196. this.models.disjunctor = false;
  197. },
  198. // 点击tab
  199. clickTab(tabValue){
  200. if(this.dataInfo.tabActiveValue == tabValue){
  201. return;
  202. }
  203. this.dataInfo.tabActiveValue = tabValue;
  204. this.initData()
  205. },
  206. // tab业务数据接口
  207. initData(){
  208. if(this.dataInfo.tabActiveValue === '1'){
  209. }else if(this.dataInfo.tabActiveValue === '2'){
  210. this.getValue();
  211. }else if(this.dataInfo.tabActiveValue === '3'){
  212. this.getLog();
  213. }
  214. },
  215. // 获取检查信息
  216. getValue(){
  217. uni.showLoading({
  218. title: "加载中",
  219. mask: true,
  220. });
  221. let postData = {
  222. pilId: this.dataInfo.patientInspectLogId,
  223. };
  224. post(`/nurse/patientInspect/getPatientInspectList`, postData).then(res => {
  225. uni.hideLoading();
  226. if(res.status == 200){
  227. this.dataInfo.valueList = res.list || [];
  228. }else{
  229. uni.showToast({
  230. icon: 'none',
  231. title: res.msg || '请求数据失败!'
  232. });
  233. }
  234. })
  235. },
  236. // 获取流程信息
  237. getLog(){
  238. uni.showLoading({
  239. title: "加载中",
  240. mask: true,
  241. });
  242. let postData = {
  243. "idx": 0,
  244. "sum": 9999,
  245. "patientInspectLogLog": {
  246. "pilId": this.dataInfo.patientInspectLogId
  247. }
  248. };
  249. post(`/simple/data/fetchDataList/patientInspectLogLog`, postData).then(res => {
  250. uni.hideLoading();
  251. if(res.status == 200){
  252. this.dataInfo.logList = res.list || [];
  253. }else{
  254. uni.showToast({
  255. icon: 'none',
  256. title: res.msg || '请求数据失败!'
  257. });
  258. }
  259. })
  260. },
  261. // 获取详情
  262. getDetail(){
  263. uni.showLoading({
  264. title: "加载中",
  265. mask: true,
  266. });
  267. get(`/simple/data/fetchData/patientInspectLog/${this.dataInfo.patientInspectLogId}`).then(res => {
  268. uni.hideLoading();
  269. if(res.status == 200){
  270. this.dataInfo.patientInspectLogData = res.data || {};
  271. this.dataInfo.logList = this.dataInfo.patientInspectLogData.logList || [];
  272. this.dataInfo.tabActiveValue = this.dataInfo.tabs[0].value;
  273. this.initData()
  274. }else{
  275. uni.showToast({
  276. icon: 'none',
  277. title: res.msg || '请求数据失败!'
  278. });
  279. }
  280. })
  281. },
  282. // 返回
  283. goBack() {
  284. uni.navigateBack();
  285. },
  286. // 返回列表
  287. toList(){
  288. uni.reLaunch({
  289. url: `/pages/patientInspectLog/patientInspectLogList`
  290. })
  291. }
  292. },
  293. onLoad(options){
  294. this.dataInfo.from = options.from;
  295. this.dataInfo.patientInspectLogId = options.patientInspectLogId;
  296. this.getDetail();
  297. }
  298. }
  299. </script>
  300. <style lang="scss" scoped>
  301. .popup-content{
  302. padding: 40rpx;
  303. }
  304. .gray{
  305. background-color: #8F939C!important;
  306. }
  307. .incidentDetail{
  308. height: 100vh;
  309. display: flex;
  310. flex-direction: column;
  311. justify-content: space-between;
  312. .head{
  313. height: 88rpx;
  314. display: flex;
  315. position: fixed;
  316. z-index: 99;
  317. width: 100%;
  318. background-color: #fff;
  319. font-size: 30rpx;
  320. .tab{
  321. flex: 1;
  322. display: flex;
  323. justify-content: center;
  324. align-items: center;
  325. border-bottom: 4rpx solid transparent;
  326. position: relative;
  327. &:last-of-type{
  328. &:after{
  329. display: none;
  330. }
  331. }
  332. // &:after{
  333. // content: '';
  334. // position: absolute;
  335. // right: 0;
  336. // top: 50%;
  337. // transform: translateY(-50%);
  338. // width: 1rpx;
  339. // height: 44rpx;
  340. // background-color: #515151;
  341. // }
  342. &.active{
  343. color: #49B856;
  344. border-color: #49B856;
  345. }
  346. }
  347. }
  348. .body{
  349. margin-top: 88rpx;
  350. box-sizing: border-box;
  351. flex: 1;
  352. min-height: 0;
  353. border-top: 7rpx solid #EBEBEB;
  354. .phone-filled{
  355. margin-left: 5rpx;
  356. }
  357. .mic-filled{
  358. margin-right: 100rpx;
  359. }
  360. .detail_item_wrap{
  361. padding-bottom: 24rpx;
  362. }
  363. .detail_head{
  364. padding: 24rpx;
  365. border-top: 8rpx solid #D2D2D2;
  366. border-bottom: 1rpx solid #D2D2D2;
  367. display: flex;
  368. justify-content: space-between;
  369. align-items: center;
  370. &:first-of-type{
  371. border-top: none;
  372. }
  373. .title{
  374. font-size: 26rpx;
  375. color: #49B856;
  376. padding-left: 18rpx;
  377. position: relative;
  378. &:before{
  379. content: '';
  380. width: 8rpx;
  381. height: 25rpx;
  382. background-color: #49B856;
  383. position: absolute;
  384. left: 0;
  385. top: 50%;
  386. transform: translateY(-50%);
  387. }
  388. }
  389. .other{
  390. display: flex;
  391. align-items: center;
  392. .priority{
  393. font-size: 26rpx;
  394. margin-right: 15rpx;
  395. }
  396. .status{
  397. font-size: 26rpx;
  398. }
  399. }
  400. }
  401. .deital_item{
  402. font-size: 26rpx;
  403. color: #555;
  404. padding: 24rpx 24rpx 0;
  405. display: flex;
  406. align-items: center;
  407. .name{
  408. width: 5em;
  409. margin-right: 24rpx;
  410. }
  411. .value{
  412. flex: 2;
  413. word-break: break-all;
  414. &.text_value{
  415. flex: 1;
  416. }
  417. &.img{
  418. display: flex;
  419. .imgItem{
  420. width: 82rpx;
  421. height: 82rpx;
  422. margin-right: 24rpx;
  423. &:last-of-type{
  424. margin-right: 0;
  425. }
  426. }
  427. .resourceItem{
  428. width: 100rpx;
  429. height: 100rpx;
  430. margin-right: 24rpx;
  431. &:last-of-type{
  432. margin-right: 0;
  433. }
  434. }
  435. .resourceItem-audio{
  436. width: 300rpx;
  437. height: 60rpx;
  438. }
  439. }
  440. }
  441. }
  442. .summaryItem_bodyItem{
  443. padding: 24rpx 24rpx 0;
  444. font-size: 26rpx;
  445. .summaryItem_bodyItem_top{
  446. display: flex;
  447. justify-content: space-between;
  448. align-items: center;
  449. .value{
  450. padding-left: 48rpx;
  451. flex-shrink: 0;
  452. }
  453. }
  454. .summaryItem_bodyItem_bottom{
  455. margin-top: 24rpx;
  456. display: flex;
  457. justify-content: space-between;
  458. align-items: center;
  459. .name{
  460. text-align: right;
  461. flex: 1;
  462. }
  463. .value{
  464. width: 220rpx;
  465. text-align: right;
  466. flex-shrink: 0;
  467. }
  468. }
  469. }
  470. .summaryItem_bodyItem_total{
  471. text-align: right;
  472. padding: 24rpx;
  473. font-size: 26rpx;
  474. }
  475. .summaryItem_total{
  476. text-align: center;
  477. padding-top: 24rpx;
  478. font-size: 32rpx;
  479. font-weight: bold;
  480. color: #49B856;
  481. border-top: 1rpx solid #D2D2D2;
  482. }
  483. .info{
  484. .infoItem{
  485. padding: 24rpx;
  486. background-color: #fff;
  487. border-top: 8rpx solid #D2D2D2;
  488. font-size: 24rpx;
  489. &:first-of-type{
  490. border-top: none;
  491. }
  492. .name{
  493. margin-top: 24rpx;
  494. &:first-of-type{
  495. margin-top: 0;
  496. }
  497. }
  498. }
  499. }
  500. .process_item_wrap{
  501. padding: 38rpx;
  502. .process_item{
  503. &:last-of-type{
  504. .process_item_bottom{
  505. border-left: none;
  506. }
  507. }
  508. .process_item_top{
  509. padding-left: 30rpx;
  510. display: flex;
  511. align-items: center;
  512. position: relative;
  513. &:before{
  514. content: '';
  515. position: absolute;
  516. left: -13rpx;
  517. top: 50%;
  518. width: 26rpx;
  519. height: 26rpx;
  520. border-radius: 50%;
  521. background-color: #49B856;
  522. transform: translateY(-50%);
  523. }
  524. .name{
  525. font-size: 30rpx;
  526. }
  527. .value{
  528. margin-left: 20rpx;
  529. font-size: 22rpx;
  530. color: #A1A1A1;
  531. flex: 1;
  532. }
  533. }
  534. .process_item_bottom{
  535. min-height: 82rpx;
  536. border-left: 1rpx solid #B7BDC6;
  537. margin-top: 5rpx;
  538. padding-left: 30rpx;
  539. display: flex;
  540. font-size: 24rpx;
  541. color: #A1A1A1;
  542. .value{
  543. margin-left: 20rpx;
  544. }
  545. }
  546. }
  547. }
  548. .appraise_detail{
  549. padding: 24rpx 24rpx 24rpx 40rpx;
  550. .appraise_detail_top{
  551. display: flex;
  552. align-items: center;
  553. justify-content: space-between;
  554. font-size: 26rpx;
  555. .name{
  556. color: #A1A1A1;
  557. }
  558. .value{}
  559. }
  560. .appraise_detail_bottom{
  561. font-size: 30rpx;
  562. margin-top: 24rpx;
  563. word-break: break-all;
  564. }
  565. }
  566. }
  567. }
  568. </style>