|
|
@@ -0,0 +1,350 @@
|
|
|
+---
|
|
|
+name: hdApp 生日赠礼模块
|
|
|
+overview: 在 hdApp + mallApp + biz-hd/biz-mall 全栈实现客户生日赠礼管理:工作台摘要栏、生日看板、赠礼统计、明日一键短信、mallApp 短链领取、云小票打印,并扩展会员等级页的生日权益配置。新建业务表 xhBirthdayGift;24h 过期用 RabbitMQ x-delay 延时队列(复用 limitBuyDelayExchange),不用 console 扫表。
|
|
|
+todos:
|
|
|
+ - id: sql-schema
|
|
|
+ content: 编写 xhBirthdayGift CREATE TABLE 与 xhMemberLevel ALTER SQL
|
|
|
+ status: completed
|
|
|
+ - id: biz-hd-birthday
|
|
|
+ content: 实现 BirthdayGiftClass + BirthdayGiftController(摘要/看板/统计/通知/MQ延时过期/打印)
|
|
|
+ status: completed
|
|
|
+ - id: member-level-api
|
|
|
+ content: 扩展 MemberLevelController 与 level.vue 卡片化(discount/birthdayBenefit/benefitDesc)
|
|
|
+ status: completed
|
|
|
+ - id: hdapp-ui
|
|
|
+ content: mall-home-panel 最近生日栏 + board + giftStats 页面与 API
|
|
|
+ status: completed
|
|
|
+ - id: biz-mall-claim
|
|
|
+ content: mall 端 token 领取 API + 领取后触发云打印
|
|
|
+ status: completed
|
|
|
+ - id: mallapp-page
|
|
|
+ content: mallApp birthdayGift 领取页三态 UI + pages.json
|
|
|
+ status: completed
|
|
|
+ - id: mq-delay-expire
|
|
|
+ content: RabbitMQ 延时队列(x-delay 24h)触发超时自动放弃
|
|
|
+ status: completed
|
|
|
+ - id: index-validate
|
|
|
+ content: npm run index + 端到端联调验证
|
|
|
+ status: completed
|
|
|
+isProject: false
|
|
|
+---
|
|
|
+
|
|
|
+# hdApp 客户生日赠礼管理 — 开发计划
|
|
|
+
|
|
|
+## 范围与约定
|
|
|
+
|
|
|
+| 项 | 约定 |
|
|
|
+|---|---|
|
|
|
+| 产品 | hdApp(商家端)+ mallApp(C 端领取)+ `app-hd` / `app-mall` / `biz-hd` / `biz-mall` |
|
|
|
+| 参与客户 | **member > 0** 且对应 `xhMemberLevel` 已配置非空 **生日权益**(`birthdayBenefit`) |
|
|
|
+| 过期 | **短信发送后 24 小时**内须完成预约领取;超时由 **RabbitMQ 延时消息** 精确触发「超时放弃」(不用 console 扫表) |
|
|
|
+| 不改动 | hdPad、ghs 系列、app-pt |
|
|
|
+
|
|
|
+```mermaid
|
|
|
+flowchart TB
|
|
|
+ subgraph hdApp [hdApp 商家端]
|
|
|
+ WB[workbench 最近生日栏]
|
|
|
+ BD[生日看板]
|
|
|
+ GS[赠礼统计]
|
|
|
+ ML[会员等级设置]
|
|
|
+ WB --> BD
|
|
|
+ BD --> GS
|
|
|
+ BD -->|一键通知 明日| SMS
|
|
|
+ end
|
|
|
+ subgraph mallApp [mallApp C端]
|
|
|
+ CL[会员福利领取页]
|
|
|
+ end
|
|
|
+ subgraph backend [后端]
|
|
|
+ SMS[短信+短链]
|
|
|
+ BG[xhBirthdayGift]
|
|
|
+ PRINT[飞鹅云小票]
|
|
|
+ end
|
|
|
+ SMS --> CL
|
|
|
+ CL -->|确认领取| BG
|
|
|
+ BG --> PRINT
|
|
|
+ ML -->|birthdayBenefit| BG
|
|
|
+```
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 一、数据库(SQL 交付物)
|
|
|
+
|
|
|
+### 1. 扩展 `xhMemberLevel`
|
|
|
+
|
|
|
+当前 [`MemberLevelController`](file:///Users/shishao/dnmp/www/huahuibao/app-hd/controllers/MemberLevelController.php) 仅读写 `name/level/levelSn/amount`;[`CustomClass::levelChange`](file:///Users/shishao/dnmp/www/huahuibao/biz-hd/custom/classes/CustomClass.php) 已读取 `discount` 但前端未维护。
|
|
|
+
|
|
|
+```sql
|
|
|
+ALTER TABLE `xhMemberLevel`
|
|
|
+ ADD COLUMN `discount` decimal(4,2) NOT NULL DEFAULT 10.00 COMMENT '折扣,如9.5表示9.5折' AFTER `amount`,
|
|
|
+ ADD COLUMN `birthdayBenefit` varchar(50) NOT NULL DEFAULT '' COMMENT '生日权益/礼品名称' AFTER `discount`,
|
|
|
+ ADD COLUMN `benefitDesc` varchar(500) NOT NULL DEFAULT '' COMMENT '会员权益说明' AFTER `birthdayBenefit`;
|
|
|
+```
|
|
|
+
|
|
|
+### 2. 新建 `xhBirthdayGift`(核心流水表)
|
|
|
+
|
|
|
+按 **门店 + 客户 + 自然年** 唯一(一年一条活动记录):
|
|
|
+
|
|
|
+| 字段 | 说明 |
|
|
|
+|------|------|
|
|
|
+| `mainId`, `shopId`, `customId`, `hdId`, `userId` | 关联 |
|
|
|
+| `year` | 如 2026 |
|
|
|
+| `status` | `0未填写` / `1待通知` / `2待领取` / `3已领取` / `4超时放弃` |
|
|
|
+| `member`, `memberName`, `giftName` | 通知时快照等级与礼品名 |
|
|
|
+| `birthdayMonth`, `birthdayDate`, `lunar`, `birthdayDisplay` | 展示用 |
|
|
|
+| `notifyTime`, `expireTime` | 短信时间与 24h 截止 |
|
|
|
+| `pickupTime` | 客户预约到店时间 |
|
|
|
+| `collectTime` | 确认领取时间 |
|
|
|
+| `claimToken` | 短链 token(唯一) |
|
|
|
+| `shortLink` | 微信 ShortLink 缓存 |
|
|
|
+| `orderSn` | 打印用小票编号 |
|
|
|
+| `smsSent` | 是否已发短信 |
|
|
|
+
|
|
|
+索引建议:`(shopId, year, status)`、`(claimToken)`、`(customId, shopId, year)` UNIQUE。
|
|
|
+
|
|
|
+实现时提供完整 `CREATE TABLE` + 迁移说明文档(放在 huahuibao 或 understand-project 的 `sql/` 目录,按你们现有习惯)。
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 二、后端 biz-hd(`biz-hd/birthday/` 新模块)
|
|
|
+
|
|
|
+参考现有分层:[`RechargeController`](file:///Users/shishao/dnmp/www/huahuibao/app-hd/controllers/RechargeController.php) + [`WxMiniClass::getShortLink`](file:///Users/shishao/dnmp/www/huahuibao/biz-mall/wx/classes/WxMiniClass.php)。
|
|
|
+
|
|
|
+### 核心类 `BirthdayGiftClass`
|
|
|
+
|
|
|
+| 方法 | 职责 |
|
|
|
+| --------------------------------------- | ------------------------------------------------------------------------------------------------------------------------- |
|
|
|
+| `getWorkbenchSummary(shopId)` | 今日/明日/近一周人数(member>0 + 有 birthdayBenefit + 生日落在区间) |
|
|
|
+| `ensureYearRecords(shopId, range)` | 看板打开时懒创建当年记录 |
|
|
|
+| `getBoardList(filters)` | 时间区间 + 状态 Tab + 搜索 |
|
|
|
+| `getStatusCounts(filters)` | 图2 顶部六类计数 |
|
|
|
+| `getGiftStats(period)` | 图3 按 `giftName` 分组统计待领取/已领取 |
|
|
|
+| `batchNotifyTomorrow(shopId)` | 筛 **明天生日** + status=待通知 → 发短信 + 生成 token/短链 + status→待领取 + **投递 24h 延时消息** |
|
|
|
+| `scheduleExpireDelay(giftId, expireAt)` | 向 RabbitMQ 发布延时任务(见下文) |
|
|
|
+| `expireById(giftId)` | 消费者回调:status=待领取 且未过期领取 → 置「超时放弃」(幂等) |
|
|
|
+| `printReceipt(gift)` | 仿 [`OrderClass::onlinePrint`](file:///Users/shishao/dnmp/www/huahuibao/biz-hd/order/classes/OrderClass.php),独立 ESC 模板(图9) |
|
|
|
+
|
|
|
+### 生日匹配逻辑
|
|
|
+
|
|
|
+- 复用现有 `birthdayMonth/birthdayDate/lunar` + cron [`actionUpdateBirthday`](file:///Users/shishao/dnmp/www/huahuibao/console/controllers/CustomController.php) 维护的 `birthdayTime`。
|
|
|
+- 「今日/明日/近一周」:对农历客户用当年公历 `birthday` 字段比对月日;对未填生日客户归入看板 **未填写**(`birthdayTime=0`),工作台计数可不含或单独统计(与图1「今日5人」一致:只统计已填生日且落在区间内的会员)。
|
|
|
+
|
|
|
+### 短信模板(图4)
|
|
|
+
|
|
|
+```
|
|
|
+{门店名称}:亲爱的会员您好,明天就是您生日啦!这边有份您的vip生日福利礼包{会员生日赠礼说明},请您24小时内点击下方链接免费领取{短链}逾期无效、感谢您的配合!祝您生活愉快!天天开心!
|
|
|
+```
|
|
|
+
|
|
|
+- 发送:[`sms::merchantSend`](file:///Users/shishao/dnmp/www/huahuibao/common/components/sms.php)(扣商家短信余额)。
|
|
|
+- 短链页面:`pages/member/birthdayGift?account={shopId}&token={claimToken}`(与充值短链同模式 [`actionGetMallRechargeShortLink`](file:///Users/shishao/dnmp/www/huahuibao/app-hd/controllers/RechargeController.php))。
|
|
|
+- 记录写入 `xhSms`(现有 [`SmsClass`](file:///Users/shishao/dnmp/www/huahuibao/biz-hd/message/classes/SmsClass.php))。
|
|
|
+
|
|
|
+### hdApp 新 Controller `BirthdayGiftController`(`app-hd`)
|
|
|
+
|
|
|
+| Action | 用途 |
|
|
|
+| ----------------------------- | ------------ |
|
|
|
+| `workbench-summary` | 工作台栏数据 |
|
|
|
+| `board-list` / `board-counts` | 看板列表与 Tab 计数 |
|
|
|
+| `gift-stats` | 赠礼统计 |
|
|
|
+| `notify-tomorrow` | 一键通知 |
|
|
|
+| `print` | 看板内手动补打(可选) |
|
|
|
+
|
|
|
+扩展 [`MemberLevelController`](file:///Users/shishao/dnmp/www/huahuibao/app-hd/controllers/MemberLevelController.php):`get-init-data` / `modify` 增加 `discount`、`birthdayBenefit`、`benefitDesc` 读写与校验(benefit 50 字、desc 500 字、amount 递增逻辑保留)。
|
|
|
+
|
|
|
+### RabbitMQ 延时过期(替代 console cron)
|
|
|
+
|
|
|
+复用项目已有 **`x-delayed-message`** 能力(与花材限购清空相同模式,见 [`ProductClass::createLimitBuyCache`](file:///Users/shishao/dnmp/www/huahuibao/biz-hd/product/classes/ProductClass.php) L703–723 与 [`common/config/rabbitMQ.php`](file:///Users/shishao/dnmp/www/huahuibao/common/config/rabbitMQ.php) 中 `limitBuyDelayExchange`)。
|
|
|
+
|
|
|
+**为何不用 cron 扫表:** 每条记录在「发短信」时即可投递 **精确 24h** 延时消息,到期才处理,无全表轮询、无时间窗口误差,与消费者进程常驻即可。
|
|
|
+
|
|
|
+#### 配置扩展(`common/config/rabbitMQ.php`)
|
|
|
+
|
|
|
+在现有 `limitBuyDelayExchange` 上**新增绑定**(共用同一延时交换器,无需再建 exchange 类型):
|
|
|
+
|
|
|
+| 项 | 值 |
|
|
|
+|---|---|
|
|
|
+| 队列 | `birthdayGiftQueue`(durable) |
|
|
|
+| 交换器 | `limitBuyDelayExchange`(已有 `x-delayed-message`) |
|
|
|
+| routing key | `birthdayGiftDelayRoute` |
|
|
|
+| 生产者 | 复用 `notifyProducer`(或 `customProducer`) |
|
|
|
+| 消费者 | 新建 `birthdayGiftConsumer` → 绑定 `birthdayGiftQueue` |
|
|
|
+
|
|
|
+> 与 `limitBuyQueue` 分离队列,避免 `stockConsumer` 承担无关业务;仅共享延时交换器插件。
|
|
|
+
|
|
|
+#### 投递时机(`batchNotifyTomorrow` 单条成功后)
|
|
|
+
|
|
|
+```php
|
|
|
+// 伪代码,与限购 delay 发布一致
|
|
|
+$delayMs = max(1000, ($gift->expireTime - time()) * 1000);
|
|
|
+$producer->publish(serialize([
|
|
|
+ 'type' => 'birthday_gift_expire',
|
|
|
+ 'giftId' => $gift->id,
|
|
|
+]), 'limitBuyDelayExchange', 'birthdayGiftDelayRoute', [
|
|
|
+ 'delivery_mode' => 2,
|
|
|
+ 'content_type' => 'application/octet-stream',
|
|
|
+ 'application_headers' => new AMQPTable(['x-delay' => $delayMs]),
|
|
|
+]);
|
|
|
+```
|
|
|
+
|
|
|
+- `expireTime = notifyTime + 86400`,`x-delay` 按剩余秒数计算(支持补发/重试时以 DB `expireTime` 为准重算 delay)。
|
|
|
+- 可选:表字段 `expireMsgId` 或 Redis key 记录已投递,防止重复通知重复过期(重发时先 ACK 旧逻辑,以最新 `expireTime` 再投一条)。
|
|
|
+
|
|
|
+#### 消费逻辑(`common/components/rabbitmq/birthdayGiftConsumer.php`)
|
|
|
+
|
|
|
+```php
|
|
|
+switch ($data['type']) {
|
|
|
+ case 'birthday_gift_expire':
|
|
|
+ BirthdayGiftClass::expireById($data['giftId']);
|
|
|
+ break;
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+`expireById` 规则(幂等):
|
|
|
+
|
|
|
+1. 记录不存在 → ACK
|
|
|
+2. `status != 待领取(2)`(已领取/已放弃/未通知)→ ACK,不覆盖
|
|
|
+3. `status == 待领取` 且 `now >= expireTime` → 更新为 **超时放弃(4)**,写 `abandonTime`
|
|
|
+4. 异常 → 记日志 + `noticeUtil`,ACK(与 `stockConsumer` 一致,避免死信堆积)
|
|
|
+
|
|
|
+#### 兜底(可选,非主路径)
|
|
|
+
|
|
|
+仅保留极轻量补偿:console 每日一次扫描「`expireTime` 已过 1 小时仍为待领取」的漏投记录(MQ 宕机场景),不作为主过期机制。默认**不实现**;若上线后观测有漏单再加。
|
|
|
+
|
|
|
+```mermaid
|
|
|
+sequenceDiagram
|
|
|
+ participant HD as hdApp一键通知
|
|
|
+ participant BG as BirthdayGiftClass
|
|
|
+ participant MQ as limitBuyDelayExchange
|
|
|
+ participant C as birthdayGiftConsumer
|
|
|
+ HD->>BG: batchNotifyTomorrow
|
|
|
+ BG->>BG: 发短信 status=待领取
|
|
|
+ BG->>MQ: publish x-delay=24h giftId
|
|
|
+ Note over MQ: 24小时后投递
|
|
|
+ MQ->>C: birthday_gift_expire
|
|
|
+ C->>BG: expireById
|
|
|
+ BG->>BG: status=超时放弃
|
|
|
+```
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 三、后端 biz-mall(C 端领取)
|
|
|
+
|
|
|
+新建 `app-mall/controllers/BirthdayGiftController.php`:
|
|
|
+
|
|
|
+| Action | guest | 说明 |
|
|
|
+|--------|-------|------|
|
|
|
+| `info` | 是 | token 查礼品、门店地址、状态(可领/已领/过期) |
|
|
|
+| `claim` | 是 | 提交 `pickupTime`,校验未过期、status=待领取 |
|
|
|
+| `claim` 成功后 | — | 调 `biz-hd` 侧更新状态 + **触发云打印**(商家无需手点) |
|
|
|
+
|
|
|
+> mall 端用 **token 鉴权**,不要求用户登录,与 [`OrderController::fast-pay`](file:///Users/shishao/dnmp/www/huahuibao/app-mall/controllers/OrderController.php) _guest 模式一致。
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 四、hdApp 前端
|
|
|
+
|
|
|
+根目录:[`/Users/shishao/dnmp/www/front-end/hdApp/src`](file:///Users/shishao/dnmp/www/front-end/hdApp/src)
|
|
|
+
|
|
|
+### 1. 工作台「最近生日」栏(需求1)
|
|
|
+
|
|
|
+文件:[`mall-home-panel.vue`](file:///Users/shishao/dnmp/www/front-end/hdApp/src/admin/home/components/mall-home-panel.vue)
|
|
|
+
|
|
|
+- 在 **花束** `home-card`(约 L96)**上方**插入可点击行(复用 `news-list` 行样式:左 icon + 标题 + 三段时间统计 + 右箭头)。
|
|
|
+- 临时 icon:本地 `static` 占位蛋糕图(后续你可替换)。
|
|
|
+- `onShow`/`init` 调 `GET /birthday-gift/workbench-summary`。
|
|
|
+- 点击 → `/admin/birthday/board`。
|
|
|
+
|
|
|
+### 2. 生日看板(需求2)
|
|
|
+
|
|
|
+- 新页:`admin/birthday/board.vue` + 子组件 `components/birthday-custom-card.vue`。
|
|
|
+- 注册 [`pages.json`](file:///Users/shishao/dnmp/www/front-end/hdApp/src/pages.json) subpackage `admin/birthday`。
|
|
|
+- UI 对齐图2:顶部「一键通知」「赠礼统计」、搜索、时间区间 + 今日/明日/近一周 pill、六状态 Tab、客户卡片(状态色、预约时间行)。
|
|
|
+- 「未填写」卡片点「点击填写生日」→ 跳转现有 [`/admin/member/detail`](file:///Users/shishao/dnmp/www/front-end/hdApp/src/admin/member/detail.vue) 生日弹窗逻辑。
|
|
|
+- API 模块:新建 `api/birthday/index.js`。
|
|
|
+
|
|
|
+### 3. 赠礼统计(需求3)
|
|
|
+
|
|
|
+- `admin/birthday/giftStats.vue`(modal 或独立页,与项目其他 stat 弹层风格一致)。
|
|
|
+- 时间周期切换 + 双表格(待领取 / 已领取)。
|
|
|
+
|
|
|
+### 4. 会员等级页改造(需求8 / 图6)
|
|
|
+
|
|
|
+文件:[`admin/member/level.vue`](file:///Users/shishao/dnmp/www/front-end/hdApp/src/admin/member/level.vue)
|
|
|
+
|
|
|
+- 由表格改为 **卡片列表**(参考设计图:图标、等级名、消费金额、折扣、生日权益 0/50、权益说明 0/500)。
|
|
|
+- 提交字段扩展,与后端 `modify` 同步。
|
|
|
+- 样式沿用页面现有绿色主题(`#f0f9f0`、`admin-button-com`)。
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 五、mallApp 前端
|
|
|
+
|
|
|
+根目录:[`/Users/shishao/dnmp/www/front-end/mallApp/src`](file:///Users/shishao/dnmp/www/front-end/mallApp/src)
|
|
|
+
|
|
|
+### 会员福利领取页(需求5–7)
|
|
|
+
|
|
|
+- 新页:`pages/member/birthdayGift.vue`(标题「会员福利领取」)。
|
|
|
+- 注册 `pages.json`;[`launchScene.js`](file:///Users/shishao/dnmp/www/front-end/mallApp/src/utils/launchScene.js) 无需改 scene 映射(query 直传 `account` + `token`)。
|
|
|
+- 三态 UI:
|
|
|
+ - **可领取**:礼品卡 + 到店时间 picker + 门店地址 + 「到这去」+ 底部「返回/确认领取」。
|
|
|
+ - **已领取**(图7):展示已选时间,隐藏确认按钮。
|
|
|
+ - **已过期**(图8):中间提示「领取时间已过,已自动放弃权益」。
|
|
|
+- API:`api/birthday/index.js` → `info` / `claim`。
|
|
|
+- 时间选择:复用项目现有 datetime picker 组件(若无则用 `uni-datetime-picker` 与 recharge 等页一致)。
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 六、小票打印(需求7 / 图9)
|
|
|
+
|
|
|
+在 `BirthdayGiftClass::buildPrintContent()` 组装飞鹅 `<BR>` 模板,字段:
|
|
|
+
|
|
|
+- 标题「生日赠礼订单」
|
|
|
+- `pickupTime` + 「到店自取」
|
|
|
+- 取花人姓名、尾号、手机号
|
|
|
+- 礼品名(加粗行)
|
|
|
+- 会员等级、账户余额、订单日期、订单编号(`orderSn`)
|
|
|
+
|
|
|
+触发点:**mallApp `claim` 成功** → 调 hd 侧打印(`printUtil` + `ShopExt.printSn`),与 [`onlinePrintOrder`](file:///Users/shishao/dnmp/www/front-end/hdApp/src/api/order/index.js) 同打印机。
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 七、状态机(实现对照图2)
|
|
|
+
|
|
|
+```mermaid
|
|
|
+stateDiagram-v2
|
|
|
+ [*] --> NoBirthday: 未填生日
|
|
|
+ NoBirthday --> PendingNotify: 填写生日后进入当年池
|
|
|
+ PendingNotify --> PendingClaim: 一键通知发短信
|
|
|
+ PendingClaim --> Collected: mallApp确认领取
|
|
|
+ PendingClaim --> Expired: MQ延时24h到期
|
|
|
+ Collected --> [*]
|
|
|
+ Expired --> [*]
|
|
|
+```
|
|
|
+
|
|
|
+| status | 展示 |
|
|
|
+|--------|------|
|
|
|
+| 未填写 | 橙色,引导填生日 |
|
|
|
+| 待通知 | 红色角标,明日一键通知目标 |
|
|
|
+| 待领取 | 蓝色,显示预约时间 |
|
|
|
+| 已领取 | 灰色,显示领取时间 |
|
|
|
+| 超时放弃 | 深灰,显示自动放弃文案 |
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 八、知识库与验证
|
|
|
+
|
|
|
+- 实现后于 understand-project 运行 `npm run index` 刷新索引。
|
|
|
+- 手工测试路径:
|
|
|
+ 1. 配置某等级生日权益 → 客户设明天生日 → 工作台数字 → 看板 → 一键通知
|
|
|
+ 2. 打开短链 → mallApp 预约 → 商家小票机出票
|
|
|
+ 3. 通知后等待 MQ 延时(或测试环境将 delay 改为 60s)验证图8 过期态
|
|
|
+ 4. 赠礼统计数字与列表一致
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 主要改动文件清单
|
|
|
+
|
|
|
+| 仓库 | 新增/修改 |
|
|
|
+|------|-----------|
|
|
|
+| huahuibao | `sql/birthday_gift.sql`;`biz-hd/birthday/*`;`app-hd/controllers/BirthdayGiftController.php`;扩展 `MemberLevelController`;`app-mall/controllers/BirthdayGiftController.php`;`biz-mall/birthday/*`;`common/config/rabbitMQ.php`(birthdayGiftQueue/绑定/消费者);`common/components/rabbitmq/birthdayGiftConsumer.php` |
|
|
|
+| hdApp | `mall-home-panel.vue`;`admin/birthday/*`;`admin/member/level.vue`;`api/birthday/index.js`;`pages.json` |
|
|
|
+| mallApp | `pages/member/birthdayGift.vue`;`api/birthday/index.js`;`pages.json` |
|