doctor_info.vue 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471
  1. <template>
  2. <view class="main">
  3. <view class="u-skeleton">
  4. <view class="pr det-body">
  5. <image class="det-bg-img" mode="scaleToFill" src="https://zhengda.oss-cn-chengdu.aliyuncs.com/baoma/static/img/doctorbanner.png"></image>
  6. <view class="det-head pr plr15 bdr8 m-bg-white mlr15 pt25 u-skeleton-fillet">
  7. <view class="m-xstart pr m-bottom-line pb25 margin-bottom-sm">
  8. <view class="m-flex overflow mr10">
  9. <view class="flex align-center">
  10. <text class="dpb fb f16">{{doctor.name||''}}</text>
  11. <text class="dpb f14 m-gray-small ml5" v-for="(itm,index) in doctor.label" :key="index">{{itm||''}}</text>
  12. </view>
  13. <view class="dpb m-flex margin-top-sm">科室:{{doctor.office.name||'暂无'}} {{doctor.qualification.name||'暂无'}}</view>
  14. <view class="m-xend mt12">
  15. <view class="f14 m-gray-big">评分:<text class="m-theme">{{doctor.score}}</text>
  16. <text class="f11 margin-left-xs">分</text>
  17. </view>
  18. <view class="f14 ml15 m-gray-big">服务:<text class="m-theme">{{doctor.service_persons}}</text>
  19. <text class="f11">人</text>
  20. </view>
  21. <view class="m-flex ml15">距离:{{parseInt(doctor.distance/1000)||'未知'}}km</view>
  22. </view>
  23. </view>
  24. <view class="pr pt5">
  25. <view class="follow_style" @click="submitCollect" :data-index="index" :data-id="doctor.id" v-if="doctor.is_collect==0">
  26. 关注
  27. </view>
  28. <view class="follow_style" @click="submitCollect" :data-index="index" :data-id="doctor.id" style="background-color: #fff;color: rgb(208, 105, 150);border:2rpx solid rgb(208, 105, 150);"
  29. v-else>
  30. 已关注
  31. </view>
  32. <u-image shape="circle" width="120rpx" height="120rpx" :src="doctor.avatar"></u-image>
  33. </view>
  34. </view>
  35. <u-read-more :toggle="true" show-height="0" :shadow-style="shadowStyle" close-text=" " open-text=" ">
  36. <rich-text :nodes="doctor.intro"></rich-text>
  37. </u-read-more>
  38. </view>
  39. </view>
  40. <view class="gridstyle padding-sm margin-lr-sm u-skeleton-fillet">
  41. <u-grid :col="3" :border="false">
  42. <view @click="gotoxuanze" data-index="1" data-name="电话咨询" :data-istrue="doctor.is_phone">
  43. <u-grid-item :bg-color="barindex==1&&doctor.is_phone==1?'#efefef':'#fff'">
  44. <u-image width="120rpx" :style="doctor.is_phone==1?'filter:contrast(100%);':'filter:contrast(30%);'" height="120rpx"
  45. src="https://zhengda.oss-cn-chengdu.aliyuncs.com/baoma/static/toolimg/indexphone.png" shape="circle"></u-image>
  46. <view class="grid-text margin-top-sm" :style="doctor.is_phone==1?'color:black;':'color:rgb(219,219,219)'">电话咨询</view>
  47. </u-grid-item>
  48. </view>
  49. <view class="" @click="gotoxuanze" data-index="2" data-name="图文咨询" :data-istrue="doctor.is_chat">
  50. <u-grid-item :bg-color="barindex==2&&doctor.is_chat==1?'#efefef':'#fff'">
  51. <u-image width="120rpx" :style="doctor.is_chat==1?'filter:contrast(100%);':'filter:contrast(30%);'" height="120rpx"
  52. src="https://zhengda.oss-cn-chengdu.aliyuncs.com/baoma/static/toolimg/indextu.png" shape="circle"></u-image>
  53. <view class="grid-text margin-top-sm" :style="doctor.is_chat==1?'color:black;':'color:rgb(219,219,219)'">图文咨询</view>
  54. </u-grid-item>
  55. </view>
  56. <view class="" @click="gotoxuanze" data-index="3" data-name="门诊预约" :data-istrue="doctor.is_appoint">
  57. <u-grid-item :bg-color="barindex==3&&doctor.is_appoint==1?'#efefef':'#fff'">
  58. <u-image width="120rpx" :style="doctor.is_appoint==1?'filter:contrast(100%);':'filter:contrast(30%);'" height="120rpx"
  59. src="https://zhengda.oss-cn-chengdu.aliyuncs.com/baoma/static/toolimg/indexmen.png" shape="circle"></u-image>
  60. <view class="grid-text margin-top-sm" :style="doctor.is_appoint==1?'color:black;':'color:rgb(219,219,219)'">门诊预约</view>
  61. </u-grid-item>
  62. </view>
  63. </u-grid>
  64. <u-line color="#efefef" :hair-line="true" />
  65. <view v-if="!isjigou" class="text-lg text-center margin-top-sm" style="color: rgb(238, 170, 63);">
  66. 平均回复低至1分钟
  67. </view>
  68. <view v-else class="text-lg margin-top-sm" style="color: rgb(238, 170, 63);border-bottom: 3rpx solid rgb(238, 170, 63); width: 530rpx;"
  69. @click="xuantime">
  70. 已选时间:{{daytime}}
  71. <u-picker mode="multiSelector" @confirm="callbacktime" v-model="show" :default-selector='[0, 1]' range-key="start_time_period"
  72. :range="multiSelector"></u-picker>
  73. </view>
  74. </view>
  75. <view v-if="isjigou" bindtap="goAdrPostion" class="pr pt10 pb10 margin-lr-sm margin-top-sm m-bg-white" style="border-radius: 16rpx;box-shadow: 0 0 50rpx 0 rgba(0, 0, 0, 0.1);">
  76. <view class="pr pt15 pb15">
  77. <view class="f18 fb plr15">机构地址</view>
  78. <view class="pr m-xcenter plr15 mt15">
  79. <image class="dpb" mode="scaleToFill" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAANCAYAAAB/9ZQ7AAABx0lEQVQoU2WSP2gTcRTHv+/dH4IdmkVcFAvSgihNLi1SRKE4uNhek4I6iNLY5AQnB93dpHNBMEltIbgUc5pUF0F0cDBIk2twKiJBBAWHVgOl5u5+TxrINeCbvnz5Pnh8vo8wMBPOE8NXx6YIcpKJfu74Ox/aa9n9foT6IrFYtVjjMkHOHO7TV6Ww6JVm3x94vXBy4fkombGPUMEwEW+oMPRY44QAs0TcDfzwUms1Xe+FrXztJURsIdz0inPPkgsv4t5aZjd5u3qDGGUiqjeK9nmauLo+rOLmDyJuNQr2VMrZWBJR90DacrMwc9/K1+qAmvQDjNB4rnJcg/aN2Kg2ClcyqTuvP0nYnWQ2vM3CjGU5tQpE5gPfP03T0+/036OdLwBinT19bCjmn2JCPoBa6SreHtJpWwTdzvf2WO/mRM7NaqQ/BeFN92949/Oe3z57xBgxTe0xgMuhCm9trWTKfXSUcmquKJUGUQBgF0AcIroQvfKKtg2QRJyt7PpRMmKbosITEWfW2vD3zzVXr/2KOEfFOO4FFu0tRJnE+h8odbFRmmv912DfSObcB8zGI5HgerOYqQy+Q3TGofmQE7nx9FZp3h0MHuh/o0mz0Kcr4U0AAAAASUVORK5CYII="
  80. style="width: 10px; height: 12px;"></image>
  81. <view class="m-flex tl ml5">{{hospital||'无'}}</view>
  82. </view>
  83. <view class="pr m-xcenter plr15 mt10">
  84. <view class="m-flex tl m-gray-small f12 pl15 mr5">地址:{{address||'无'}}</view>
  85. <view class="pt2 pb2 plr10 f12 m-gray-small br-gray-letter bdr30" v-if="distance!='0'">
  86. {{distance||'暂无距离'}}km
  87. </view>
  88. <view class="pt2 pb2 plr10 f12 m-gray-small br-gray-letter bdr30" wx:else>暂无距离</view>
  89. <text class="dpb iconfont icon-arrow-right m-gray-letter f20"></text>
  90. </view>
  91. </view>
  92. </view>
  93. <view class="margin-lr-sm mt15 bg-white u-skeleton-fillet" style="border-radius: 16rpx; box-shadow: 0 0 50rpx 0 rgba(0, 0, 0, 0.1);"
  94. v-if="doctor.evaluate.length!=0">
  95. <view class="f18 fb flex align-center plr15 pt15">患者评价 <text class="f12 m-gray-letter margin-left-xs">({{doctor.evaluate.length}})</text>
  96. </view>
  97. <view class="cu-list menu-avatar card-menu">
  98. <view class="cu-item" v-for="(item,index) in doctor.evaluate" :key="index">
  99. <view class="cu-avatar round lg" :style="'background-image:url('+item.user.avatar+');'"></view>
  100. <view class="content">
  101. <view class="text-grey margin-right-sm">
  102. {{item.user.nickname}}
  103. <u-rate :count="5" v-model="item.score" :disabled="true"></u-rate>
  104. </view>
  105. <view class="text-gray text-sm flex">
  106. <text class="text-cut">
  107. {{item.content}}
  108. </text>
  109. </view>
  110. </view>
  111. <view class="action" style="width: 124rpx;">
  112. <view class="text-grey text-xs">{{item.created_at}}</view>
  113. </view>
  114. </view>
  115. </view>
  116. </view>
  117. <view class="cu-tabbar-height"></view>
  118. <view class="cu-tabbar-height"></view>
  119. </view>
  120. <view class="cu-bar bg-white tabbar border shop" style="position: fixed; bottom: 0; z-index: 99;width: 100%;">
  121. <button class="action text-orange" open-type="share" style="width: 200rpx;">
  122. <view class="cuIcon-share text-orange">
  123. </view>
  124. 分享
  125. </button>
  126. <button v-if="barindex==1" class="submit text-white" :disabled="isphone" @click="phonezixun" :style="!isphone?'background-color: rgb(11,115,186);font-size: 26rpx;':'font-size: 26rpx;color:gray'">电话咨询</button>
  127. <button v-else-if="barindex==2" class="submit text-white" :disabled="istuwen" @click="phonezixun" :style="!istuwen?'background-color: rgb(11,115,186);font-size: 26rpx;':'font-size: 26rpx;color:gray'">图文咨询</button>
  128. <button v-else class="submit text-white" @click="phonezixun" :disabled="ismenzhen" :style="!ismenzhen?'background-color: rgb(11,115,186);font-size: 26rpx;':'font-size: 26rpx;color:gray'">门诊预约</button>
  129. </view>
  130. <u-no-network></u-no-network>
  131. <u-skeleton :loading="loading" el-color="#ddd" :animation="true" bgColor="#FFF"></u-skeleton>
  132. </view>
  133. </template>
  134. <script>
  135. var user = require('../../common/user.js');
  136. export default {
  137. onLoad(options) {
  138. this.doctorid = options.id
  139. if (options.time != undefined) {
  140. this.daytime = options.time
  141. } else {
  142. let date = new Date();
  143. let nian = date.getFullYear()
  144. let yue = date.getMonth() + 1
  145. let ri = date.getDate() >= 10 ? date.getDate() : '0' + date.getDate()
  146. let hour = date.getHours();
  147. let minute = date.getMinutes() >= 10 ? date.getMinutes() : '0' + date.getMinutes();
  148. this.daytime = nian + "-" + yue + "-" + ri + " " + hour + ':' + minute;
  149. }
  150. this.barindex = options.index
  151. if (this.barindex == 3) {
  152. this.isjigou = true
  153. } else {
  154. this.isjigou = false
  155. }
  156. console.log(options)
  157. },
  158. onShow() {
  159. this.gettime()
  160. this.getdoctorInfo()
  161. },
  162. mounted() {
  163. },
  164. data() {
  165. return {
  166. doctorid: "",
  167. doctor: {},
  168. shadowStyle: {
  169. backgroundImage: "none"
  170. },
  171. isjigou: false,
  172. barindex: 1, //显示按钮
  173. daytime: "",
  174. multiSelector: [],
  175. show: false,
  176. istime: false,
  177. hospital: "",
  178. address: "",
  179. distance: "",
  180. jigouid: "",
  181. year: "",
  182. yearid: "",
  183. isphone: false,
  184. istuwen: false,
  185. ismenzhen: false,
  186. loading: true,
  187. }
  188. },
  189. methods: {
  190. getdoctorInfo: async function() {
  191. let res = await this.$request.post("/api/v1/docter/docterDetail", {
  192. docter_id: this.doctorid,
  193. latitude: uni.getStorageSync("latitude"),
  194. longitude: uni.getStorageSync("longitude")
  195. })
  196. if (res) {
  197. this.loading = false;
  198. }
  199. this.doctor = res
  200. this.doctor.is_chat != 0 ? this.istuwen = false : this.istuwen = true,
  201. this.doctor.is_phone != 0 ? this.isphone = false : this.isphone = true,
  202. this.doctor.is_appoint != 0 || this.multiSelector.length != 0 ? this.ismenzhen = false : this.ismenzhen = true
  203. },
  204. submitCollect: async function(e) {
  205. let res = await this.$request.post("/api/v1/collection/submitCollect", {
  206. type: 1,
  207. relation_id: e.currentTarget.dataset.id
  208. })
  209. let status = user.islogin(res)
  210. if (status) {
  211. if (res.data.is_collect == 0) {
  212. uni.showToast({
  213. title: "取消成功",
  214. icon: "none"
  215. })
  216. this.doctor.is_collect = res.data.is_collect
  217. } else {
  218. uni.showToast({
  219. title: "关注成功",
  220. icon: "none"
  221. })
  222. this.doctor.is_collect = res.data.is_collect
  223. }
  224. }
  225. },
  226. gettime: async function() {
  227. this.multiSelector = []
  228. let res = await this.$request.post("/api/v1/docter/schedulePeriodList", {
  229. docter_id: this.doctorid
  230. })
  231. if (res.status == 0) {
  232. console.log(res)
  233. if (res.data.data.length != 0) {
  234. let nian = res.data.data.map(item => {
  235. return item.schedule_date
  236. })
  237. let time = res.data.data.map(item => {
  238. return item.schedule_period.map(itm => {
  239. return { ...itm.time_period,
  240. ...itm.organization
  241. }
  242. })
  243. })
  244. time[0].forEach(item => {
  245. item.start_time_period = item.start_time_period + '-' + item.end_time_period
  246. })
  247. this.multiSelector.push(nian)
  248. this.multiSelector.push(time[0])
  249. }
  250. }
  251. },
  252. gotoxuanze(e) {
  253. if (e.currentTarget.dataset.istrue == 0) {
  254. uni.showToast({
  255. title: "该医生暂未开通服务",
  256. icon: "none",
  257. duration: 1500
  258. })
  259. return false
  260. }
  261. this.barindex = e.currentTarget.dataset.index
  262. if (this.barindex == 3) {
  263. this.isjigou = true
  264. } else {
  265. this.isjigou = false
  266. }
  267. },
  268. phonezixun() {
  269. uni.navigateTo({
  270. url: "info_write?doctor=" + JSON.stringify(this.doctor) + "&type=" + this.barindex + "&time=" + this.daytime +
  271. "&hospital=" + this.hospital + "&jigou=" + this.jigouid + "&year=" + this.year + "&yearid=" + this.yearid
  272. })
  273. },
  274. xuantime() {
  275. if (this.multiSelector.length != 0) {
  276. this.show = !this.show
  277. } else {
  278. uni.showToast({
  279. title: "该医生暂未排班",
  280. icon: "none"
  281. })
  282. }
  283. },
  284. callbacktime(arr) {
  285. this.daytime = this.multiSelector[0][arr[0]] + " " + this.multiSelector[1][arr[1]].start_time_period
  286. this.hospital = this.multiSelector[1][arr[1]].name
  287. this.address = this.multiSelector[1][arr[1]].address
  288. this.jigouid = this.multiSelector[1][arr[1]].id
  289. this.year = this.multiSelector[0][arr[0]]
  290. this.yearid = this.multiSelector[1][arr[1]].id
  291. this.distance = parseInt(this.multiSelector[1][arr[1]].distance) / 1000
  292. }
  293. }
  294. };
  295. </script>
  296. <style scoped>
  297. @import url("../index/mine.css");
  298. .gridstyle {
  299. height: 340rpx;
  300. background-color: #fff;
  301. border-radius: 16rpx;
  302. margin-top: 30rpx;
  303. box-shadow: 0 0 50rpx 0 rgba(0, 0, 0, 0.1);
  304. }
  305. .det-body {
  306. z-index: 1;
  307. padding-top: 80rpx;
  308. }
  309. .det-bg-img {
  310. position: absolute;
  311. top: 0;
  312. left: 0;
  313. right: 0;
  314. z-index: 1;
  315. display: block;
  316. width: 100%;
  317. height: 267rpx;
  318. }
  319. .det-head {
  320. z-index: 2;
  321. box-shadow: 0 0 50rpx 0 rgba(248, 151, 164, 0.13);
  322. }
  323. .det-attention {
  324. position: absolute;
  325. display: block;
  326. bottom: -22rpx;
  327. right: 50%;
  328. z-index: 1;
  329. width: 128rpx;
  330. height: auto;
  331. margin-right: -64rpx;
  332. padding: 4rpx 0;
  333. background-color: #F897A1;
  334. box-sizing: border-box;
  335. }
  336. .det-attention.active {
  337. background-color: #E6E6E6;
  338. }
  339. .det-item {
  340. width: calc((100% - 120rpx) / 4);
  341. }
  342. .det-item.active {
  343. background-color: rgba(255, 123, 114, 0.24);
  344. }
  345. .det-item .text {
  346. color: rgba(0, 0, 0, 0.54);
  347. }
  348. .det-item .price {
  349. color: rgba(0, 0, 0, 0.40);
  350. }
  351. .det-item.active .text,
  352. .det-item.active .price {
  353. color: #FF979C;
  354. }
  355. .det-item.disabled .text,
  356. .det-item.disabled .price {
  357. color: rgba(0, 0, 0, 0.3);
  358. }
  359. .button-reset {
  360. height: 102rpx;
  361. background: none !important;
  362. color: rgba(0, 0, 0, 0.54) !important;
  363. }
  364. button::after {
  365. border: none;
  366. }
  367. .button-reset::after {
  368. border: none;
  369. }
  370. .package-list {
  371. width: 100%;
  372. height: 178rpx;
  373. overflow: hidden;
  374. }
  375. .package-list .warp {
  376. white-space: nowrap;
  377. overflow: scroll;
  378. }
  379. .package-list .warp .list {
  380. background: red;
  381. display: inline-block;
  382. font-size: 14px;
  383. width: 266rpx;
  384. height: 178rpx;
  385. background: linear-gradient(270deg, rgba(255, 100, 101, 1) 0%, rgba(255, 148, 133, 1) 100%);
  386. box-shadow: 0px 3px 5px 0px rgba(255, 110, 110, 0.5);
  387. border-radius: 8rpx;
  388. margin-right: 18rpx;
  389. padding: 30rpx 20rpx 24rpx 20rpx;
  390. overflow: hidden;
  391. }
  392. .package-list .warp .list:nth-child(3) {
  393. margin-right: 0;
  394. }
  395. .package-list .warp .list .name {
  396. font-size: 30rpx;
  397. font-weight: 500;
  398. color: rgba(255, 255, 255, 1);
  399. line-height: 30rpx;
  400. }
  401. .package-list .warp .list .desc {
  402. font-size: 24rpx;
  403. font-weight: 400;
  404. color: rgba(255, 255, 255, .87);
  405. margin-top: 16rpx;
  406. line-height: 24rpx;
  407. }
  408. .package-list .warp .list .price {
  409. font-size: 24rpx;
  410. font-weight: 500;
  411. color: rgba(255, 255, 255, 1);
  412. margin-top: 30rpx;
  413. line-height: 24rpx;
  414. }
  415. .det-desc {
  416. height: 40px;
  417. overflow: hidden;
  418. }
  419. .det-desc.active {
  420. height: auto;
  421. }
  422. .follow_style {
  423. position: absolute;
  424. bottom: -12rpx;
  425. left: 8rpx;
  426. z-index: 1;
  427. width: 106rpx;
  428. height: 40rpx;
  429. padding: 4rpx 0;
  430. background-color: rgb(208, 105, 150);
  431. box-sizing: border-box;
  432. color: #fff;
  433. text-align: center;
  434. border-radius: 60rpx;
  435. font-size: 24rpx;
  436. display: flex;
  437. justify-content: center;
  438. align-items: center;
  439. }
  440. </style>