diff --git a/pages/appointment/appointment.js b/pages/appointment/appointment.js index b24c076..3585d39 100644 --- a/pages/appointment/appointment.js +++ b/pages/appointment/appointment.js @@ -15,17 +15,13 @@ Page({ date: '', time: '', hostName: '', - hostId: '', - personId: '', area: '', plateNumber: '' }, - areas: [], - departments: [], - areaIndex: -1, - persons: [], - personNames: [], - personIndex: -1, + areaOptions: [], + selectedAreas: {}, + selectedAreasDisplay: '', + showAreaDropdown: false, today: '', timeStart: '', timeEnd: '', @@ -47,23 +43,16 @@ Page({ }, initPage() { - // 使用本地时区获取当天日期,用于 picker 最小日期限制 const today = formatDate(new Date()) this.setData({ today }) - this.loadDepartments() + this.loadAreaOptions() }, - async loadDepartments() { + async loadAreaOptions() { try { const list = await appointmentDB.getDepartmentSelector() - const departments = list.map(item => ({ - departmentCode: item.departmentCode, - departmentName: item.departmentName - })) - this.setData({ - departments, - areas: departments.map(d => d.departmentName) - }) + const areaOptions = list.map(item => item.departmentName) + this.setData({ areaOptions }) } catch (err) { console.error('获取拜访区域列表失败', err) wx.showToast({ title: '获取拜访区域失败', icon: 'none' }) @@ -131,58 +120,21 @@ Page({ } }, - onAreaChange(e) { - const index = Number(e.detail.value) - const department = this.data.departments[index] - const departmentCode = department ? department.departmentCode : '' + toggleAreaDropdown() { + this.setData({ showAreaDropdown: !this.data.showAreaDropdown }) + }, + + toggleArea(e) { + const value = e.currentTarget.dataset.value + const selectedAreas = { ...this.data.selectedAreas } + selectedAreas[value] = !selectedAreas[value] + const display = Object.keys(selectedAreas).filter(k => selectedAreas[k]).join('、') this.setData({ - areaIndex: index, - 'form.area': department ? department.departmentName : '', - 'form.hostId': '', - 'form.hostName': '', - 'form.personId': '', - persons: [], - personNames: [], - personIndex: -1 + selectedAreas, + selectedAreasDisplay: display, + 'form.area': display }) - if (departmentCode) { - this.loadPersons(departmentCode) - } - }, - - async loadPersons(department) { - wx.showLoading({ title: '加载被访人中...' }) - try { - const list = await appointmentDB.getPersonSelector(department) - const persons = list.map(item => ({ - personId: item.personId, - personName: item.personName, - personId: item.personId - })) - this.setData({ - persons, - personNames: persons.map(p => p.personName), - personIndex: -1 - }) - } catch (err) { - console.error('获取被访人列表失败', err) - wx.showToast({ title: '获取被访人列表失败', icon: 'none' }) - } finally { - wx.hideLoading() - } - }, - - onPersonChange(e) { - const index = Number(e.detail.value) - const person = this.data.persons[index] - if (person && person.personId) { - this.setData({ - personIndex: index, - 'form.hostId': person.personId, - 'form.hostName': person.personName, - 'form.personId': person.personId - }) - } + this._clearFieldError('area') }, onDateChange(e) { @@ -212,7 +164,7 @@ Page({ }, validateForm() { - const { name, phone, company, reason, date, time, hostName, area } = this.data.form + const { name, phone, company, reason, date, time, area } = this.data.form if (!name.trim()) { wx.showToast({ title: '请输入访客姓名', icon: 'none' }) return false @@ -237,10 +189,6 @@ Page({ wx.showToast({ title: '请选择来访时间', icon: 'none' }) return false } - if (!hostName.trim()) { - wx.showToast({ title: '请选择被访人', icon: 'none' }) - return false - } if (!area) { wx.showToast({ title: '请选择拜访区域', icon: 'none' }) return false diff --git a/pages/appointment/appointment.wxml b/pages/appointment/appointment.wxml index 8576855..3311841 100644 --- a/pages/appointment/appointment.wxml +++ b/pages/appointment/appointment.wxml @@ -73,28 +73,38 @@ 被访人信息 - + 拜访区域* - - - {{areaIndex >= 0 ? areas[areaIndex] : '请选择拜访区域'}} - + + + + {{selectedAreasDisplay || '请选择拜访区域'}} + + + + + + + + {{item}} + + - - - - 被访人* - - - {{personIndex >= 0 ? personNames[personIndex] : '请选择被访人'}} - - - - - 请先选择拜访区域 + {{fieldErrors.area}} + + + + 被访人 + + + + + + 接待人 + + - diff --git a/pages/appointment/appointment.wxss b/pages/appointment/appointment.wxss index 19e4373..84e8af9 100644 --- a/pages/appointment/appointment.wxss +++ b/pages/appointment/appointment.wxss @@ -123,6 +123,76 @@ page { color: #b8c9db; } +.form-input-disabled { + color: #999; +} + +.form-group-area { + flex-wrap: wrap; +} + +.multi-select-wrap { + position: relative; + flex: 1; +} + +.multi-select-trigger { + display: flex; + align-items: center; + justify-content: space-between; + height: 88rpx; +} + +.multi-select-dropdown { + position: absolute; + top: 88rpx; + left: 0; + right: 0; + background: #fff; + border: 1rpx solid #e8eef5; + border-radius: 12rpx; + box-shadow: 0 8rpx 24rpx rgba(0, 0, 0, 0.1); + z-index: 100; + padding: 8rpx 0; +} + +.checkbox-item { + display: flex; + align-items: center; + padding: 20rpx 24rpx; +} + +.checkbox { + width: 40rpx; + height: 40rpx; + border: 2rpx solid #d0d8e4; + border-radius: 8rpx; + display: flex; + align-items: center; + justify-content: center; + margin-right: 16rpx; + flex-shrink: 0; +} + +.checkbox-checked { + background: #5b9bd5; + border-color: #5b9bd5; +} + +.checkbox-icon { + color: #fff; + font-size: 24rpx; +} + +.checkbox-label { + font-size: 28rpx; + color: #2c3e50; +} + +.arrow-up { + transform: rotate(90deg); +} + .submit-wrap { position: fixed; bottom: 0;