placeAnOrder.vue 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589
  1. <template>
  2. <!-- 订单页面容器 -->
  3. <view class="order-box">
  4. <view class="hospital-box">
  5. <image :src="hospitalInfo.logoUrl" mode="aspectFill"></image>
  6. <view class="hospital-info">
  7. <view class="hospital-name">{{hospitalInfo.name || '-'}}</view>
  8. <view class="hospital-address">
  9. <u-icon name="map-fill" color="#999999" size="14"></u-icon>
  10. <span class="address">{{hospitalInfo.address || '-'}}</span>
  11. </span>
  12. </view>
  13. <!-- <view class="hospital-area">所在区:{{hospitalInfo.areaName || '-'}}</view> -->
  14. </view>
  15. </view>
  16. <view class="hospital-form">
  17. <!-- 用u-form写一个表单,包括所在科室(为一个选择器,内容为1,2,3),房床号,订单备注,就诊人,服务产品,期望时间,下单数量 -->
  18. <u--form labelWidth="150rpx" :model="form" :rules="rules" ref="uForm" :error-type="errorType">
  19. <view class="form-item">
  20. <u-form-item label="所在科室" prop="department" @click="showDepartment = true;" required borderBottom>
  21. <u--input :border="none" disabled v-model="form.department" disabledColor="#ffffff"
  22. placeholder="请选择" inputAlign="right" />
  23. <u-icon slot="right" name="arrow-right"></u-icon>
  24. </u-form-item>
  25. <u-form-item label="房床号" prop="roomNumber" required borderBottom>
  26. <u--input v-model="form.roomNumber" placeholder="请输入房号与床号" :border="none" inputAlign="right" />
  27. </u-form-item>
  28. <u-form-item label="订单备注" prop="remarks" style="margin: 20rpx 0;" labelPosition="top">
  29. <u-textarea ref="textarea" count maxlength="50" v-model="form.remarks"
  30. placeholder="请输入客户或订单特殊情况,可留空"></u-textarea>
  31. </u-form-item>
  32. </view>
  33. <view class="form-item">
  34. <u-form-item label="就诊人" prop="patient" @click="toPage" required>
  35. <u--input :border="none" disabled v-model="form.patient" disabledColor="#ffffff"
  36. placeholder="请选择" inputAlign="right" />
  37. <u-icon slot="right" name="arrow-right"></u-icon>
  38. </u-form-item>
  39. </view>
  40. <view class="form-item">
  41. <u-form-item label="服务产品" prop="serviceName" @click="toServicePage" required borderBottom>
  42. <u--input :border="none" disabled v-model="form.serviceName" disabledColor="#ffffff"
  43. placeholder="请选择" inputAlign="right" />
  44. <u-icon slot="right" name="arrow-right"></u-icon>
  45. </u-form-item>
  46. <u-form-item label="期望时间" prop="expectedTimeFormat" @click="showTimePicker = true;" borderBottom
  47. required>
  48. <u--input :border="none" disabled v-model="form.expectedTimeFormat" disabledColor="#ffffff"
  49. placeholder="请选择服务开始时间" inputAlign="right" />
  50. <u-icon slot="right" name="arrow-right"></u-icon>
  51. <u-datetime-picker :show="showTimePicker" v-model="form.expectedTime" mode="datetime"
  52. @confirm=selectTime @cancel="showTimePicker = false"></u-datetime-picker>
  53. </u-form-item>
  54. <u-form-item label="下单数量" prop="orderNum" required>
  55. <view class="flex-box-r">
  56. <u-number-box v-model="form.orderNum" @change="valChange" :max="999"></u-number-box>
  57. <span style="margin-left: 20rpx;">{{getUnitTxt(unitName) || ''}}</span>
  58. </view>
  59. </u-form-item>
  60. </view>
  61. </u--form>
  62. <u-action-sheet :show="showDepartment" :actions="actions" title="请选择科室" description="必选项"
  63. @close="showDepartment = false" @select="departmentSelect">
  64. </u-action-sheet>
  65. </view>
  66. <!-- 多选框的服务协议 -->
  67. <view class="agreement-box">
  68. <u-checkbox-group v-model="checked" @change="checkboxChange">
  69. <u-checkbox size="16" shape="square" labelSize="12" active-color="#4B91D1" label="我已阅读并同意" la
  70. labelColor="#999999" name="true"></u-checkbox>
  71. </u-checkbox-group>
  72. <view class="agreement" @click="toPrivacy('service_protocol')">《服务协议》</view>
  73. </view>
  74. <view class="tips flex-box-cloum">
  75. <span>润康优护服务公司为您提供服务</span>
  76. </view>
  77. <view class="submit-box flex-box-c-b">
  78. <view class="price-box">
  79. <span class="txt">金额:</span>
  80. <span class="price">¥{{price}}</span>
  81. </view>
  82. <view class="submit-btn" @click="submit">确认下单</view>
  83. </view>
  84. <u-popup :overlayStyle="{'touch-action':'none'}" closeable mode="bottom" :show="popShow" @close="popClose"
  85. @open="open" :round="20">
  86. <view class="pop-box">
  87. <view class="title-box">
  88. 服务协议
  89. </view>
  90. <scroll-view class="scroll-content" scroll-y @scroll="handleScroll">
  91. <view v-html="agreementContent"></view>
  92. </scroll-view>
  93. <view class="line-progress">
  94. <u-line-progress height="12" :percentage="percentage" activeColor="#4B91D1"></u-line-progress>
  95. </view>
  96. <view class="btn-box">
  97. <span class="btn" :class="readed?'active':''" @click="confirm">我已确认</span>
  98. </view>
  99. </view>
  100. </u-popup>
  101. </view>
  102. </template>
  103. <script>
  104. import {
  105. addOrder,
  106. getDepartmentList,
  107. getPrivacy,
  108. getServiceUnit,
  109. getDefaultPatient
  110. } from '@/api/order.js'
  111. import {
  112. getHospitalInfo
  113. } from '@/api/home.js'
  114. export default {
  115. data() {
  116. return {
  117. percentage: 0,
  118. agreement: '',
  119. popShow: false,
  120. checked: false,
  121. // 表单数据
  122. form: {
  123. hospitalId: '',
  124. department: '',
  125. hospitalDepartmentId: '',
  126. roomNumber: '',
  127. remarks: '',
  128. patient: '',
  129. patientId: '',
  130. serviceName: '',
  131. serviceId: '',
  132. expectedTime: Number(new Date()),
  133. orderNum: 1
  134. },
  135. price: '0.00',
  136. // 表单验证规则
  137. rules: {
  138. department: [{
  139. required: true,
  140. message: '请选择所在科室',
  141. trigger: ['change', 'blur']
  142. }],
  143. roomNumber: [{
  144. required: true,
  145. message: '请输入房床号',
  146. trigger: ['change', 'blur']
  147. }],
  148. // remarks: [{
  149. // required: true,
  150. // message: '请输入订单备注',
  151. // trigger: ['change', 'blur']
  152. // }],
  153. patient: [{
  154. required: true,
  155. message: '请选择就诊人',
  156. trigger: ['change', 'blur']
  157. }],
  158. serviceName: [{
  159. required: true,
  160. message: '请选择服务产品',
  161. trigger: ['change', 'blur']
  162. }],
  163. expectedTimeFormat: [{
  164. required: true,
  165. message: '请输入期望时间',
  166. trigger: ['change', 'blur']
  167. }],
  168. // orderNum: [{
  169. // required: true,
  170. // message: '请输入下单数量',
  171. // trigger: ['change']
  172. // }]
  173. },
  174. errorType: ['toast'],
  175. showDepartment: false,
  176. showTimePicker: false,
  177. actions: [],
  178. hospitalInfo: {},
  179. readed: false,
  180. agreementContent: '',
  181. unitName: null,
  182. unitList: [],
  183. };
  184. },
  185. onLoad(option) {
  186. let that = this;
  187. if (option.id) {
  188. this.getHospitalInfo(option.id)
  189. }
  190. this.getServiceUnit();
  191. this.getDefaultInfo();
  192. uni.$on('returnService', function(data) {
  193. that.form.serviceName = data.name;
  194. that.form.serviceId = data.id;
  195. that.price = data.sellingPrice;
  196. that.unitName = data.serviceUnit;
  197. });
  198. uni.$on('returnPatient', function(data) {
  199. that.form.patient = data.name;
  200. that.form.patientId = data.id;
  201. });
  202. },
  203. onReady() {
  204. let that = this;
  205. that.$refs.uForm.setRules(this.rules);
  206. // 如果需要兼容微信小程序的话,需要用此写法
  207. that.$refs.textarea.setFormatter((value) => {
  208. if (value.length >= 50) {
  209. return value.substr(0, 50)
  210. } else {
  211. return value
  212. }
  213. })
  214. },
  215. methods: {
  216. //获取医院详情
  217. getHospitalInfo(id) {
  218. let that = this;
  219. getHospitalInfo(id).then(res => {
  220. if (res.code == 200) {
  221. that.hospitalInfo = res.data;
  222. that.form.hospitalId = that.hospitalInfo.id
  223. that.getDepartmentList()
  224. }
  225. })
  226. },
  227. //获取默认就诊人
  228. getDefaultInfo() {
  229. let that = this;
  230. getDefaultPatient().then(res => {
  231. if (res.code == 200) {
  232. let data = res.data;
  233. that.form.patient = data.name+ '(' + data.mobile +')';
  234. that.form.patientId = data.id;
  235. }
  236. })
  237. },
  238. //滚动协议
  239. handleScroll(e) {
  240. //根据。agreement-content 的滚动条的进度,设置百分比
  241. let scrollHeight = e.detail.scrollHeight;
  242. let scrollTop = e.detail.scrollTop;
  243. this.percentage = ((scrollTop / (scrollHeight - 400)) * 100).toFixed(0);
  244. if (this.percentage >= 100) {
  245. this.readed = true
  246. } else {
  247. this.readed = false
  248. }
  249. },
  250. getUnitTxt(value) {
  251. let obj = this.unitList.find(item => item.code == value);;
  252. return obj ? obj.value : ''
  253. },
  254. //查询订单状态
  255. getServiceUnit() {
  256. let that = this;
  257. getServiceUnit().then(res => {
  258. if (res.code == 200) {
  259. this.unitList = res.data.serviceUnit;
  260. }
  261. })
  262. .catch((err) => {
  263. console.log(err);
  264. })
  265. },
  266. //获取科室列表
  267. getDepartmentList() {
  268. let that = this;
  269. let param = {
  270. hospitalId: that.form.hospitalId
  271. };
  272. getDepartmentList(param).then(res => {
  273. if (res.code == 200) {
  274. this.actions = res.data
  275. }
  276. })
  277. },
  278. // 提交表单
  279. submit() {
  280. let that = this;
  281. if (!that.checked) {
  282. uni.showToast({
  283. title: '请先阅读并同意服务协议',
  284. icon: 'none'
  285. })
  286. return
  287. }
  288. this.$refs.uForm.validate().then((res) => {
  289. if (res) {
  290. // 提交表单
  291. that.open();
  292. } else {
  293. console.log('表单验证失败');
  294. }
  295. })
  296. },
  297. confirm() {
  298. addOrder(this.form).then(res => {
  299. if (res.code == 200) {
  300. uni.showToast({
  301. title: '下单成功',
  302. icon: 'success'
  303. })
  304. setTimeout(() => {
  305. this.popShow = false;
  306. //跳转订单页面传递参数
  307. getApp().globalData.switchTabParams = {
  308. reload: 'reload'
  309. };
  310. uni.switchTab({
  311. url: '/pages/tabBar/order',
  312. })
  313. }, 1000)
  314. }
  315. })
  316. },
  317. //选择时间
  318. selectTime(e) {
  319. this.form.expectedTime = e.value
  320. this.form.expectedTimeFormat = this.$utils.mFormatDate(e.value, 'yyyy-MM-dd HH:mm')
  321. this.showTimePicker = false
  322. },
  323. //选择科室
  324. departmentSelect(e) {
  325. this.form.department = e.name;
  326. this.form.hospitalDepartmentId = e.id;
  327. this.showDepartment = false;
  328. this.$refs.uForm.validateField('hospitalDepartmentId')
  329. },
  330. //数量
  331. valChange(e) {
  332. this.form.orderNum = e.value
  333. },
  334. //选择同意协议
  335. checkboxChange(e) {
  336. console.log('当前值为: ' + e)
  337. if (e) {
  338. this.checked = true
  339. } else {
  340. this.checked = false
  341. }
  342. },
  343. //去选择服务
  344. toServicePage() {
  345. uni.navigateTo({
  346. url: '/pages/order/chooseService'
  347. })
  348. },
  349. //去就诊人页面
  350. toPage() {
  351. uni.setStorageSync('patientType', 'order')
  352. uni.navigateTo({
  353. url: '/pages/mine/patient/patient'
  354. })
  355. },
  356. // 打开协议弹窗
  357. open() {
  358. let that = this;
  359. that.popShow = true;
  360. getPrivacy({
  361. code: 'service_protocol'
  362. }).then(res => {
  363. if (res.code == 200) {
  364. that.agreementContent = res.data.protocolContent.replace(/\<img/gi,
  365. '<img style="max-width:100%;height:auto" ');
  366. }
  367. })
  368. },
  369. toPrivacy(type) {
  370. uni.navigateTo({
  371. url: '/pages/mine/agreement?type=service_protocol'
  372. })
  373. },
  374. popClose() {
  375. this.percentage = 0;
  376. this.popShow = false;
  377. },
  378. },
  379. onUnload() {
  380. uni.$off('returnService');
  381. uni.$off('returnPatient');
  382. },
  383. }
  384. </script>
  385. <style lang="scss" scoped>
  386. .order-box {
  387. background-color: #f6f6f6;
  388. padding: 20rpx 20rpx 200rpx;
  389. .hospital-box {
  390. display: flex;
  391. align-items: center;
  392. padding: 20rpx;
  393. background-color: #fff;
  394. border-radius: 10rpx;
  395. image {
  396. width: 180rpx;
  397. height: 172rpx;
  398. border-radius: 10rpx;
  399. margin-right: 20rpx;
  400. }
  401. .hospital-info {
  402. flex: 1;
  403. .hospital-name {
  404. word-break: break-all;
  405. font-size: 28rpx;
  406. font-weight: bold;
  407. }
  408. .hospital-address {
  409. display: flex;
  410. justify-content: flex-start;
  411. align-items: flex-start;
  412. width: 100%;
  413. font-size: 26rpx;
  414. color: #666;
  415. margin-top: 20rpx;
  416. font-weight: 500;
  417. line-height: 35rpx;
  418. overflow: hidden; //超出的文本隐藏
  419. text-overflow: ellipsis; //溢出用省略号显示
  420. white-space: normal; //处理元素中的 空白
  421. display: -webkit-box;
  422. -webkit-line-clamp: 2;
  423. -webkit-box-orient: vertical;
  424. display: -moz-box;
  425. -moz-line-clamp: 2;
  426. -moz-box-orient: vertical;
  427. overflow-wrap: break-word;
  428. word-break: break-all;
  429. ::v-deep .u-icon {
  430. display: inline-block;
  431. }
  432. .address {
  433. font-size: 28rpx;
  434. margin-left: 5rpx;
  435. color: #999999;
  436. }
  437. }
  438. .hospital-area {
  439. font-size: 24rpx;
  440. color: #999;
  441. }
  442. }
  443. }
  444. .hospital-form {
  445. margin-top: 20rpx;
  446. border-radius: 10rpx;
  447. .form-item {
  448. padding: 20rpx 30rpx;
  449. margin-bottom: 20rpx;
  450. background-color: #fff;
  451. border-radius: 10rpx;
  452. }
  453. }
  454. .agreement-box {
  455. display: flex;
  456. align-items: center;
  457. justify-content: center;
  458. margin-top: 20rpx;
  459. .agreement {
  460. font-size: 22rpx;
  461. margin-left: 10rpx;
  462. color: #2979ff;
  463. }
  464. }
  465. .tips {
  466. margin-top: 20rpx;
  467. color: #666666;
  468. font-size: 22rpx;
  469. }
  470. .pop-box {
  471. padding: 0 40rpx;
  472. .title-box {
  473. padding: 30rpx 0;
  474. width: 100%;
  475. text-align: center;
  476. }
  477. .scroll-content {
  478. padding: 20rpx;
  479. width: 100%;
  480. box-sizing: border-box;
  481. height: 400px;
  482. border: 1rpx solid #f6f6f6;
  483. }
  484. .line-progress {
  485. padding: 20rpx 0;
  486. }
  487. .btn-box {
  488. margin-bottom: 40rpx;
  489. .btn {
  490. display: block;
  491. width: 100%;
  492. height: 72rpx;
  493. text-align: center;
  494. line-height: 72rpx;
  495. background-color: #999;
  496. color: #fff;
  497. border-radius: 40rpx;
  498. }
  499. .active {
  500. background-color: #4B91D1;
  501. }
  502. }
  503. }
  504. .submit-box {
  505. position: fixed;
  506. bottom: 0;
  507. left: 0;
  508. right: 0;
  509. background-color: #fff;
  510. padding: 40rpx 20rpx;
  511. box-shadow: 0 -2rpx 10rpx rgba(0, 0, 0, 0.1);
  512. .price-box {
  513. font-size: 32rpx;
  514. .txt {
  515. color: #666;
  516. }
  517. .price {
  518. color: #ff0000;
  519. }
  520. }
  521. .submit-btn {
  522. padding: 20rpx 40rpx;
  523. background-color: #2979ff;
  524. color: #fff;
  525. width: 200rpx;
  526. border-radius: 40rpx;
  527. text-align: center;
  528. font-size: 24rpx;
  529. }
  530. }
  531. ::v-deep .u-textarea {
  532. margin-top: 20rpx;
  533. }
  534. }
  535. </style>