@@ -206,25 +206,26 @@ def good_exchange(request): |
||
206 | 206 |
if user.integral < good.integral: |
207 | 207 |
return response(MemberGoodStatusCode.GOOD_INTEGRAL_NOT_ENOUGH) |
208 | 208 |
|
209 |
+ # 校验重复兑换 |
|
210 |
+ if good.only_once and GoodsOrderInfo.objects.filter(user_id=user_id, good_id=good_id, status=True).exists(): |
|
211 |
+ return response(MemberGoodStatusCode.GOOD_EXCHANGE_ONLY_ONCE) |
|
212 |
+ |
|
209 | 213 |
user.integral -= good.integral |
210 | 214 |
user.save() |
211 | 215 |
|
212 | 216 |
good.left_num -= 1 |
213 | 217 |
good.save() |
214 | 218 |
|
215 |
- # 校验重复兑换 |
|
216 |
- is_exists = GoodsOrderInfo.objects.filter(user_id=user_id, good_id=good_id, status=True).exists() |
|
217 |
- if not is_exists: |
|
218 |
- GoodsOrderInfo.objects.create( |
|
219 |
- user_id=user_id, |
|
220 |
- good_id=good_id, |
|
221 |
- good_type=good.good_type, |
|
222 |
- title=good.title, |
|
223 |
- name=name, |
|
224 |
- phone=phone, |
|
225 |
- address=address, |
|
226 |
- integral=good.integral, |
|
227 |
- ) |
|
219 |
+ GoodsOrderInfo.objects.create( |
|
220 |
+ user_id=user_id, |
|
221 |
+ good_id=good_id, |
|
222 |
+ good_type=good.good_type, |
|
223 |
+ title=good.title, |
|
224 |
+ name=name, |
|
225 |
+ phone=phone, |
|
226 |
+ address=address, |
|
227 |
+ integral=good.integral, |
|
228 |
+ ) |
|
228 | 229 |
|
229 | 230 |
if good.good_type == GoodsInfo.PHYSICAL: |
230 | 231 |
# TODO: 通知客服发快递 |
@@ -0,0 +1,20 @@ |
||
1 |
+# -*- coding: utf-8 -*- |
|
2 |
+# Generated by Django 1.11.29 on 2021-04-25 07:01 |
|
3 |
+from __future__ import unicode_literals |
|
4 |
+ |
|
5 |
+from django.db import migrations, models |
|
6 |
+ |
|
7 |
+ |
|
8 |
+class Migration(migrations.Migration): |
|
9 |
+ |
|
10 |
+ dependencies = [ |
|
11 |
+ ('member', '0028_auto_20210115_1108'), |
|
12 |
+ ] |
|
13 |
+ |
|
14 |
+ operations = [ |
|
15 |
+ migrations.AddField( |
|
16 |
+ model_name='goodsinfo', |
|
17 |
+ name='only_once', |
|
18 |
+ field=models.BooleanField(default=False, help_text='\u4ec5\u652f\u6301\u5151\u6362\u4e00\u6b21', verbose_name='only_once'), |
|
19 |
+ ), |
|
20 |
+ ] |
@@ -47,6 +47,7 @@ class GoodsInfo(BaseModelMixin): |
||
47 | 47 |
minlevel = models.IntegerField(_(u'minlevel'), default=0, help_text=u'兑换最低会员级别', db_index=True) |
48 | 48 |
|
49 | 49 |
only_for_member = models.BooleanField(_(u'only_for_member'), default=False, help_text=u'会员专属') |
50 |
+ only_once = models.BooleanField(_(u'only_once'), default=False, help_text=u'仅支持兑换一次') |
|
50 | 51 |
|
51 | 52 |
position = models.IntegerField(_(u'position'), default=1, help_text=u'排序', db_index=True) |
52 | 53 |
|
@@ -81,6 +81,7 @@ class MemberGoodStatusCode(BaseStatusCode): |
||
81 | 81 |
GOOD_NO_EXCHANGE_PERMISSION = StatusCodeField(503502, 'Good No Exchange Permission', description=u'商品无兑换权限') |
82 | 82 |
GOOD_INTEGRAL_NOT_ENOUGH = StatusCodeField(503503, 'Good Integral Not Enough', description=u'商品兑换积分不足') |
83 | 83 |
GOOD_STOCK_NOT_ENOUGH = StatusCodeField(503504, 'Good Integral Not Enough', description=u'商品库存不足') |
84 |
+ GOOD_EXCHANGE_ONLY_ONCE = StatusCodeField(503505, 'Good Exchange Only Once', description=u'商品仅可兑换一次') |
|
84 | 85 |
|
85 | 86 |
|
86 | 87 |
class MemberRightStatusCode(BaseStatusCode): |