<template>
|
|
<view class="page__view">
|
|
|
|
<navbar title="检测预约" leftClick @leftClick="$utils.navigateBack" color="#191919" bgColor="#F3F2F7" />
|
|
|
|
<view class="main">
|
|
|
|
<view class="card">
|
|
<view class="card-header">{{ typeDesc }}</view>
|
|
<view class="flex row">
|
|
<view class="row-label">联系电话</view>
|
|
<view class="row-content">{{ configList.customer_service_phone || '-' }}</view>
|
|
</view>
|
|
</view>
|
|
|
|
<view class="card">
|
|
<view class="card-header">预约信息</view>
|
|
<view class="form">
|
|
<uv-form
|
|
ref="form"
|
|
:model="form"
|
|
errorType="toast"
|
|
>
|
|
<!-- 自采 -->
|
|
<template v-if="type == 0">
|
|
<view class="form-item">
|
|
<uv-form-item prop="addressData" :customStyle="formItemStyle">
|
|
<view class="form-item-label">寄送地址</view>
|
|
<view class="form-item-content">
|
|
<view class="flex row" @click="jumpToSelectAddress">
|
|
<view v-if="form.addressData" class="text">{{ getAddressDesc(form.addressData) }}</view>
|
|
<view v-else class="text placeholder">请选择内容</view>
|
|
<uv-icon name="arrow-right" color="#C6C6C6" size="32rpx"></uv-icon>
|
|
</view>
|
|
</view>
|
|
</uv-form-item>
|
|
</view>
|
|
</template>
|
|
<!-- 上门 -->
|
|
<template v-else-if="type == 1">
|
|
<view class="form-item">
|
|
<uv-form-item prop="addressData" :customStyle="formItemStyle">
|
|
<view class="form-item-label">体检地址</view>
|
|
<view class="form-item-content">
|
|
<view class="flex row" @click="jumpToSelectAddress">
|
|
<view v-if="form.addressData" class="text">{{ getAddressDesc(form.addressData) }}</view>
|
|
<view v-else class="text placeholder">请选择内容</view>
|
|
<uv-icon name="arrow-right" color="#C6C6C6" size="32rpx"></uv-icon>
|
|
</view>
|
|
</view>
|
|
</uv-form-item>
|
|
</view>
|
|
<view class="form-item">
|
|
<uv-form-item prop="date" :customStyle="formItemStyle">
|
|
<view class="form-item-label">预约日期</view>
|
|
<view class="form-item-content">
|
|
<view class="flex row" @click="openDatePicker">
|
|
<view v-if="form.date" class="text">{{ $dayjs(form.date).format('YYYY-MM-DD') }}</view>
|
|
<view v-else class="text placeholder">请选择内容</view>
|
|
<uv-icon name="arrow-right" color="#C6C6C6" size="32rpx"></uv-icon>
|
|
</view>
|
|
<uv-datetime-picker
|
|
ref="datetimePicker"
|
|
v-model="form.date"
|
|
mode="date"
|
|
title="预约日期"
|
|
confirmColor="#7451DE"
|
|
cancelColor="#8B8B8B"
|
|
round="32rpx"
|
|
:minDate="minTime"
|
|
@confirm="onDateChange"
|
|
></uv-datetime-picker>
|
|
</view>
|
|
</uv-form-item>
|
|
</view>
|
|
<view class="form-item">
|
|
<uv-form-item prop="timeRange" :customStyle="formItemStyle">
|
|
<view class="form-item-label">预约时段</view>
|
|
<view class="form-item-content">
|
|
<view class="flex row" @click="openTimePicker">
|
|
<view v-if="form.timeRange" class="text">{{ form.timeRange.join('~') }}</view>
|
|
<view v-else class="text placeholder">请选择内容</view>
|
|
<uv-icon name="arrow-right" color="#C6C6C6" size="32rpx"></uv-icon>
|
|
</view>
|
|
<uv-picker
|
|
ref="timeRangePicker"
|
|
:columns="timeColumns"
|
|
:defaultIndex="[0, 0]"
|
|
title="预约时段"
|
|
confirmColor="#7451DE"
|
|
cancelColor="#8B8B8B"
|
|
round="32rpx"
|
|
@change="onTimeRangeColChange"
|
|
@confirm="onTimeRangeChange"
|
|
></uv-picker>
|
|
</view>
|
|
</uv-form-item>
|
|
</view>
|
|
</template>
|
|
<!-- 到店 -->
|
|
<template v-else-if="type == 2">
|
|
<view class="form-item">
|
|
<uv-form-item prop="date" :customStyle="formItemStyle">
|
|
<view class="form-item-label">预约日期</view>
|
|
<view class="form-item-content">
|
|
<view class="flex row" @click="openDatePicker">
|
|
<view v-if="form.date" class="text">{{ $dayjs(form.date).format('YYYY-MM-DD') }}</view>
|
|
<view v-else class="text placeholder">请选择内容</view>
|
|
<uv-icon name="arrow-right" color="#C6C6C6" size="32rpx"></uv-icon>
|
|
</view>
|
|
<uv-datetime-picker
|
|
ref="datetimePicker"
|
|
v-model="form.date"
|
|
mode="date"
|
|
title="预约日期"
|
|
confirmColor="#7451DE"
|
|
cancelColor="#8B8B8B"
|
|
round="32rpx"
|
|
:minDate="minTime"
|
|
@confirm="onDateChange"
|
|
></uv-datetime-picker>
|
|
</view>
|
|
</uv-form-item>
|
|
</view>
|
|
<view class="form-item">
|
|
<uv-form-item prop="timeRange" :customStyle="formItemStyle">
|
|
<view class="form-item-label">预约时段</view>
|
|
<view class="form-item-content">
|
|
<view class="flex row" @click="openTimePicker">
|
|
<view v-if="form.timeRange" class="text">{{ form.timeRange.join('~') }}</view>
|
|
<view v-else class="text placeholder">请选择内容</view>
|
|
<uv-icon name="arrow-right" color="#C6C6C6" size="32rpx"></uv-icon>
|
|
</view>
|
|
<uv-picker
|
|
ref="timeRangePicker"
|
|
:columns="timeColumns"
|
|
:defaultIndex="[0, 0]"
|
|
title="预约时段"
|
|
confirmColor="#7451DE"
|
|
cancelColor="#8B8B8B"
|
|
round="32rpx"
|
|
@change="onTimeRangeColChange"
|
|
@confirm="onTimeRangeChange"
|
|
></uv-picker>
|
|
</view>
|
|
</uv-form-item>
|
|
</view>
|
|
<view class="form-item">
|
|
<uv-form-item prop="hospitalId" :customStyle="formItemStyle">
|
|
<view class="form-item-label">预约医院</view>
|
|
<view class="form-item-content">
|
|
<view class="flex row" @click="openHospitalPicker">
|
|
<view v-if="form.hospitalId" class="text">{{ getHospitalDesc(form.hospitalId) }}</view>
|
|
<view v-else class="text placeholder">请选择内容</view>
|
|
<uv-icon name="arrow-right" color="#C6C6C6" size="32rpx"></uv-icon>
|
|
</view>
|
|
<uv-picker
|
|
ref="hospitalPicker"
|
|
:columns="[hospitalOptions]"
|
|
keyName="label"
|
|
title="预约医院"
|
|
confirmColor="#7451DE"
|
|
cancelColor="#8B8B8B"
|
|
round="32rpx"
|
|
@confirm="onHospitalChange"
|
|
></uv-picker>
|
|
</view>
|
|
</uv-form-item>
|
|
</view>
|
|
<view class="form-item">
|
|
<uv-form-item prop="name" :customStyle="formItemStyle">
|
|
<view class="form-item-label">姓名</view>
|
|
<view class="form-item-content input">
|
|
<formInput v-model="form.name" placeholder="请输入内容"></formInput>
|
|
</view>
|
|
</uv-form-item>
|
|
</view>
|
|
<view class="form-item">
|
|
<uv-form-item prop="phone" :customStyle="formItemStyle">
|
|
<view class="form-item-label">联系方式</view>
|
|
<view class="form-item-content input">
|
|
<formInput v-model="form.phone" placeholder="请输入内容"></formInput>
|
|
</view>
|
|
</uv-form-item>
|
|
</view>
|
|
</template>
|
|
</uv-form>
|
|
</view>
|
|
</view>
|
|
|
|
</view>
|
|
|
|
<view class="bottom">
|
|
<button class="btn" @click="onSubmit">提交预约</button>
|
|
</view>
|
|
|
|
</view>
|
|
</template>
|
|
|
|
<script>
|
|
import { mapState } from 'vuex'
|
|
|
|
import formInput from '@/pages_order/components/formInput.vue'
|
|
|
|
// 可选预约类型 0自采,1上门,2到店,3已取消
|
|
const SUBSCRIBE_TYPE_AND_DESC_MAPPING = {
|
|
0: '自采',
|
|
1: '上门',
|
|
2: '到店',
|
|
3: '已取消',
|
|
}
|
|
|
|
export default {
|
|
components: {
|
|
formInput,
|
|
},
|
|
data() {
|
|
return {
|
|
id: null,
|
|
productId: null,
|
|
type: null,
|
|
info: {},
|
|
form: {
|
|
addressData: null,
|
|
date: null,
|
|
timeRange: null,
|
|
hospitalId: null,
|
|
name: null,
|
|
phone: null,
|
|
},
|
|
formItemStyle: { padding: 0 },
|
|
minTime: new Date().getTime(),
|
|
hours: [],
|
|
timeColumns: [],
|
|
hospitalOptions: []
|
|
}
|
|
},
|
|
computed: {
|
|
...mapState(['configList', 'userInfo', 'payOrderProduct', 'addressInfo']),
|
|
typeDesc() {
|
|
const desc = SUBSCRIBE_TYPE_AND_DESC_MAPPING[this.type] || ''
|
|
|
|
return `${desc}检测`
|
|
},
|
|
},
|
|
onShow() {
|
|
if (this.addressInfo) {
|
|
const {
|
|
id,
|
|
name,
|
|
phone,
|
|
province,
|
|
city,
|
|
district,
|
|
detail,
|
|
} = this.addressInfo
|
|
|
|
this.form.addressData = {
|
|
id,
|
|
name,
|
|
phone,
|
|
area: [province, city, district].filter(val => val),
|
|
address: detail,
|
|
}
|
|
|
|
this.$store.commit('setAddressInfo', null)
|
|
}
|
|
},
|
|
async onLoad(arg) {
|
|
const { id, type } = arg
|
|
this.id = id
|
|
this.type = parseInt(type)
|
|
|
|
await this.getData(id)
|
|
|
|
if (this.type == 2) { // 到店
|
|
this.fetchHospitalOptions()
|
|
}
|
|
},
|
|
onReady() {
|
|
this.setRules()
|
|
},
|
|
onUnload() {
|
|
this.$store.commit('setAddressInfo', null)
|
|
},
|
|
methods: {
|
|
async getData(id) {
|
|
try {
|
|
const result = await this.$fetch('getSubscribeDetail', { id })
|
|
const {
|
|
productId,
|
|
name,
|
|
phone,
|
|
sendAddressId,
|
|
sendAddress,
|
|
sendAddressDetail,
|
|
subscribeDate,
|
|
subscribeTime,
|
|
hospitalId,
|
|
} = result
|
|
|
|
|
|
this.form = {
|
|
addressData: {
|
|
id: sendAddressId,
|
|
name,
|
|
phone,
|
|
area: [sendAddress],
|
|
address: sendAddressDetail,
|
|
},
|
|
date: new Date(subscribeDate).getTime(),
|
|
timeRange: subscribeTime ? JSON.parse(subscribeTime) : null,
|
|
hospitalId,
|
|
name,
|
|
phone,
|
|
}
|
|
|
|
this.productId = productId
|
|
|
|
} catch (err) {
|
|
|
|
}
|
|
},
|
|
async fetchHospitalOptions() {
|
|
try {
|
|
const result = await this.$fetch('getSubscribeHospital', { productId: this.productId })
|
|
|
|
this.hospitalOptions = result.map(item => {
|
|
const { id, name } = item
|
|
|
|
return { id, label: name }
|
|
})
|
|
} catch (err) {
|
|
|
|
}
|
|
},
|
|
setRules() {
|
|
let rules = {}
|
|
|
|
switch(this.type) {
|
|
case 0: // 自采
|
|
rules = {
|
|
'addressData': {
|
|
type: 'object',
|
|
required: true,
|
|
message: '请选择寄送地址',
|
|
},
|
|
}
|
|
break
|
|
case 1: // 上门
|
|
rules = {
|
|
'addressData': {
|
|
type: 'object',
|
|
required: true,
|
|
message: '请选择体检地址',
|
|
},
|
|
'date': {
|
|
type: 'number',
|
|
required: true,
|
|
message: '请选择预约日期',
|
|
},
|
|
'timeRange': {
|
|
type: 'array',
|
|
required: true,
|
|
message: '请选择预约时段',
|
|
},
|
|
}
|
|
this.setTimeColumns()
|
|
break
|
|
case 2: // 到店
|
|
rules = {
|
|
'date': {
|
|
type: 'number',
|
|
required: true,
|
|
message: '请选择预约日期',
|
|
},
|
|
'timeRange': {
|
|
type: 'array',
|
|
required: true,
|
|
message: '请选择预约时段',
|
|
},
|
|
'hospitalId': {
|
|
type: 'string',
|
|
required: true,
|
|
message: '请选择预约医院',
|
|
},
|
|
'name': {
|
|
type: 'string',
|
|
required: true,
|
|
message: '请输入姓名',
|
|
},
|
|
'phone': {
|
|
type: 'string',
|
|
required: true,
|
|
message: '请输入联系方式',
|
|
},
|
|
}
|
|
this.setTimeColumns()
|
|
break
|
|
default:
|
|
break
|
|
}
|
|
|
|
this.$refs.form.setRules(rules);
|
|
},
|
|
getAddressDesc(data) {
|
|
if (!data) {
|
|
return ''
|
|
}
|
|
const { area, address } = data
|
|
|
|
return `${area?.join?.('') || ''}${address}`
|
|
},
|
|
getHospitalDesc() {
|
|
|
|
},
|
|
fixedZero(num) {
|
|
return `${num < 10 ? '0' + num : num}`
|
|
},
|
|
setTimeColumns(date) {
|
|
let currentTime = this.$dayjs()
|
|
let startHour = 8
|
|
let endHour = 22
|
|
|
|
if (date && this.$dayjs(date).isSame(currentTime, 'day')) {
|
|
|
|
let currentHour = currentTime.hour()
|
|
|
|
if (currentHour > endHour) {
|
|
this.timeColumns = []
|
|
return
|
|
}
|
|
|
|
if (currentHour > startHour) {
|
|
startHour = currentHour
|
|
}
|
|
|
|
if (startHour == endHour) {
|
|
this.timeColumns = []
|
|
return
|
|
}
|
|
|
|
}
|
|
|
|
this.hours = new Array(endHour - startHour + 1).fill(startHour).map((val, idx) => val + idx)
|
|
|
|
let startCols = this.hours.slice(0, this.hours.length - 1).map(hour => `${this.fixedZero(hour)}:00`)
|
|
let endCols = this.hours.slice(1).map(hour => `${this.fixedZero(hour)}:00`)
|
|
|
|
this.timeColumns = [startCols, endCols]
|
|
this.$refs.timeRangePicker.setColumnValues(0, startCols)
|
|
this.$refs.timeRangePicker.setColumnValues(1, endCols)
|
|
},
|
|
openTimePicker() {
|
|
this.$refs.timeRangePicker.open();
|
|
},
|
|
onTimeRangeColChange(e) {
|
|
if (e.columnIndex == 0) {
|
|
let startIdx = e.indexs[0]
|
|
let endCols = startIdx == this.hours.length - 1 ? [] : this.hours.slice(startIdx + 1).map(hour => `${this.fixedZero(hour)}:00`)
|
|
|
|
this.timeColumns[1] = endCols
|
|
this.$refs.timeRangePicker.setColumnValues(1, endCols)
|
|
}
|
|
},
|
|
onTimeRangeChange(e) {
|
|
this.form.timeRange = e.value
|
|
const [startTime, endTime] = this.form.timeRange
|
|
let startIdx = startTime ? this.timeColumns[0].findIndex(item => item === startTime) : 0
|
|
let endIdx = endTime ? this.timeColumns[1].findIndex(item => item === endTime) : 0
|
|
this.$refs.timeRangePicker.setIndexs([startIdx, endIdx], true);
|
|
},
|
|
openDatePicker() {
|
|
this.$refs.datetimePicker.open();
|
|
},
|
|
onDateChange(e) {
|
|
const date = e.value
|
|
|
|
this.setTimeColumns(date)
|
|
|
|
const [startTime] = this.form.timeRange || []
|
|
let dateStr = this.$dayjs(date).format('YYYY-MM-DD')
|
|
|
|
if (startTime && this.$dayjs(`${dateStr} ${startTime}`).isBefore(this.$dayjs())) {
|
|
this.form.timeRange = null
|
|
this.$refs.datetimePicker.setIndexs([0, 0]);
|
|
}
|
|
|
|
},
|
|
openHospitalPicker() {
|
|
this.$refs.hospitalPicker.open();
|
|
},
|
|
onHospitalChange(e) {
|
|
this.form.hospitalId = e.value[0].id
|
|
},
|
|
getHospitalDesc(id) {
|
|
return this.hospitalOptions.find(item => item.id === id)?.label
|
|
},
|
|
jumpToSelectAddress() {
|
|
this.$utils.navigateTo('/pages_order/address/addressList')
|
|
},
|
|
async onSubmit() {
|
|
try {
|
|
await this.$refs.form.validate()
|
|
|
|
const params = {
|
|
id: this.id,
|
|
}
|
|
|
|
if (this.type == 0) { // 自采
|
|
const { addressData } = this.form
|
|
const {
|
|
id: sendAddressId,
|
|
name,
|
|
phone,
|
|
area,
|
|
address,
|
|
} = addressData
|
|
|
|
params.sendAddressId = sendAddressId || ''
|
|
params.sendAddress = area.join('')
|
|
params.sendAddressDetail = address
|
|
params.name = name
|
|
params.phone = phone
|
|
} else if (this.type == 1) { // 上门
|
|
const { addressData, date, timeRange } = this.form
|
|
const {
|
|
id: sendAddressId,
|
|
name,
|
|
phone,
|
|
area,
|
|
address,
|
|
} = addressData
|
|
|
|
params.sendAddressId = sendAddressId || ''
|
|
params.sendAddress = area.join('')
|
|
params.sendAddressDetail = address
|
|
params.name = name
|
|
params.phone = phone
|
|
params.subscribeDate = this.$dayjs(date).format('YYYY-MM-DD')
|
|
params.subscribeTime = JSON.stringify(timeRange)
|
|
} else if (this.type == 2) { // 到店
|
|
const { date, timeRange, hospitalId, name, phone } = this.form
|
|
params.subscribeDate = this.$dayjs(date).format('YYYY-MM-DD')
|
|
params.subscribeTime = JSON.stringify(timeRange)
|
|
params.hospitalId = hospitalId
|
|
params.name = name
|
|
params.phone = phone
|
|
}
|
|
|
|
await this.$fetch('submitOrUpdateSubscribe', params)
|
|
|
|
uni.showToast({
|
|
icon: 'success',
|
|
title: '提交成功',
|
|
});
|
|
|
|
setTimeout(() => {
|
|
this.$utils.redirectTo(`/pages_order/checkup/checkupBook/detail?id=${this.id}`)
|
|
}, 800)
|
|
|
|
|
|
} catch (err) {
|
|
console.log('onSubmit err', err)
|
|
}
|
|
},
|
|
},
|
|
}
|
|
</script>
|
|
|
|
<style scoped lang="scss">
|
|
@import './style.scss';
|
|
|
|
</style>
|