orderDetail.vue 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617
  1. <template>
  2. <view class="orderDetail">
  3. <!-- 头部 -->
  4. <view class="orderDetail_header">
  5. <view class="orderDetail_header_item" v-for="tab in tabs" :key="tab.id" :class="{active:tab.id === selectedTab}"
  6. @click="changeTab(tab.id)">
  7. {{tab.name}}
  8. </view>
  9. </view>
  10. <!-- tab -->
  11. <!-- 工单信息 -->
  12. <view class="orderDetail_info" v-show="selectedTab === 1">
  13. <view class="orderDetail_infoItem" v-if="orderInfo.id">
  14. <view class="orderDetail_infoItem_header">
  15. <view class="orderDetail_infoItem_header_title">
  16. <view class="icon"></view>
  17. <view class="taskNameAndWorkerName">
  18. <text class="taskName"
  19. v-if="orderInfo.taskType">{{orderInfo.isHalfInspect === 1? "半程陪检": orderInfo.taskType.taskName}}</text>
  20. </view>
  21. </view>
  22. <text class="orderDetail_infoItem_header_more">{{orderInfo.gdcode}}</text>
  23. </view>
  24. <view class="orderDetail_infoItem_item">
  25. <view class="orderDetail_infoItem_item_content">
  26. <text class="orderDetail_infoItem_item_name">状态</text>
  27. <text class="orderDetail_infoItem_item_value" v-if="orderInfo.gdState">{{orderInfo.gdState.name}}</text>
  28. </view>
  29. <view class="orderDetail_infoItem_item_content">
  30. <text class="orderDetail_infoItem_item_name">工单日期</text>
  31. <text class="orderDetail_infoItem_item_value">{{orderInfo.startTime || '暂无'}}</text>
  32. </view>
  33. <view class="orderDetail_infoItem_item_content">
  34. <text class="orderDetail_infoItem_item_name">总耗时</text>
  35. <text class="orderDetail_infoItem_item_value">{{orderInfo.showTimeNum || '暂无'}}</text>
  36. </view>
  37. <view class="orderDetail_infoItem_item_content">
  38. <text class="orderDetail_infoItem_item_name">申请科室</text>
  39. <text
  40. class="orderDetail_infoItem_item_value">{{orderInfo.createDeptDTO?(deptDisplay==2?orderInfo.createDeptDTO.deptalias:orderInfo.createDeptDTO.dept):'暂无'}}</text>
  41. </view>
  42. <view class="orderDetail_infoItem_item_content">
  43. <text class="orderDetail_infoItem_item_name">起点科室</text>
  44. <text
  45. class="orderDetail_infoItem_item_value">{{orderInfo.startDept?(deptDisplay==2?orderInfo.startDept.deptalias:orderInfo.startDept.dept):'暂无'}}</text>
  46. </view>
  47. <view class="orderDetail_infoItem_item_content"
  48. v-if="orderInfo.taskType.associationType.value === ASSOCIATION_TYPES['患者陪检业务']||orderInfo.taskType.associationType.value === ASSOCIATION_TYPES['患者其他服务业务']">
  49. <text class="orderDetail_infoItem_item_name">中间科室</text>
  50. <text class="orderDetail_infoItem_item_value">{{orderInfo.middleDept || '暂无'}}</text>
  51. </view>
  52. <view class="orderDetail_infoItem_item_content">
  53. <text class="orderDetail_infoItem_item_name">目标科室</text>
  54. <text class="orderDetail_infoItem_item_value">{{orderInfo.endDepts}}</text>
  55. </view>
  56. <view class="orderDetail_infoItem_item_content">
  57. <text class="orderDetail_infoItem_item_name">支助人员</text>
  58. <text class="orderDetail_infoItem_item_value">{{orderInfo.worker?orderInfo.worker.name:'暂无'}}</text>
  59. </view>
  60. <view class="orderDetail_infoItem_item_content">
  61. <text class="orderDetail_infoItem_item_name">联系电话</text>
  62. <text class="orderDetail_infoItem_item_value">{{orderInfo.worker?orderInfo.worker.phone:'暂无'}}</text>
  63. </view>
  64. <view class="orderDetail_infoItem_item_content"
  65. v-if="orderInfo.taskType.associationType.value === ASSOCIATION_TYPES['患者陪检业务']||orderInfo.taskType.associationType.value === ASSOCIATION_TYPES['患者其他服务业务']">
  66. <text class="orderDetail_infoItem_item_name">陪同情况</text>
  67. <text class="orderDetail_infoItem_item_value">{{orderInfo.isAccompany==1?'需要医护陪同':'无需医护陪同'}}</text>
  68. </view>
  69. <view class="orderDetail_infoItem_item_content"
  70. v-if="orderInfo.taskType.associationType.value === ASSOCIATION_TYPES['患者陪检业务']||orderInfo.taskType.associationType.value === ASSOCIATION_TYPES['患者其他服务业务']">
  71. <text class="orderDetail_infoItem_item_name">预约时间</text>
  72. <text
  73. class="orderDetail_infoItem_item_value">{{orderInfo.yyjdTime?(orderInfo.yyjdTime|formatDate('MM-dd HH:mm')):'暂无'}}</text>
  74. </view>
  75. <view class="orderDetail_infoItem_item_content"
  76. v-if="orderInfo.taskType.associationType.value === ASSOCIATION_TYPES['患者陪检业务']">
  77. <text class="orderDetail_infoItem_item_name">是否半程陪检</text>
  78. <text class="orderDetail_infoItem_item_value">{{orderInfo.isHalfInspect===1?'是':'否'}}</text>
  79. </view>
  80. <view class="orderDetail_infoItem_item_content"
  81. v-if="orderInfo.drugs && orderInfo.taskType.associationType.value === ASSOCIATION_TYPES['药品配送业务']">
  82. <text class="orderDetail_infoItem_item_name">药包编码</text>
  83. <text class="orderDetail_infoItem_item_value">{{orderInfo.drugs.packid || '暂无'}}</text>
  84. </view>
  85. <view class="orderDetail_infoItem_item_content"
  86. v-if="orderInfo.staticDistri && orderInfo.taskType.associationType.value === ASSOCIATION_TYPES['静配配送']">
  87. <text class="orderDetail_infoItem_item_name">药包编码</text>
  88. <text class="orderDetail_infoItem_item_value">{{orderInfo.staticDistri.packid || '暂无'}}</text>
  89. </view>
  90. <view class="orderDetail_infoItem_item_content"
  91. v-if="orderInfo.taskType.associationType.value === ASSOCIATION_TYPES['临时标本业务'] || orderInfo.taskType.associationType.value === ASSOCIATION_TYPES['标本轮巡业务']">
  92. <text class="orderDetail_infoItem_item_name">预计接收</text>
  93. <text class="orderDetail_infoItem_item_value">{{orderInfo.expectReceiveNum||'暂无'}}</text>
  94. </view>
  95. <view class="orderDetail_infoItem_item_content"
  96. v-if="orderInfo.taskType.associationType.value === ASSOCIATION_TYPES['临时标本业务'] || orderInfo.taskType.associationType.value === ASSOCIATION_TYPES['标本轮巡业务']">
  97. <text class="orderDetail_infoItem_item_name">实际接收</text>
  98. <text class="orderDetail_infoItem_item_value">{{orderInfo.actualReceiveNum||'暂无'}}</text>
  99. </view>
  100. <view class="orderDetail_infoItem_item_content">
  101. <text class="orderDetail_infoItem_item_name">是否加急</text>
  102. <text class="orderDetail_infoItem_item_value" v-if="orderInfo.emergencyType">
  103. {{(orderInfo.emergencyType.value == 2 || orderInfo.emergencyType.value == 3)?'是':'否'}}
  104. </text>
  105. </view>
  106. <view class="orderDetail_infoItem_item_content"
  107. v-if="orderInfo.workOrderRemark && (orderInfo.taskType.associationType.value === ASSOCIATION_TYPES['临时标本业务']||orderInfo.taskType.associationType.value === ASSOCIATION_TYPES['标本轮巡业务']||orderInfo.taskType.associationType.value === ASSOCIATION_TYPES['其他临床服务'])">
  108. <text class="orderDetail_infoItem_item_name">备注信息</text>
  109. <text class="orderDetail_infoItem_item_value">{{orderInfo.workOrderRemark||'暂无'}}</text>
  110. </view>
  111. <view class="orderDetail_infoItem_item_content" v-if="orderInfo.specialCloseReason">
  112. <text class="orderDetail_infoItem_item_name">特殊情况关闭原因</text>
  113. <text class="orderDetail_infoItem_item_value">{{orderInfo.specialCloseReason||'暂无'}}</text>
  114. </view>
  115. </view>
  116. </view>
  117. </view>
  118. <!-- 流程信息 -->
  119. <view class="orderDetail_info" v-show="selectedTab === 2">
  120. <view class="orderDetail_infoItem" v-if="logList.length">
  121. <view class="orderDetail_infoItem_header">
  122. <view class="orderDetail_infoItem_header_title">
  123. <view class="icon"></view>
  124. <view class="taskNameAndWorkerName">
  125. <text class="taskName">流程信息</text>
  126. </view>
  127. </view>
  128. </view>
  129. <view class="orderDetail_infoItem_item process">
  130. <view class="orderDetail_process_item" v-for="(step,i) in logList" :key="i">
  131. <view class="step_infoStart">
  132. <view class="step_name">{{step.operationName}}</view>
  133. <view class="step_time" v-if="step.record && step.record[0]">
  134. {{step.record[0].operationTime|formatDate('MM-dd HH:mm')}}
  135. </view>
  136. </view>
  137. <view class="step_icon pda pda-icon_liucheng"
  138. :class="{'active':(step.record&&step.record[0]&&step.record[0].operationTime)}"></view>
  139. <view class="step_infoEnd">
  140. <view class="step_overtime" v-if="i!=0&&step.record&&step.record.length">
  141. 耗时{{filterTime(step.record)}}
  142. </view>
  143. <view class="step_dept" v-if="step.record&&step.record[0]&&step.record[0].dept">
  144. <text v-for="(dept,index) in step.record"
  145. :key="index">{{dept?(deptDisplay == 2?dept.deptalias:dept.dept)+',':''}}</text>
  146. </view>
  147. </view>
  148. </view>
  149. </view>
  150. </view>
  151. </view>
  152. <!-- 业务信息 -->
  153. <view class="orderDetail_info" v-show="selectedTab === 3">
  154. <view class="orderDetail_infoItem">
  155. 业务信息
  156. </view>
  157. </view>
  158. <!-- 底部 -->
  159. <seiminFooterBtn :btns="btns"></seiminFooterBtn>
  160. <seiminModel ref="seiminModel"></seiminModel>
  161. </view>
  162. </template>
  163. <script>
  164. import {
  165. reqFetchData,
  166. reqFetchWorkOrderLog,
  167. } from "../../request/api.js";
  168. import {
  169. mapState
  170. } from "vuex";
  171. import {
  172. GDSTATE
  173. } from "../../utils/enum.gdstate.js";
  174. import {
  175. ASSOCIATION_TYPES
  176. } from "../../utils/enum.association_types.js";
  177. import {
  178. showAppraise,
  179. openRecallModal,
  180. openExecModal,
  181. showJiaji,
  182. } from "../../utils/index.js";
  183. export default {
  184. data() {
  185. return {
  186. // 路由传参
  187. queryParams: {},
  188. // 关联类型
  189. ASSOCIATION_TYPES,
  190. // 选项卡
  191. tabs: [{
  192. id: 1,
  193. name: '工单信息'
  194. },
  195. {
  196. id: 2,
  197. name: '流程信息'
  198. },
  199. {
  200. id: 3,
  201. name: '业务信息'
  202. },
  203. ],
  204. // 当前选中的tab
  205. selectedTab: 1,
  206. // 工单信息
  207. orderInfo: {},
  208. // 流程信息
  209. logList: [],
  210. //底部按钮
  211. btns: [],
  212. };
  213. },
  214. computed: {
  215. ...mapState('other', ["deptDisplay"]),
  216. },
  217. methods: {
  218. init(queryParams) {
  219. this.queryParams = queryParams;
  220. this.changeTab(1);
  221. },
  222. // 格式化时分秒
  223. // (时间小于一分钟则显示秒,时间大于一分钟则显示分钟数,如超出一小时则显示小时和分钟。)time单位:秒
  224. formatTime(time) {
  225. let timeStr = "";
  226. if (time >= 0 && time < 60) {
  227. // 秒
  228. timeStr = time + "秒";
  229. } else if (time >= 60 && time < 3600) {
  230. // 分钟
  231. timeStr = Math.floor(time / 60) + "分钟";
  232. } else if (time >= 3600) {
  233. // 时 + 分
  234. let h = "";
  235. let m = "";
  236. h = Math.floor(time / 3600) + "小时";
  237. m = time % 3600 >= 60 ? Math.floor((time % 3600) / 60) + "分钟" : "";
  238. timeStr = h + m;
  239. }
  240. return timeStr;
  241. },
  242. // 计算流程信息耗时
  243. filterTime(step) {
  244. let num = 0;
  245. step.forEach((e) => {
  246. num += e.difTime;
  247. });
  248. return this.formatTime(num / 1000);
  249. },
  250. // 切换tab
  251. changeTab(id) {
  252. this.selectedTab = id;
  253. switch (id) {
  254. case 1:
  255. this.getInfo(this.queryParams);
  256. break;
  257. case 2:
  258. this.getProcess(this.queryParams);
  259. break;
  260. case 3:
  261. this.getInfo(this.queryParams);
  262. break;
  263. }
  264. },
  265. //获取工单信息数据
  266. getInfo(queryParams) {
  267. uni.showLoading({
  268. mask: true,
  269. title: '加载中',
  270. })
  271. reqFetchData('api', 'workOrder', queryParams.id).then(res => {
  272. uni.hideLoading();
  273. if (res.status == 200) {
  274. // 检查科室处理
  275. if (res.data.middleDept) {
  276. //有检查科室的话
  277. res.data.middleDept = res.data.middleDept.map(v => {
  278. return this.deptDisplay == 2 ? v.deptalias : v.dept;
  279. }).toString();
  280. }
  281. // 终点科室处理
  282. res.data.endDepts = res.data.endDepts.map(v => {
  283. return this.deptDisplay == 2 ? v.deptalias : v.dept;
  284. }).toString();
  285. // 工单信息
  286. this.orderInfo = res.data;
  287. //底部按钮处理
  288. let btns = [{
  289. name: "回到列表",
  290. type: "default",
  291. click: () => {
  292. uni.navigateTo({
  293. url: "/pages/orderList/orderList",
  294. });
  295. },
  296. }];
  297. let newOrder = this.orderInfo;
  298. if (newOrder.gdState.value == GDSTATE['待抢单'] ||
  299. newOrder.gdState.value == GDSTATE['待接单'] ||
  300. newOrder.gdState.value == GDSTATE['待到达'] ||
  301. newOrder.gdState.value == GDSTATE['定时预约'] ||
  302. newOrder.gdState.value == GDSTATE['待评价']) {
  303. if (newOrder.gdState.value == GDSTATE['待评价']) {
  304. //评价按钮
  305. btns.push({
  306. name: "评价",
  307. type: "primary",
  308. click: () => {
  309. showAppraise.call(this, newOrder.id, () => {
  310. this.$refs.seiminModel.close();
  311. uni.navigateTo({
  312. url: "/pages/orderList/orderList",
  313. });
  314. });
  315. },
  316. })
  317. }
  318. if (newOrder.gdState.value == GDSTATE['待抢单'] ||
  319. newOrder.gdState.value == GDSTATE['待接单'] ||
  320. newOrder.gdState.value == GDSTATE['待到达'] ||
  321. newOrder.gdState.value == GDSTATE['定时预约']) {
  322. //撤销按钮
  323. btns.push({
  324. name: "撤销",
  325. type: "primary",
  326. click: () => {
  327. openRecallModal.call(this, newOrder.id, () => {
  328. this.$refs.seiminModel.close();
  329. uni.navigateTo({
  330. url: "/pages/orderList/orderList",
  331. });
  332. });
  333. },
  334. })
  335. }
  336. if (newOrder.gdState.value == GDSTATE['定时预约']) {
  337. //立即执行按钮
  338. btns.push({
  339. name: "立即执行",
  340. type: "primary",
  341. click: () => {
  342. openExecModal.call(this, newOrder.id, () => {
  343. this.$refs.seiminModel.close();
  344. uni.navigateTo({
  345. url: "/pages/orderList/orderList",
  346. });
  347. });
  348. },
  349. })
  350. }
  351. if ((newOrder.gdState.value == GDSTATE['待抢单'] ||
  352. newOrder.gdState.value == GDSTATE['待到达']) &&
  353. newOrder.taskType.allowUrgent == 1 &&
  354. !newOrder.urgentDetails) {
  355. //加急按钮
  356. btns.push({
  357. name: "加急",
  358. type: "primary",
  359. click: () => {
  360. showJiaji.call(this, newOrder.id, () => {
  361. this.$refs.seiminModel.close();
  362. uni.navigateTo({
  363. url: "/pages/orderList/orderList",
  364. });
  365. });
  366. },
  367. })
  368. }
  369. }
  370. // 按钮赋值
  371. this.btns = btns;
  372. } else {
  373. this.btns = [{
  374. name: "回到列表",
  375. type: "default",
  376. click: () => {
  377. uni.navigateTo({
  378. url: "/pages/orderList/orderList",
  379. });
  380. },
  381. }, ];
  382. this.$refs.seiminModel.show({
  383. skin: 'toast',
  384. icon: 'error',
  385. content: '请求失败',
  386. })
  387. }
  388. })
  389. },
  390. //获取流程信息数据
  391. getProcess(queryParams) {
  392. uni.showLoading({
  393. mask: true,
  394. title: '加载中',
  395. })
  396. reqFetchWorkOrderLog(queryParams.id).then(res => {
  397. uni.hideLoading();
  398. if (res.status == 200) {
  399. // 流程信息
  400. this.logList = res.data;
  401. } else {
  402. this.$refs.seiminModel.show({
  403. skin: 'toast',
  404. icon: 'error',
  405. content: '请求失败',
  406. })
  407. }
  408. })
  409. },
  410. },
  411. onLoad(queryParams) {
  412. console.log(queryParams);
  413. this.init(queryParams);
  414. }
  415. }
  416. </script>
  417. <style lang="scss" scoped>
  418. .orderDetail {
  419. padding-bottom: 108rpx;
  420. // 头部
  421. .orderDetail_header {
  422. position: fixed;
  423. z-index: 98;
  424. width: 100%;
  425. height: 88rpx;
  426. background-color: #fff;
  427. color: #333;
  428. @include flex;
  429. .orderDetail_header_item {
  430. flex: 1;
  431. font-size: 32rpx;
  432. @include border(right);
  433. @include border(bottom);
  434. @include flex(center, center);
  435. &:last-of-type {
  436. border-right: none;
  437. }
  438. &.active {
  439. color: $defaultColor;
  440. border-bottom: 4rpx solid $defaultColor;
  441. }
  442. }
  443. }
  444. // tab
  445. // 工单信息
  446. .orderDetail_info {
  447. padding: 108rpx 24rpx 0;
  448. .orderDetail_infoItem {
  449. width: 702rpx;
  450. min-height: 320rpx;
  451. background-color: #fff;
  452. margin-top: 8rpx;
  453. border-radius: 8rpx;
  454. position: relative;
  455. padding: 0 24rpx;
  456. font-size: 32rpx;
  457. @include border;
  458. @include semicircle(#f9fafb, 82rpx);
  459. @include flex(flex-start, stretch, column);
  460. .ji,
  461. .jiaji {
  462. width: 60rpx;
  463. position: absolute;
  464. right: 0;
  465. top: 0;
  466. }
  467. .orderDetail_infoItem_header {
  468. height: 86rpx;
  469. @include border($directive:bottom, $style:dashed);
  470. @include flex(space-between, center);
  471. .orderDetail_infoItem_header_title {
  472. color: #333;
  473. flex: 1;
  474. @include flex(flex-start, center);
  475. .icon {
  476. width: 10rpx;
  477. height: 46rpx;
  478. border-radius: 2rpx;
  479. background-color: #F0F6ED;
  480. @include btn_background;
  481. }
  482. .taskNameAndWorkerName {
  483. flex: 1;
  484. @include flex;
  485. .taskName {
  486. max-width: 10em;
  487. margin-left: 8rpx;
  488. font-size: 38rpx;
  489. font-weight: bold;
  490. @include clamp;
  491. }
  492. }
  493. }
  494. .orderDetail_infoItem_header_more {
  495. color: #333;
  496. font-weight: bold;
  497. font-size: 38rpx;
  498. @include clamp;
  499. }
  500. }
  501. .orderDetail_infoItem_item {
  502. padding-top: 12rpx;
  503. padding-bottom: 12rpx;
  504. color: #333;
  505. font-size: 30rpx;
  506. flex: 1;
  507. @include border(bottom);
  508. @include flex(flex-start, stretch, column);
  509. &.process{
  510. padding-top: 90rpx;
  511. padding-bottom: 90rpx;
  512. }
  513. &:last-of-type {
  514. border-bottom: none;
  515. }
  516. // 工单信息
  517. .orderDetail_infoItem_item_content {
  518. margin-top: 20rpx;
  519. @include flex(space-between, stretch);
  520. .orderDetail_infoItem_item_name {
  521. font-size: 34rpx;
  522. color: #666;
  523. max-width: 4em;
  524. }
  525. .orderDetail_infoItem_item_value {
  526. font-size: 38rpx;
  527. color: #333;
  528. font-weight: bold;
  529. max-width: 420rpx;
  530. text-align: justify;
  531. word-break: break-all;
  532. }
  533. }
  534. // 流程信息
  535. .orderDetail_process_item {
  536. min-height: 120rpx;
  537. line-height: 50rpx;
  538. color: #333;
  539. @include flex(center);
  540. &:last-of-type {
  541. .step_icon {
  542. &::after {
  543. display: none;
  544. }
  545. }
  546. }
  547. .step_infoStart {
  548. font-size: 28rpx;
  549. flex: 1;
  550. @include flex(flex-end);
  551. .step_time {
  552. margin-left: 16rpx;
  553. }
  554. }
  555. .step_icon {
  556. font-size: 38rpx;
  557. margin-left: 30rpx;
  558. margin-right: 30rpx;
  559. position: relative;
  560. color: #E5E9ED;
  561. &.active {
  562. color: #07863C;
  563. }
  564. &::after {
  565. content: '';
  566. position: absolute;
  567. top: 60rpx;
  568. left: 18rpx;
  569. width: 1px;
  570. height: calc(100% - 70rpx);
  571. background-color: #DDE1E5;
  572. }
  573. }
  574. .step_infoEnd {
  575. font-size: 34rpx;
  576. flex: 1;
  577. padding-bottom: 16rpx;
  578. }
  579. }
  580. }
  581. }
  582. }
  583. }
  584. </style>