2025-09-23 19:00:32 +08:00

179 lines
6.6 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<view class="edit-address-page">
<navBar :title="pageTitle" />
<view class="form-container">
<!-- 医院输入联想搜索 -->
<view class="form-item">
<view class="label">医院 <text class="required">*</text></view>
<view class="value full">
<input class="input" v-model.trim="form.hospital_name" placeholder="请输入医院名称" @input="onHospitalInput" @keydown.enter.prevent="onHospitalEnter" />
<view v-if="showHospitalList" class="suggestion">
<view v-for="h in hospitalList" :key="h.uuid" class="suggestion-item" @click="pickHospital(h)">
{{ h.name }}
</view>
<view v-if="hospitalList.length===0" class="suggestion-empty">无匹配医院</view>
</view>
</view>
</view>
<!-- 分割线 -->
<view class="divider"></view>
<!-- 科室 -->
<view class="form-item">
<view class="label">科室 <text class="required">*</text></view>
<view class="value">
<input class="input" v-model.trim="form.office_name" placeholder="请输入科室" />
</view>
</view>
<view class="divider"></view>
<!-- 地址 -->
<view class="form-item">
<view class="label">地址 <text class="required">*</text></view>
<view class="value">
<input class="input" v-model.trim="form.location" placeholder="请输入地址" />
</view>
</view>
<view class="divider big"></view>
<!-- 门诊类型 -->
<view class="form-item column">
<view class="label">门诊类型 <text class="required">*</text></view>
<view class="type-row">
<view class="type-btn" :class="{active: form.type==1}" @click="selectType(1)">普通门诊</view>
<view class="type-btn" :class="{active: form.type==2}" @click="selectType(2)">专家门诊</view>
<view class="type-btn" :class="{active: form.type==3}" @click="selectType(3)">特需门诊</view>
<view class="type-btn" :class="{active: form.type==4}" @click="selectType(4)">专科/专病门诊</view>
</view>
</view>
</view>
<view class="bottom-actions">
<view class="submit-btn" @click="submit">
<text class="btn-text">{{form.uuid?'确定修改':'确定新增'}}</text>
</view>
</view>
</view>
</template>
<script setup>
import { ref } from 'vue'
import { onLoad } from '@dcloudio/uni-app'
import navBar from '@/components/navBar/navBar.vue'
import api from '@/api/api.js'
const pageTitle = ref('新增执业地点')
const form = ref({
hospital_uuid: '',
hospital_name: '',
office_name: '',
location: '',
type: 4
})
const selectType = (t) => { form.value.type = t }
// 医院联想搜索
const hospitalList = ref([])
const showHospitalList = ref(false)
let hospitalTimer = null
const onHospitalInput = (e) => {
showHospitalList.value = true
if (hospitalTimer) clearTimeout(hospitalTimer)
hospitalTimer = setTimeout(() => {
fetchHospitals(e.detail.value || form.value.hospital_name)
}, 300)
}
const onHospitalEnter = () => {
fetchHospitals(form.value.hospital_name)
}
const fetchHospitals = async (keyword) => {
if (!keyword) { hospitalList.value = []; return }
const res = await api.getHospitalList({ name: keyword })
if (res && res.code === 200) {
hospitalList.value = res.data || []
}
}
const pickHospital = (h) => {
form.value.hospital_uuid = h.uuid
form.value.hospital_name = h.name
showHospitalList.value = false
}
const validate = () => {
if (!form.value.hospital_name) return '请选择医院'
if (!form.value.office_name) return '请输入科室'
if (!form.value.location) return '请输入地址'
if (!form.value.type) return '请选择门诊类型'
return ''
}
const submit = async () => {
const err = validate()
if (err) { uni.showToast({ title: err, icon: 'none' }); return }
// 示例更新接口;若不存在可替换为新增或本地处理
try {
const res =form.value.uuid?await api.updateWorkPlace(form.value) : await api.addWorkPlace(form.value)
if (res.code === 200) {
let title = form.value.uuid ? '修改成功' : '新增成功'
uni.showToast({ title: title, icon: 'none' })
uni.navigateBack()
}
} catch (e) {
uni.showToast({ title: '提交失败', icon: 'none' })
}
}
onLoad((options) => {
// 支持从列表/详情传参回填
if (options) {
if(options.uuid){
form.value.uuid = options.uuid;
form.value.type = options.type;
form.value.hospital_uuid = options.hospital_uuid;
form.value.hospital_name = options.hospital_name;
form.value.office_name = options.office_name;
form.value.location = options.location;
}
if(options.uuid){
pageTitle.value = '修改执业地点'
}
}
})
</script>
<style lang="scss" scoped>
.edit-address-page { min-height: 100vh; background: #fff; }
.form-container { padding: 24rpx; }
.form-item { display: flex; align-items: center; justify-content: space-between; padding: 24rpx 0; }
.form-item.column { flex-direction: column; align-items: flex-start; }
.label { font-size: 30rpx; color: #333; }
.required { color: #8B2316; margin-left: 6rpx; }
.value { flex: 1; margin-left: 24rpx; }
.value.full { width: 100%; margin-left: 0; position: relative; }
.value-text { font-size: 30rpx; color: #333; }
.value-text.placeholder { color: #999; }
.input { width: 100%; font-size: 30rpx; color: #333; }
.suggestion { position: absolute; top: 84rpx; left: 0; right: 0; background: #fff; border: 2rpx solid #eee; border-radius: 10rpx; max-height: 480rpx; overflow-y: auto; z-index: 10; }
.suggestion-item { padding: 20rpx 24rpx; font-size: 28rpx; color: #333; border-bottom: 2rpx solid #f5f5f5; }
.suggestion-item:last-child { border-bottom: 0; }
.suggestion-empty { padding: 20rpx 24rpx; font-size: 26rpx; color: #999; }
.divider { height: 2rpx; background: #eee; }
.divider.big { margin-top: 10rpx; }
.type-row { display: grid; grid-template-columns: repeat(4, 1fr); gap: 20rpx; margin-top: 20rpx; width: 100%; }
.type-btn { text-align: center; border: 2rpx solid #ddd; border-radius: 12rpx; height: 96rpx; line-height: 96rpx; color: #999; font-size: 24rpx;}
.type-btn.active { border-color: #8B2316; color: #8B2316; background: url('@/static/addoutpa_true.png') right bottom/39rpx 39rpx no-repeat; }
.bottom-actions { position: fixed; left: 0; right: 0; bottom: 0; background: #fff; padding: 30rpx; border-top: 1rpx solid #eee; }
.submit-btn { background: #8B2316; border-radius: 12rpx; padding: 24rpx 0; text-align: center; }
.btn-text { color: #fff; font-size: 32rpx; font-weight: 600; }
</style>