jiaweiqi 2 vuotta sitten
vanhempi
sitoutus
e658e89ebd

+ 21 - 2
apps/customer/order/views.py

@@ -1,9 +1,12 @@
 # coding=utf-8
 
 import json
+import datetime
+import traceback
 
 from django.db import transaction
-from django.db.models import Q
+from django.db.models import Q, F
+from django.utils import timezone
 
 from rest_framework.decorators import action
 from rest_framework import generics
@@ -65,6 +68,19 @@ class OrderListView(generics.ListAPIView):
 
     def filter_queryset(self, queryset):
         queryset = queryset.filter(customer=self.request.customer)
+        try:
+            # 将本人待支付且过期的订单改为取消状态
+            end_time = timezone.now() - datetime.timedelta(minutes=10)
+            rows = queryset.filter(status=Order.WAIT_PAY, create_time__lte=end_time)
+            with transaction.atomic():
+                for row in rows:
+                    # 如果订单改为取消状态将订单积分返还,因为下单的时候积分已经被扣除了
+                    if row.total_point > 0:
+                        PointLogOrder.addnew(row, cancel_order=True)
+                rows.update(status=Order.CANCEL, cancel_time=timezone.now(), cancel_reason='订单过期失效,自动取消。')
+        except Exception as e:
+            traceback.print_exc()
+
         f = OrderFilter(self.request.GET, queryset=queryset)
         return f.qs
 
@@ -127,9 +143,12 @@ class OrderViewSet(CustomModelViewSet):
         appid = request.POST.get('appid')
 
         order = self.get_object()
-        print(order.id)
         if not openid or not appid:
             raise CustomError(u'参数错误!')
         with transaction.atomic():
+            # 如果订单过期了  就不能再支付了
+            end_time = order.create_time + datetime.timedelta(minutes=10)
+            if timezone.now() >= end_time:
+                raise CustomError(u'该订单已过期,请重新下单!')
             data = order.orderPay(openid, appid)
         return response_ok(data)

+ 0 - 0
apps/customer/rebate/__init__.py


+ 32 - 0
apps/customer/rebate/serializers.py

@@ -0,0 +1,32 @@
+# coding=utf-8
+
+from rest_framework import serializers
+
+from apps.base import Formater
+from apps.rebate.models import PointLog, CashLog
+
+
+class PointLogSerializer(serializers.ModelSerializer):
+    type_text = serializers.CharField(source='get_type_display', read_only=True)
+    happen_time = serializers.DateTimeField(format='%Y-%m-%d %H:%M', read_only=True)
+
+    class Meta:
+        model = PointLog
+        fields = ('type_text', 'happen_time', 'amount', 'balance', )
+
+
+class CashLogSerializer(serializers.ModelSerializer):
+    type_text = serializers.CharField(source='get_type_display', read_only=True)
+    happen_time = serializers.DateTimeField(format='%Y-%m-%d %H:%M', read_only=True)
+    amount = serializers.SerializerMethodField()
+    balance = serializers.SerializerMethodField()
+
+    class Meta:
+        model = CashLog
+        fields = ('type_text', 'happen_time', 'amount', 'balance', )
+
+    def get_amount(self, obj):
+        return Formater.formatValueShow(obj.amount)
+
+    def get_balance(self, obj):
+        return Formater.formatValueShow(obj.balance)

+ 11 - 0
apps/customer/rebate/urls.py

@@ -0,0 +1,11 @@
+# coding=utf-8
+
+from django.conf.urls import url, include
+from rest_framework.routers import SimpleRouter
+
+from .views import *
+
+urlpatterns = [
+    url(r'^point_log/$', PointLogListView.as_view()),
+    url(r'^cash_log/$', CashLogListView.as_view()),
+]

+ 32 - 0
apps/customer/rebate/views.py

@@ -0,0 +1,32 @@
+# coding=utf-8
+
+from rest_framework import generics
+
+from utils import response_ok, response_error
+from utils.permission import IsCustomer, IsEmployee
+
+from apps.rebate.models import PointLog, CashLog
+from apps.rebate.filters import PointLogFilter, CashLogFilter
+from apps.customer.rebate.serializers import PointLogSerializer, CashLogSerializer
+
+
+class PointLogListView(generics.ListAPIView):
+    permission_classes = [IsCustomer, ]
+    queryset = PointLog.objects.filter()
+    serializer_class = PointLogSerializer
+
+    def filter_queryset(self, queryset):
+        queryset = queryset.filter(customer=self.request.customer)
+        f = PointLogFilter(self.request.GET, queryset=queryset)
+        return f.qs
+
+
+class CashLogListView(generics.ListAPIView):
+    permission_classes = [IsCustomer, ]
+    queryset = CashLog.objects.filter()
+    serializer_class = CashLogSerializer
+
+    def filter_queryset(self, queryset):
+        queryset = queryset.filter(customer=self.request.customer)
+        f = CashLogFilter(self.request.GET, queryset=queryset)
+        return f.qs

+ 1 - 0
apps/customer/urls.py

@@ -19,6 +19,7 @@ urlpatterns = [
     url(r'^collection/', include('apps.customer.collection.urls')),
     url(r'^distributor/', include('apps.customer.distributor.urls')),
     url(r'^order/', include('apps.customer.order.urls')),
+    url(r'^rebate/', include('apps.customer.rebate.urls')),
 ]
 
 router = SimpleRouter()

+ 1 - 1
apps/order/models.py

@@ -257,7 +257,7 @@ class Order(models.Model):
 
     def orderPay(self, openid, appid):
         if self.status != Order.WAIT_PAY:
-            raise CustomError(u'订单待付款状态,禁止付款!')
+            raise CustomError(u'订单待付款状态,禁止付款!')
         if self.pay:
             pay_no = self.pay.no
             # 先查询订单状态

+ 4 - 0
apps/order/views.py

@@ -19,6 +19,7 @@ from apps.order.filters import *
 from apps.order.serializers import *
 from apps.option.models import Option
 from apps.base import Formater
+from apps.rebate.models import PointLogOrder
 
 
 class OrderDict(APIView):
@@ -107,4 +108,7 @@ class OrderViewSet(CustomModelViewSet):
             order.cancel_user = request.user
             order.cancel_time = timezone.now()
             order.save()
+            if order.total_point > 0:
+                # 取消订单的时候 如果该订单有积分 要把积分返还给用户  因为积分在下单的时候已经扣除了
+                PointLogOrder.addnew(order, cancel_order=True)
         return response_ok()

+ 19 - 0
apps/rebate/filters.py

@@ -0,0 +1,19 @@
+# coding=utf-8
+
+import django_filters
+
+from apps.rebate.models import *
+
+
+class CashLogFilter(django_filters.FilterSet):
+
+    class Meta:
+        model = CashLog
+        fields = '__all__'
+
+
+class PointLogFilter(django_filters.FilterSet):
+
+    class Meta:
+        model = PointLog
+        fields = '__all__'

+ 14 - 6
apps/rebate/models.py

@@ -76,7 +76,7 @@ class CashRebateLog(models.Model):
     log = models.OneToOneField(CashLog, verbose_name=u'日志', related_name='rebate_log', editable=False, on_delete=models.PROTECT)
 
     class Meta:
-        db_table = "cahs_rebate_log"
+        db_table = "cash_rebate_log"
         verbose_name = u'现金返利日志'
         ordering = []
         index_together = ()
@@ -100,10 +100,12 @@ class PointLog(models.Model):
     POINT_REBATE = 1
     POINT_ORDER = 2
     POINT_GIVE = 3
+    POINT_CANCEL = 4
     TYPE_CHOICES = (
         (POINT_REBATE, u'积分返利'),
-        (POINT_ORDER, u'积分兑换'),
-        (POINT_GIVE, u'赠送积分'),  # 购买商品赠送的积分
+        (POINT_ORDER, u'积分兑换商品'),
+        (POINT_GIVE, u'购买商品赠送积分'),  # 购买商品赠送的积分
+        (POINT_CANCEL, u'取消订单返还积分'),  # 取消订单的时候将已扣除的积分返还
     )
 
     customer = models.ForeignKey(Customer, verbose_name=u'客户', on_delete=models.PROTECT)
@@ -174,7 +176,7 @@ class PointGive(models.Model):
 
 class PointLogOrder(models.Model):
 
-    order = models.OneToOneField(Order, verbose_name=u'订单', related_name='order', editable=False, on_delete=models.PROTECT)
+    order = models.ForeignKey(Order, verbose_name=u'订单', related_name='order', editable=False, on_delete=models.PROTECT)
     log = models.OneToOneField(PointLog, verbose_name=u'日志', related_name='order_log', editable=False, on_delete=models.PROTECT)
 
     class Meta:
@@ -186,9 +188,15 @@ class PointLogOrder(models.Model):
         permissions = []
 
     @staticmethod
-    def addnew(order):
+    def addnew(order, cancel_order=False):
         customer = Customer.objects.select_for_update().filter(id=order.customer.id).first()
-        log = PointLog.addnew(customer, PointLog.POINT_ORDER, -order.total_point)
+        total_point = -order.total_point
+        type = PointLog.POINT_ORDER
+        if cancel_order:
+            # 如果是作废订单就将订单积分加上去
+            total_point = order.total_point
+            type = PointLog.POINT_CANCEL
+        log = PointLog.addnew(customer, type, total_point)
         instance = PointLogOrder.objects.create(order=order, log=log)
         return instance