9.23提交

This commit is contained in:
zoujiandong
2025-09-23 19:00:32 +08:00
parent ae08b222af
commit 70eeb19867
70 changed files with 3187 additions and 140 deletions
+178
View File
@@ -0,0 +1,178 @@
<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>