专注小程序 / APP 开发,用代码改变生活

获取方案
石家庄分站 主站首页 北京分站 石家庄分站 唐山分站 保定分站 廊坊分站 沧州分站 郑州分站

排队取号小程序开发实战方案

小程序开发 2026-09-25 8 阅读 0 点赞 原创

为什么排队取号值得做成小程序

线下门店、政务大厅、医院、餐饮等场景都离不开排队。传统发号机成本高、维护麻烦,用户还得站在现场等。用微信小程序做排队取号,用户扫码即用,无需下载,商家也省去硬件投入。本文给出一套可落地的排队取号小程序开发功能方案,并附关键代码思路。

核心功能模块拆解

1. 用户端:取号与进度查看

  • 扫码进入小程序,自动识别当前门店/队列
  • 选择业务类型(如“个人业务”“企业业务”)后点击取号
  • 展示号码、前方等待人数、预计等待时间
  • 叫号提醒:通过订阅消息推送“即将到号”
  • 过号处理:支持重新激活或作废

2. 商家端:叫号与队列管理

  • 叫号台:点击“下一位”自动呼叫队首
  • 暂停/恢复队列、设置窗口数量
  • 手动调整优先级(如老人、军人优先)
  • 数据看板:今日取号量、平均等待时长、过号率

3. 后台管理

  • 多门店、多队列配置
  • 营业时间与放号规则(定时放号、限量放号)
  • 黑名单与防刷号机制

技术选型与数据模型

推荐使用微信小程序原生开发或 Taro,后端用 Node.js + Express 或云开发。核心表结构:

// 队列表 queue
{
  _id: "queue_001",
  shopId: "shop_001",
  name: "综合业务",
  prefix: "A",
  currentNumber: 12,
  nextNumber: 13,
  status: "active" // active | paused | closed
}

// 取号记录表 ticket
{
  _id: "ticket_001",
  queueId: "queue_001",
  userId: "openid_xxx",
  number: "A013",
  status: "waiting", // waiting | called | done | missed
  createTime: 1710000000,
  calledTime: null
}

关键逻辑实现

取号接口(防并发重复)

使用数据库原子自增保证号码唯一,避免多人同时取号拿到相同号码。

// 云函数:takeNumber
const db = cloud.database()
const _ = db.command
exports.main = async (event) => {
  const { queueId, openid } = event
  // 原子自增并返回更新后的文档
  const res = await db.collection('queue')
    .doc(queueId)
    .update({
      data: { nextNumber: _.inc(1) }
    })
  const queue = await db.collection('queue').doc(queueId).get()
  const number = queue.data.prefix + String(queue.data.nextNumber).padStart(3, '0')
  await db.collection('ticket').add({
    data: {
      queueId,
      userId: openid,
      number,
      status: 'waiting',
      createTime: Date.now()
    }
  })
  return { number }
}

叫号与订阅消息

叫号时更新当前号码,并给队首用户发送订阅消息。注意:订阅消息需用户主动授权,建议在取号时引导授权“叫号提醒”。

// 叫号:将队首 ticket 标记为 called
async function callNext(queueId) {
  const ticket = await db.collection('ticket')
    .where({ queueId, status: 'waiting' })
    .orderBy('createTime', 'asc')
    .limit(1)
    .get()
  if (!ticket.data.length) return
  const t = ticket.data[0]
  await db.collection('ticket').doc(t._id).update({
    data: { status: 'called', calledTime: Date.now() }
  })
  // 发送订阅消息
  await cloud.openapi.subscribeMessage.send({
    touser: t.userId,
    templateId: 'YOUR_TEMPLATE_ID',
    data: { thing1: { value: t.number }, thing2: { value: '请到3号窗口' } }
  })
}

体验优化与防坑建议

  • 预计等待时间:用“最近10个号平均办理时长 × 前方人数”动态计算,比固定值更准。
  • 过号策略:建议叫号后保留15分钟,超时自动标记 missed,用户可申请重新排队。
  • 防刷号:同一 openid 在同一队列未完成前限制取号次数,结合手机号验证。
  • 离线兜底:商家端网络异常时,允许本地缓存队列并手动补录。
  • 合规:收集手机号需明示用途,订阅消息模板需审核通过。

总结

排队取号小程序开发并不复杂,难点在于并发取号的原子性、叫号实时性和用户提醒的触达率。按上面的功能方案先做 MVP:取号、叫号、进度查看三个核心闭环,再逐步加上多门店、数据看板和防刷机制。一套代码可同时服务餐饮、政务、医院等多种场景,是独立开发者值得尝试的垂直方向。

石家庄小程序开发费用到底花在哪?报名小程序开发:从0到1落地方案与功能拆解

评论 (0)

还没有评论,快来抢沙发吧~

好想法,值得被认真交付

从小程序、APP 到全栈网站,一站式把想法变成可落地的产品

微信咨询

微信扫码,直接沟通需求