{
  "subject": "餐盘微信扫码绑盘：微信扫码进入小程序并绑定当前人员",
  "description": "## 需求背景\n\n现有智慧营养健康餐厅系统已经具备人盘绑定能力，主要依赖绑盘机、个人二维码或会员卡触发。现场希望进一步降低用户操作门槛：用户直接用微信扫描餐盘上的二维码，即可进入小程序，将餐盘绑定到当前微信登录人员的基础信息，用于后续称重台识别人员、账户余额、餐次和营养摄入。\n\n本需求按 V2 版本落地：微信扫码餐盘二维码自动进入小程序绑盘页，并完成当前人员绑盘。\n\n## 需求目标\n\n- 餐盘上粘贴微信小程序码，微信扫码后自动打开小程序绑盘页。\n- 小程序通过二维码 scene 识别餐盘、企业和餐厅信息。\n- 系统优先恢复微信小程序登录态；未登录用户登录或授权后继续绑盘。\n- 绑定时以后端登录态识别当前用户和人员档案，前端不传可信 staff_uuid。\n- 绑定成功后复用现有餐盘绑定表和就餐订单创建逻辑。\n- 后台支持二维码生成、下载、停用、重新生成，便于现场运维。\n\n## 本期范围\n\n- 新增微信扫码餐盘小程序码直达小程序绑盘页。\n- 新增餐盘二维码 token 映射表。\n- 新增小程序餐盘绑定页面 settlement/plate/bind。\n- 新增小程序接口封装 api/plate.js。\n- 后端扩展 api/controller/Plate.php，提供二维码解析、绑定详情和当前用户绑盘接口。\n- 后台支持生成、下载、停用、重新生成餐盘小程序码。\n- 复用现有余额校验、餐次判断、ydy_staff_plate 和绑定订单创建逻辑。\n\n## 二维码生成规则\n\n正式使用微信小程序码：\n\n```text\npage = settlement/plate/bind\nscene = t:plate,k:{qr_token},v:1\n```\n\n示例：\n\n```text\nt:plate,k:8F3K9D2A,v:1\n```\n\n字段说明：\n\n| 字段 | 说明 |\n| --- | --- |\n| t | 二维码类型，固定为 plate |\n| k | 后端生成的二维码 token |\n| v | 二维码规则版本，当前为 1 |\n\nqr_token 要求：随机生成，不使用自增 ID；建议 8 到 16 位；同一 token 全局唯一；后台可停用、重新生成。\n\n## 核心业务流程\n\n1. 用户微信扫描餐盘小程序码。\n2. 微信打开小程序 settlement/plate/bind，并携带 scene。\n3. 小程序解析 scene 得到 qr_token。\n4. 调用 plate/resolveQr 校验二维码有效性，并获取 plate_code、enterprise_no、restaurant_id。\n5. 小程序设置企业上下文并恢复微信小程序登录态。\n6. 未登录用户完成登录或手机号授权后回到绑盘页。\n7. 页面展示餐盘编号、当前人员、部门、餐次、余额等信息。\n8. 用户确认绑定，调用 plate/mpBind。\n9. 后端按当前登录态识别人员档案，执行余额、餐次、餐盘占用等校验。\n10. 写入或更新 ydy_staff_plate，并复用现有绑定订单创建逻辑。\n11. 页面展示绑定成功、已绑定本人、已绑定他人、余额不足等结果。\n\n## 后台配置说明\n\n- 小程序 AppId、AppSecret、页面路径 settlement/plate/bind。\n- 二维码 scene 版本 v=1。\n- 二维码 token 长度、有效期、状态。\n- 企业与餐厅维度的二维码生成权限。\n- 餐盘二维码打印尺寸和下载格式。\n- 是否展示余额、是否允许本人重复确认绑定、是否允许管理员覆盖绑定。\n\n## 验收要点\n\n- 微信扫描餐盘二维码可打开小程序指定绑盘页。\n- scene 能正确解析并定位餐盘、企业、餐厅。\n- 未登录用户登录后能回到当前绑盘流程，不丢失二维码参数。\n- 当前登录用户已关联人员档案时，可以确认绑定餐盘。\n- 前端不传可信 staff_uuid，人员身份以后端登录态为准。\n- 餐盘已绑定本人时展示已绑定详情，不重复创建异常绑定。\n- 餐盘已绑定他人时普通用户不可覆盖。\n- 二维码停用、过期、不存在、企业不匹配时有明确错误提示。\n- 后台可批量生成、下载、停用、重新生成餐盘小程序码。\n- 不影响既有绑盘机、个人二维码、会员卡等原有绑盘流程。\n\n## PRD 与原型资料\n\n- PRD HTML 目标外网地址：https://zhctpmt.yyangpt.cn/modules/product/products/smart-canteen/requirements/2026-07-01-plate-wechat-scan-bind/prd/plate-wechat-scan-bind-prd.html\n- PRD Markdown 目标外网地址：https://zhctpmt.yyangpt.cn/modules/product/products/smart-canteen/requirements/2026-07-01-plate-wechat-scan-bind/prd/plate-wechat-scan-bind-prd.md\n- 页面原型目标外网地址：https://zhctpmt.yyangpt.cn/product_plate_scan_bind/prototypes/plate-scan-bind-prototype.html\n- V2 落地实施方案目标外网地址：https://zhctpmt.yyangpt.cn/product_plate_scan_bind/docs/V2%E5%BE%AE%E4%BF%A1%E6%89%AB%E7%A0%81%E7%BB%91%E7%9B%98%E8%90%BD%E5%9C%B0%E5%AE%9E%E6%96%BD%E6%96%B9%E6%A1%88.md\n\n> 发布说明：PRD 和原型已在本地 zhctprompt 生成；当前外网文档站发布受限，SSH 发布到 101.200.165.56 被拒绝，Codeup 远端认证也失败。以上路径为公司文档站规范路径，发布权限恢复后可直接访问，无需调整需求内容。\n\n## 本地资料路径\n\n- PRD HTML：modules/product/products/smart-canteen/requirements/2026-07-01-plate-wechat-scan-bind/prd/plate-wechat-scan-bind-prd.html\n- PRD Markdown：modules/product/products/smart-canteen/requirements/2026-07-01-plate-wechat-scan-bind/prd/plate-wechat-scan-bind-prd.md\n- 页面原型：product_plate_scan_bind/prototypes/plate-scan-bind-prototype.html\n- V2 落地实施方案：product_plate_scan_bind/docs/V2微信扫码绑盘落地实施方案.md\n",
  "descriptionFormat": "MARKDOWN",
  "formatType": "MARKDOWN",
  "assignedTo": "635755195dc8531eeb2e33d9",
  "participant": [
    "635755195dc8531eeb2e33d9"
  ],
  "status": "100005",
  "space": "dd2f708d1702891ff45b6f5d99",
  "spaceIdentifier": "dd2f708d1702891ff45b6f5d99",
  "spaceType": "Project",
  "category": "Req",
  "workitemType": "9uy29901re573f561d69jn40",
  "viewSpaceId": "dd2f708d1702891ff45b6f5d99",
  "spaceId": "dd2f708d1702891ff45b6f5d99",
  "workitemTypeId": "9uy29901re573f561d69jn40",
  "workItemTypeId": "9uy29901re573f561d69jn40",
  "workitemTypeIdentifier": "9uy29901re573f561d69jn40",
  "assigneeName": "兰海军",
  "participantNames": [
    "兰海军"
  ]
}