diff --git a/doc/api.md b/doc/api.md index d75a3d1..2c220b2 100644 --- a/doc/api.md +++ b/doc/api.md @@ -814,5 +814,29 @@ "sendTime": 1623316467010, // 公告发送时间 "title": "111", // 公告标题 "type": 2 // 公告类型 0: 普通 1: 店铺群发 2: 全体 +} +``` + +### 23. 开始分享优惠券 + +1. Method: POST +2. URI: /api/:accountId/coupon/begin_share + +| 字段 | 说明 | +| -------- | -------------------------------------- | +| accountid | 帐号id | + +> POST参数 + + +| 字段 | 说明 | +| -------- | -------------------------------------- | +| id | 优惠券的短id | + +3. Response: JSON + +```js +{ + } ``` \ No newline at end of file diff --git a/src/api/controllers/coupon.controller.ts b/src/api/controllers/coupon.controller.ts new file mode 100644 index 0000000..9ad6473 --- /dev/null +++ b/src/api/controllers/coupon.controller.ts @@ -0,0 +1,48 @@ +import { role, router } from 'decorators/router' +import { UserCoupon } from 'models/user/UserCoupon' +import BaseController from '../../common/base.controller' +import { ZError } from '../../common/ZError' + +class CouponController extends BaseController { + /** + * 获取优惠券信息 + */ + @role('anon') + @router('get /pub/coupon/:shop/:id') + async info(req: any) { + return {} + } + /** + * 核销 + */ + @role('anon') + @router('post /pub/coupon/:shop/:id') + async use(req: any) { + return {} + } + /** + * 开始分享, 将当前优惠券改为正在分享状态 + */ + @role('anon') + @router('post /api/:accountId/coupon/begin_share') + async beginShare(req: any) { + let { accountId, id } = req.params + if (!id) { + throw new ZError(10, '缺少必要参数: id') + } + const result = await UserCoupon.updateOne({ sid: id, status: { $in: [0, 2] }, accountId }, { status: 2 }) + if (result.nModified !== 1) { + throw new ZError(11, 'no matched records') + } + return result + } + + /** + * 接受分享出去的优惠券 + */ + @role('anon') + @router('post /api/:accountId/coupon/receive_coupon') + async receive(req: any) { + return {} + } +} diff --git a/src/models/user/UserCoupon.ts b/src/models/user/UserCoupon.ts index f6254da..dcf52a5 100644 --- a/src/models/user/UserCoupon.ts +++ b/src/models/user/UserCoupon.ts @@ -12,6 +12,7 @@ const nanoid = customAlphabet('2345678abcdefghjkmnpqrstwxy', 10) @dbconn() @index({ accountId: 1, shop: 1 }, { unique: false }) +@index({ sid: 1, shop: 1 }, { unique: true }) @index({ accountId: 1, shop: 1, item: 1 }, { unique: false }) @modelOptions({ schemaOptions: { collection: 'user_coupons', timestamps: true } }) @pre('save', async function () { @@ -19,34 +20,49 @@ const nanoid = customAlphabet('2345678abcdefghjkmnpqrstwxy', 10) let sid = '' while (!sid) { sid = nanoid() - const records = await UserCoupon.find({ sid }, { _id: 1 }).limit(1) + const records = await UserCoupon.find({ sid, shop: this.shop }, { _id: 1 }).limit(1) records.length > 0 && (sid = '') } this.sid = sid } }) class UserCouponClass extends BaseModule { + /** + * 当前拥有者的帐号id + */ @prop() public accountId: string - + /** + * 所属店铺id + */ @prop() public shop: string - + /** + * 真实的优惠券id + */ @prop() public item: string - + /** + * 短id, 用于生成二维码, 店铺唯一 + */ @prop() public sid: string @prop({ default: 0 }) public count: number - + /** + * 来源 + */ @prop() public source: string - + /** + * 活动or挑战id + */ @prop() public activityId: string - + /** + * UserReward的记录id + */ @prop() public rewardId: string @@ -54,6 +70,8 @@ class UserCouponClass extends BaseModule { * 状态 * 0: 未使用 * 1: 已使用 + * 2: 赠送中 + * 3: 已赠送 * 9: 已过期 * @type {number} */ diff --git a/src/models/user/UserReward.ts b/src/models/user/UserReward.ts index 4175dd1..bb5ea19 100644 --- a/src/models/user/UserReward.ts +++ b/src/models/user/UserReward.ts @@ -134,7 +134,14 @@ class UserRewardClass extends BaseModule { rewardType, } } - + /** + * 添加一条奖励获取记录 + * @param history 挑战记录 + * @param accountId 帐号信息 + * @param rewardId 奖励id + * @param coupon 优惠券id + * @param count 数量 + */ public static async addOneRecord( history: PuzzleSessionClass, accountId: string, @@ -165,7 +172,10 @@ class UserRewardClass extends BaseModule { let source = history.type === 1 ? 'activity' : 'exam' return UserReward.rewardGot({ accountId, shop: history.shop, rewardId, activityId: history.activityId, source }) } - + /** + * 判断特定条件下一个奖励是否已经获取 + * @returns {Boolean} + */ public static async rewardGot({ accountId, shop, @@ -185,7 +195,13 @@ class UserRewardClass extends BaseModule { ).limit(1) return records.length > 0 } - + /** + * 获取已经获得的奖励奖励信息, 用于判断指定的reward是否已经获得过了 + * @param accountId 帐号id + * @param shop 所属店铺 + * @param activityId 活动id + * @returns {Set} 由reward id组成的Set + */ public static async userGotSet(accountId: string, shop: string, activityId: string) { let records = await UserReward.find({ accountId, shop, activityId }) let result: Set = new Set()