wushaodong 3 anni fa
parent
commit
091a9d4d21

+ 6 - 1
apps/commodity/filters.py

@@ -1,10 +1,15 @@
 # coding=utf-8
 import django_filters
 from .models import Commodity
+from django.db.models import Q
 
 class CommodityFilter(django_filters.FilterSet):
     name = django_filters.CharFilter(field_name='name', lookup_expr='icontains')
-    category_id = django_filters.CharFilter(field_name='category_id')
+    category = django_filters.CharFilter(method='find_category')
+
+    def find_category(self,queryset, *args):
+        queryset = queryset.filter(Q(category_id=args[1]) | Q(category__category_id=args[1]) | Q(category__category__category_id=args[1]))
+        return queryset
 
     class Meta:
         model = Commodity

+ 1 - 0
apps/option/models.py

@@ -111,6 +111,7 @@ class CommodityLevel(models.Model):
 
     name = models.CharField(verbose_name=u'名称', max_length=50, blank=True, null=True)
     enable = models.BooleanField(verbose_name=u"是否在用", default=True)
+    home_show = models.BooleanField(verbose_name=u"是否首页展示", default=False)
     level = models.IntegerField(verbose_name=u'层级', choices=LEVEL_CHOICES)
     category = models.ForeignKey('CommodityLevel', verbose_name='父类', related_name='commodiey_level_children', on_delete=models.PROTECT,
                              blank=True, null=True)

+ 1 - 0
apps/option/serializers.py

@@ -83,6 +83,7 @@ class StudentSerializer(serializers.ModelSerializer):
         return instance
 
 class CommodityLevelSerializer(serializers.ModelSerializer):
+    home_show_text = BooleanCharField(source='home_show', read_only=True)
     enable_text = BooleanCharField(source='enable', read_only=True)
     category_text = serializers.CharField(source='category.name', read_only=True)
 

+ 1 - 0
apps/option/urls.py

@@ -8,6 +8,7 @@ urlpatterns = [
     url(r'get_school/$', SchoolView.as_view()), # 学校管理
     url(r'get_category/$', CategoryView.as_view()), # 商品分类
     url(r'get_category_tree/$', CategoryTreeView.as_view()), # 商品分类
+    url(r'get_wx_category/$', CategoryWXView.as_view()), # 商品分类首页展示
     url(r'school_tree/$', SchoolTreeView.as_view()),
     url(r'area_tree/$', AreaTreeView.as_view()),
 ]

+ 8 - 0
apps/option/views.py

@@ -48,6 +48,14 @@ class CategoryView(APIView):
         }
         return response_ok(result)
 
+class CategoryWXView(APIView):
+    permission_classes = [isLogin, ]
+
+    def get(self, request):
+        rows = CommodityLevel.objects.filter(enable=True, home_show=True)
+        data = [{'id': item.id, 'value': item.name,'picture':''} for item in rows]
+        return response_ok(data)
+
 class AreaTreeView(APIView):
     permission_classes = [isLogin, ]
 

+ 26 - 8
apps/order/models.py

@@ -10,6 +10,30 @@ from apps.base import Formater
 from apps.account.models import CustomerWechat
 from django.contrib.auth import get_user_model
 User = get_user_model()
+from apps.option.models import CommodityLevel, School
+
+class Coupon(models.Model):
+
+    name = models.CharField(max_length=50, verbose_name='优惠券名称', unique=True, null=True)
+    amount = models.BigIntegerField(verbose_name=u"优惠券金额")
+
+    category = models.ForeignKey(CommodityLevel, verbose_name='使用分类', on_delete=models.PROTECT, null=True,
+                                   related_name='coupon_category')
+    school = models.ForeignKey(School, verbose_name='使用学校', on_delete=models.PROTECT, null=True,
+                                   related_name='coupon_category')
+    create_time = models.DateTimeField(verbose_name=u"创建时间", default=timezone.now)
+    create_user = models.ForeignKey(settings.AUTH_USER_MODEL, verbose_name=u'创建人', related_name='coupon_create_user',
+                             on_delete=models.PROTECT)
+    begin_date = models.DateField(verbose_name=u"开始时间", null=True)
+    end_date = models.DateField(verbose_name=u"结束时间", null=True)
+    enable = models.BooleanField(verbose_name=u"是否在用", default=True)
+    count = models.IntegerField(verbose_name=u"使用数量", default=0)
+
+    class Meta:
+        db_table = "coupon"
+        verbose_name = u"支付信息"
+        ordering = ('-id',)
+        default_permissions = ()
 
 class Pay(models.Model):
     WAIT = 0
@@ -109,6 +133,7 @@ class Order(models.Model):
 
     no = models.CharField(max_length=50, verbose_name=u'订单号', blank=True)
     pay = models.ForeignKey(Pay, verbose_name='支付信息', on_delete=models.PROTECT, null=True, editable=False)
+    coupon = models.ForeignKey(Coupon, verbose_name='优惠券', on_delete=models.PROTECT, null=True)
 
     payment = models.PositiveSmallIntegerField(choices=PAYMENT_CHOICES, verbose_name=u'付款方式', default=ONLINE_PAY)
     status = models.PositiveSmallIntegerField(choices=STATUS_CHOICES, verbose_name=u"订单状态", default=WAIT_PAY)
@@ -119,15 +144,8 @@ class Order(models.Model):
     student = models.ForeignKey(Student, verbose_name=u'学生', related_name='customer_order_student',
                                 on_delete=models.PROTECT, null=True)
 
-    commodity = models.ForeignKey(Commodity, verbose_name=u'商品', related_name='customer_order_commodity',
-                                on_delete=models.PROTECT, null=True)
-    name = models.CharField(max_length=20, verbose_name=u"名称", editable=False, null=True)
-    begin_date = models.DateField(verbose_name=u'起始日期', editable=False, null=True)
-    end_date = models.DateField(verbose_name=u'终止日期', editable=False, null=True)
-    price = models.IntegerField(verbose_name=u'每餐单价', null=True, default=0, editable=False)
-    days = models.IntegerField(verbose_name=u'天数', null=True, default=0, editable=False)
     total_amount = models.BigIntegerField(verbose_name=u'总金额', editable=False, default=0)
-    balance_deduction = models.BigIntegerField(verbose_name=u'余额抵扣', editable=False, default=0)
+    coupon_deduction = models.BigIntegerField(verbose_name=u'优惠券抵扣', editable=False, default=0)
     actual_amount = models.BigIntegerField(verbose_name=u'实付金额', editable=False, default=0)
 
     class Meta:

+ 13 - 8
apps/order/serializers.py

@@ -9,17 +9,9 @@ from apps.base import Formater
 class OrderSerializer(serializers.ModelSerializer):
     payment_name = serializers.CharField(source='get_payment_display', read_only=True)
     create_user_text = serializers.CharField(source='create_user.username', read_only=True)
-    commodity_text = serializers.CharField(source='name', read_only=True)
-    student_text = serializers.CharField(source='student.name', read_only=True)
-    school_text = serializers.CharField(source='student.school.name', read_only=True)
-    grade_text = serializers.CharField(source='student.classes.grade.name', read_only=True)
-    class_text = serializers.CharField(source='student.classes.name', read_only=True)
-    # create_time_f = serializers.DateTimeField(source='create_time', format=settings.SHORT_DATETIME_FORMAT,
-    #                                           read_only=True)
     status_text = serializers.CharField(source='get_status_display', read_only=True)
 
     total_amount = PriceShowCharField(read_only=True)
-    balance_deduction = PriceShowCharField(read_only=True)
     actual_amount = PriceShowCharField(read_only=True)
     class Meta:
         model = Order
@@ -31,3 +23,16 @@ class OrderSerializer(serializers.ModelSerializer):
         instance.no = instance.get_no()
         instance.save()
         return instance
+
+class CouponSerializer(serializers.ModelSerializer):
+    create_user_text = serializers.CharField(source='create_user.username', read_only=True)
+    amount = PriceShowCharField(read_only=True)
+    class Meta:
+        model = Coupon
+        fields = '__all__'
+
+    def create(self, validated_data):
+        validated_data['create_user'] = self.context['request'].user
+        instance = super(CouponSerializer, self).create(validated_data)
+        instance.save()
+        return instance

+ 2 - 2
apps/order/views.py

@@ -37,10 +37,10 @@ class OrderViewSet(CustomModelViewSet):
             filename = attachment_save(export_data, '用户订单{}'.format(timezone.now().date()))
 
             return response_ok({'filename': filename})
-        total = queryset.aggregate(total_amount=Sum('total_amount'), balance_deduction=Sum('balance_deduction'), actual_amount=Sum('actual_amount'))
+        total = queryset.aggregate(total_amount=Sum('total_amount'), coupon_deduction=Sum('coupon_deduction'), actual_amount=Sum('actual_amount'))
         totalRow = {'totalRow':1,
                     'total_amount': Formater.formatPriceShow(total['total_amount']),
-                    'balance_deduction':Formater.formatPriceShow(total['balance_deduction']),
+                    'coupon_deduction':Formater.formatPriceShow(total['coupon_deduction']),
                     'actual_amount':Formater.formatPriceShow(total['actual_amount'],)}
         page = self.paginate_queryset(queryset)
         if page is not None:

+ 12 - 3
uis/views/commodity/category.html

@@ -170,6 +170,14 @@
                     </div>
                 </div>
 
+                <div>
+                    <label class="layui-form-label">首页显示:</label>
+                    <div class="layui-input-block">
+                        <input type="checkbox" name="home_show" lay-skin="switch" lay-text="是|否" checked=""
+                               value="1">
+                    </div>
+                </div>
+
                 <div>
                     <label class="layui-form-label">是否在用:</label>
                     <div class="layui-input-block">
@@ -276,9 +284,10 @@
             , url:  '/option/category/?level=2'
             , cols: [[
                 {field: 'name', title: '名称', width: 150}
-                , {field: 'category_text', title: '大类', width: 150}
-                , {field: 'enable_text', title: '在用', width: 80}
-                , {width: 110, align: 'center', fixed: 'right', toolbar: '#category-operate-bar'}
+                , {field: 'category_text', title: '大类', width: 120}
+                , {field: 'enable_text', title: '在用', width: 60}
+                , {field: 'home_show_text', title: '首页显示', width: 100}
+                , {width: 80, align: 'center', fixed: 'right', toolbar: '#category-operate-bar'}
             ]]
             , page: true
             , height: 'full-108'