diff --git a/banban-mini/src/pages/bind/index.scss b/banban-mini/src/pages/bind/index.scss
index b1937ed..674f2a6 100644
--- a/banban-mini/src/pages/bind/index.scss
+++ b/banban-mini/src/pages/bind/index.scss
@@ -68,6 +68,41 @@
position: relative;
}
+.pending-device-card {
+ margin: 0 48px 48px;
+ background: #FFFFFF;
+ border-radius: 24px;
+ padding: 48px 40px;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ box-shadow: 0 4px 20px rgba(0, 0, 0, 0.06);
+}
+
+.pending-device-title {
+ font-size: 34px;
+ font-weight: 700;
+ color: #1A1A1A;
+ margin-bottom: 14px;
+}
+
+.pending-device-id {
+ max-width: 100%;
+ font-size: 28px;
+ color: #FF8C42;
+ font-weight: 600;
+ word-break: break-all;
+ text-align: center;
+ margin-bottom: 12px;
+}
+
+.pending-device-desc {
+ font-size: 26px;
+ color: #666666;
+ text-align: center;
+ line-height: 1.5;
+}
+
.scan-frame {
background: #FFFFFF;
border-radius: 24px;
diff --git a/banban-mini/src/pages/bind/index.tsx b/banban-mini/src/pages/bind/index.tsx
index 3c36ad9..b3f9bc8 100644
--- a/banban-mini/src/pages/bind/index.tsx
+++ b/banban-mini/src/pages/bind/index.tsx
@@ -350,26 +350,37 @@ export default function Bind() {
{isPendingBinding ? '补全绑定' : '扫码贴卡绑定设备'}
-
-
+ {isPendingBinding ? (
+
-
- {!canEditDeviceFields ? '请先完成儿童资料' : isScanning ? '正在扫码...' : '点击扫码'}
-
-
- {!canEditDeviceFields ? '先选儿童,再扫设备二维码' : '扫描设备二维码或条码'}
-
+ 关联现有设备
+ {pendingDeviceId}
+ 选择已有孩子,或新建孩子后完成关联
+ ) : (
+
+
+
+
+
+
+ {!canEditDeviceFields ? '请先完成儿童资料' : isScanning ? '正在扫码...' : '点击扫码'}
+
+
+ {!canEditDeviceFields ? '先选儿童,再扫设备二维码' : '扫描设备二维码或条码'}
+
+
-
-
-
-
-
+
+
+
+
+
+
-
+ )}
@@ -413,12 +424,17 @@ export default function Bind() {
- {children.length > 0
- ? '可以选已有儿童,也可以在这里新建一个儿童后再绑定设备'
- : '当前还没有儿童资料,请先创建一个儿童资料'}
+ {isPendingBinding
+ ? children.length > 0
+ ? '可以选已有儿童,也可以新建一个儿童后关联当前设备'
+ : '当前还没有儿童资料,请先创建一个儿童资料后关联设备'
+ : children.length > 0
+ ? '可以选已有儿童,也可以在这里新建一个儿童后再绑定设备'
+ : '当前还没有儿童资料,请先创建一个儿童资料'}
+ {!isPendingBinding && (
设备信息
@@ -457,6 +473,7 @@ export default function Bind() {
)}
+ )}
{systemBanner}
diff --git a/banban-mini/src/pages/sleep/index.tsx b/banban-mini/src/pages/sleep/index.tsx
index eb26657..c0fe2d0 100644
--- a/banban-mini/src/pages/sleep/index.tsx
+++ b/banban-mini/src/pages/sleep/index.tsx
@@ -68,6 +68,7 @@ export default function Sleep() {
const [showDeleteChildModal, setShowDeleteChildModal] = useState(false)
const [showRoleModal, setShowRoleModal] = useState(false)
const [showFamilyModal, setShowFamilyModal] = useState(false)
+ const [showAssignDeviceModal, setShowAssignDeviceModal] = useState(false)
const [modalType, setModalType] = useState<'add' | 'edit'>('add')
const [childName, setChildName] = useState('')
const [editingChildId, setEditingChildId] = useState(null)
@@ -334,9 +335,17 @@ export default function Sleep() {
const handleOpenAddChildFromSwitch = () => {
setShowChildModal(false)
+ setShowAssignDeviceModal(false)
handleOpenModal('add')
}
+ const handleAssignExistingDevice = (targetBinding: BindingListItem) => {
+ if (!targetBinding?.device_id) return
+ setSelectedBindingDeviceId(targetBinding.device_id)
+ setShowAssignDeviceModal(false)
+ Taro.navigateTo({ url: '/pages/bind/index' })
+ }
+
const handleSubmitModal = async () => {
const normalizedName = childName.trim()
if (!normalizedName) {
@@ -544,6 +553,11 @@ export default function Sleep() {
return
}
+ if (item.name === '关联现有设备') {
+ setShowAssignDeviceModal(true)
+ return
+ }
+
if (item.name === '绑定设备') {
if (!currentChild) {
handleOpenModal('add')
@@ -584,6 +598,7 @@ export default function Sleep() {
}
const parentDisplayName = parentInfo.nickname?.trim() || '家长'
+ const unassignedBindings = bindings.filter((item) => item.device_id && item.child_id === null)
const currentFirmwareLabel = firmwareStatus?.current_version || '--'
const latestFirmwareLabel = firmwareStatus?.latest_version || '--'
const currentUserId = getCurrentUserId()
@@ -637,6 +652,15 @@ export default function Sleep() {
arrow: true,
disabled: children.length === 0,
},
+ ...(unassignedBindings.length > 0
+ ? [{
+ icon: require('../../assets/tab-icons/rings.png'),
+ iconBgClass: 'green',
+ name: '关联现有设备',
+ value: `${unassignedBindings.length} 台待关联`,
+ arrow: true,
+ }]
+ : []),
{
icon: require('../../assets/tab-icons/rings.png'),
iconBgClass: 'green',
@@ -856,6 +880,48 @@ export default function Sleep() {
)}
+ {showAssignDeviceModal && (
+ setShowAssignDeviceModal(false)}>
+ {
+ event.stopPropagation()
+ }}
+ >
+ 关联现有设备
+ {unassignedBindings.length === 0 ? (
+ 当前没有待关联设备
+ ) : (
+
+ {unassignedBindings.map((item) => (
+ handleAssignExistingDevice(item)}
+ >
+
+ {item.device_id}
+ 待关联
+
+ 未关联孩子
+
+ ))}
+
+ )}
+
+
+ + 新增孩子
+
+
+
+ setShowAssignDeviceModal(false)}>
+ 关闭
+
+
+
+
+ )}
+
{showModal && (