Bladeren bron

初始化

wushaodong 3 jaren geleden
bovenliggende
commit
fac2f3d5f0

+ 0 - 4
apps/account/serializers.py

@@ -12,7 +12,6 @@ from utils import get_remote_addr
 from utils.booleancharfield import BooleanCharField
 from utils.exceptions import CustomError
 from apps.account.models import CustomerWechat
-from apps.option.models import Config, Balance
 User = get_user_model()
 jwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLER
 jwt_encode_handler = api_settings.JWT_ENCODE_HANDLER
@@ -35,12 +34,10 @@ class JWTSerializer(JSONWebTokenSerializer):
                 payload = jwt_payload_handler(user)
                 BizLog.objects.addnew(user, BizLog.INSERT,
                                       u'[%s]登录系统,IP[%s]' % (user.username,get_remote_addr(self.request)))
-                permissions = list(user.get_all_permissions())
                 return {
                     'token': jwt_encode_handler(payload),
                     'user_id': user.id,
                     'username': user.username,
-                    'permissions': permissions,
                 }
             else:
                 msg = u'账号或者密码错误!'
@@ -188,7 +185,6 @@ class WechatBindSerializer(serializers.Serializer):
         if openid and phoneEncryptedData and phoneIv:
             customer = CustomerWechat.bindWechat(appid, openid, phoneEncryptedData, phoneIv)
             payload = jwt_payload_handler(customer)
-            Balance.objects.get_or_create(create_user=customer)
             return {
                 'token': jwt_encode_handler(payload),
                 'user_id': customer.id,

+ 1 - 0
apps/account/urls.py

@@ -1,3 +1,4 @@
+# coding=utf-8
 from django.conf.urls import url
 from rest_framework.routers import SimpleRouter
 from apps.account.views import *

+ 1 - 2
apps/account/views.py

@@ -7,8 +7,7 @@ from rest_framework.decorators import action
 from django.db import transaction
 from rest_framework.views import APIView
 from rest_framework.serializers import ValidationError
-from utils.permission import permission_required, isLogin, check_permission
-from django.contrib.auth.models import Group, Permission
+from utils.permission import isLogin
 from rest_framework_jwt.views import ObtainJSONWebToken, RefreshJSONWebToken
 from utils import response_error, response_ok
 from django.contrib.auth import get_user_model

+ 0 - 1
apps/api/views.py

@@ -9,7 +9,6 @@ from rest_framework.views import APIView
 from django.conf import settings
 from utils.wx.WXBizMsgCrypt import WXBizMsgCrypt
 from utils.exceptions import CustomError
-from apps.order.models import Pay
 from utils.wechatpay import WechatPayNotify
 from utils import response_error, response_ok
 from apps.log.models import BizLog

+ 0 - 9
apps/option/filters.py

@@ -1,9 +0,0 @@
-import django_filters
-from .models import *
-
-class ConfigFilter(django_filters.FilterSet):
-    id = django_filters.CharFilter(field_name='id')
-
-    class Meta:
-        model = Config
-        fields = '__all__'

+ 0 - 93
apps/option/models.py

@@ -1,93 +0,0 @@
-
-from django.db import models
-from django.conf import settings
-from django.db.models import F
-from PIL import Image
-from utils.file_operation import UploadFile
-
-class Config(models.Model):
-    LEAVE_LEAD_TIME = "leave_lead_time"  # 付款码支付__付款码图片
-
-    property = models.CharField(max_length=100, verbose_name='属性')
-    value = models.TextField(blank=True, max_length=250, null=True, verbose_name='值')
-
-    class Meta:
-        db_table = "system_config"
-        verbose_name = u"综合设置"
-        default_permissions = ()
-        permissions = [
-            ('manage_system_config', u'管理'),
-        ]
-
-    @staticmethod
-    def get_value(property):
-        if property in [Config.LEAVE_LEAD_TIME,]:
-            row = Config.objects.get(property=property)
-            return row.value
-        return ''
-
-class Balance(models.Model):
-    balance = models.IntegerField(verbose_name=u'余额', default=0)
-    create_user = models.ForeignKey(settings.AUTH_USER_MODEL, verbose_name=u"创建人", related_name='balance_create_user',
-                                    on_delete=models.PROTECT, editable=False)
-
-    class Meta:
-        verbose_name = u"用户余额"
-        db_table = "user_balance"
-        ordering = ['-id']
-
-    @staticmethod
-    def update_balance(user, amount, desc):
-        Balance.objects.filter(create_user=user).update(balance=F('balance') + amount)
-        BalanceLog.objects.create(description=desc, amount=amount,create_user=user)
-
-class BalanceLog(models.Model):
-    description = models.CharField(verbose_name=u'描述', max_length=100)
-    amount = models.IntegerField(verbose_name=u'金额', default=0)
-    create_user = models.ForeignKey(settings.AUTH_USER_MODEL, verbose_name=u"创建人", related_name='balance_log_create_user',
-                                    on_delete=models.PROTECT, editable=False)
-    create_time = models.DateTimeField(verbose_name=u'创建时间', auto_now_add=True, editable=False)
-
-    class Meta:
-        verbose_name = u"余额明细"
-        db_table = "user_balance_log"
-        ordering = ['-id']
-
-class Poster(models.Model):
-
-    create_user = models.ForeignKey(settings.AUTH_USER_MODEL, verbose_name=u"创建人", on_delete=models.PROTECT,
-                                    editable=False)
-    create_time = models.DateTimeField(verbose_name='创建时间', auto_now_add=True)
-    enable = models.BooleanField(verbose_name=u"在用", default=True)
-    image = models.TextField(verbose_name=u'图片路径', null=True)
-    width = models.IntegerField(verbose_name=u"图片宽度", null=True)
-    height = models.IntegerField(verbose_name=u"图片高度", null=True)
-
-    class Meta:
-        db_table = 'poster'
-        ordering = ['-id']
-        verbose_name = u'轮播广告'
-
-    def _add_img(self, file):
-        width = None
-        height = None
-
-        path = "poster/"
-        filename = UploadFile(file, path)
-        fullname = "%s%s" % (settings.MEDIA_ROOT, filename)
-
-        try:
-            img = Image.open(fullname)
-            width, height = img.size
-            # 缩略图压缩宽或高最大200
-            if width > 1440:
-                img = img.resize((1440, int((height / width) * 1440)), Image.ANTIALIAS)
-                img.save(fullname)
-                width, height = img.size
-        except:
-            pass
-
-        self.image = "%s%s" % (settings.MEDIA_URL, filename)
-        self.width = width
-        self.height = height
-        self.save()

+ 0 - 44
apps/option/serializers.py

@@ -1,44 +0,0 @@
-# coding=utf-8
-
-from rest_framework import serializers
-from .models import *
-from utils.booleancharfield import PriceShowCharField
-from apps.base import Formater
-
-class ConfigSerializer(serializers.ModelSerializer):
-
-    class Meta:
-        model = Config
-        fields = '__all__'
-
-class BalanceSerializer(serializers.ModelSerializer):
-    create_user_text = serializers.CharField(source='create_user.username', read_only=True)
-    balance = PriceShowCharField(read_only=True)
-    date_joined_f = serializers.DateTimeField(source='create_user.date_joined', format=settings.SHORT_DATETIME_FORMAT,
-                                              read_only=True)
-
-    class Meta:
-        model = Balance
-        fields = '__all__'
-
-class BalanceLogSerializer(serializers.ModelSerializer):
-    create_time_f = serializers.DateTimeField(source='create_time', format=settings.SHORT_DATETIME_FORMAT,
-                                              read_only=True)
-    create_user_text = serializers.CharField(source='create_user.username', read_only=True)
-    amount = PriceShowCharField(read_only=True)
-    balance = serializers.SerializerMethodField()
-
-    def get_balance(self, obj):
-        balance = Balance.objects.filter(create_user=obj.create_user).first()
-        return Formater.formatPriceShow(balance.balance)
-
-    class Meta:
-        model = BalanceLog
-        fields = '__all__'
-
-class PosterSerializer(serializers.ModelSerializer):
-    create_user_name = serializers.CharField(source='create_user.employee.name', read_only=True)
-
-    class Meta:
-        model = Poster
-        fields = '__all__'

+ 0 - 15
apps/option/urls.py

@@ -1,15 +0,0 @@
-from django.conf.urls import url, include
-from rest_framework.routers import SimpleRouter
-
-from .views import *
-
-urlpatterns = [
-    url(r'getPoster/$', PosterView.as_view()),
-]
-
-router = SimpleRouter()
-router.register(r'config',ConfigViewSet)
-router.register(r'balance_log',BalanceLogViewSet)
-router.register(r'balance',BalanceViewSet)
-router.register(r'poster',PosterViewSet)
-urlpatterns += router.urls

+ 0 - 129
apps/option/views.py

@@ -1,129 +0,0 @@
-from utils.custom_modelviewset import CustomModelViewSet
-from django.db import transaction
-import json
-from django.db.models import Sum
-from rest_framework.decorators import action
-from .serializers import *
-from .filters import *
-from rest_framework.views import APIView
-from apps.log.models import BizLog
-from utils import response_ok, response_error
-from utils.exceptions import CustomError
-from utils.permission import isLogin
-from django.contrib.auth import get_user_model
-User = get_user_model()
-from utils.file_operation import attachment_save
-
-class ConfigViewSet(CustomModelViewSet):
-    permission_classes = [isLogin, ]
-    queryset = Config.objects.filter()
-    serializer_class = ConfigSerializer
-
-    def list(self, request, *args, **kwargs):
-        queryset = self.filter_queryset(self.get_queryset())
-        serializer = self.get_serializer(queryset, many=True)
-        return response_ok(serializer.data)
-
-    def create(self, request, *args, **kwargs):
-        try:
-            data = json.loads(request.POST.get('data'))
-            pay_picture = request.FILES.get('pay_picture')
-            keys = ['leave_lead_time', ]
-            with transaction.atomic():
-                for item in data:
-                    config = Config.objects.filter(property=item['key']).first()
-                    if item['value']:
-                        if item['key'] not in keys:
-                            raise CustomError(u'综合设置属性[%s]不存在' % item['key'])
-                        else:
-                            item['value'] = item['value'].strip()
-                        if config:
-                            config.value = item['value']
-                            config.save()
-                        else:
-                            Config.objects.create(property=item['key'], value=item['value'])
-
-                BizLog.objects.addnew(self.request.user, BizLog.INSERT, u'修改系统配置', data)
-        except CustomError as e:
-            return response_error(e.get_error_msg())
-        except Exception as e:
-            return response_error(str(e))
-        return response_ok()
-
-class BalanceViewSet(CustomModelViewSet):
-    permission_classes = [isLogin, ]
-    queryset = Balance.objects.filter()
-    serializer_class = BalanceSerializer
-
-    def filter_queryset(self, queryset):
-        queryset = queryset.filter()
-        if self.request.user.type == User.CUSTOMER:
-            queryset = queryset.filter(create_user=self.request.user)
-        return queryset
-
-    @action(methods=['post'], detail=False)
-    def clear_balance(self, request):
-        create_user = request.GET.get('create_user')
-        reason = request.POST.get('reason')
-        instance = Balance.objects.filter(create_user_id=create_user).first()
-        try:
-            if not reason:
-                raise CustomError('请填写清空原因!')
-            if not instance:
-                raise CustomError('学生信息错误,请刷新重试!')
-            with transaction.atomic():
-                if instance.balance <= 0:
-                    raise CustomError('余额为0,不能清空!')
-                desc = '清空余额,原因:{}'.format(reason)
-                Balance.update_balance(instance.create_user, -instance.balance, desc)
-                instance.balance = 0
-                instance.save()
-                BizLog.objects.addnew(self.request.user, BizLog.INSERT, u'清空[{}]余额, id={}'.
-                                      format(instance.create_user.username, instance.id), )
-        except CustomError as e:
-            return response_error(e.get_error_msg())
-        except Exception as e:
-            return response_error(str(e))
-        return response_ok()
-
-class BalanceLogViewSet(CustomModelViewSet):
-    permission_classes = [isLogin, ]
-    queryset = BalanceLog.objects.filter()
-    serializer_class = BalanceLogSerializer
-
-    def filter_queryset(self, queryset):
-        description = self.request.GET.get('description')
-        queryset = queryset.filter()
-        if self.request.user.type == User.CUSTOMER:
-            queryset = queryset.filter(create_user=self.request.user)
-        if description:
-            queryset = queryset.filter(description__icontains=description)
-        return queryset
-
-class PosterView(APIView):
-
-    def get(self, request):
-        data = []
-        queryset = Poster.objects.filter()
-        for row in queryset:
-            data.append(settings.SERVER_DOMAIN + row.image)
-        return response_ok(data)
-
-class PosterViewSet(CustomModelViewSet):
-    permission_classes = [isLogin, ]
-    queryset = Poster.objects.filter()
-    serializer_class = PosterSerializer
-
-    def create(self, request, *args, **kwargs):
-        banner_img = request.FILES.get('banner_img')
-        try:
-            with transaction.atomic():
-                poster = Poster.objects.create(create_user=request.user)
-                poster._add_img(banner_img)
-                BizLog.objects.addnew(self.request.user, BizLog.INSERT, u'添加轮播信息, id={}'.
-                                      format(poster.id), )
-            return response_ok()
-        except CustomError as e:
-            return response_error(e.get_error_msg())
-        except Exception as e:
-            return response_error(str(e))

+ 129 - 0
apps/order/__init__.py

@@ -1 +1,130 @@
 # coding=utf-8
+
+ZERO = 0
+ONE = 1
+TOW = 2
+THREE = 3
+FOUR = 4
+FIVE = 5
+SIX = 6
+SEVEN = 7
+EIGHT = 8
+NINE = 9
+TEN = 10
+TEN1 = 11
+TEN2 = 12
+TEN3 = 13
+TEN4 = 14
+TEN5 = 15
+TEN6 = 16
+TEN7 = 17
+TEN8 = 18
+TEN9 = 19
+TEN10 = 20
+
+CATEGORY_CHOICES = (
+    (ZERO, u'草稿'),
+    (ONE, u'已上报'),
+)
+
+STATUS_CHOICES = (
+    (ZERO, u'待审核'),
+    (ONE, u'已通过'),
+    (TOW, u'退回修改'),
+    (THREE, u'拒绝审批'),
+)
+
+GENDER_CHOICES = (
+    (ZERO, u'女'),
+    (ONE, u'男'),
+)
+
+HUKOU_CHOICES = (
+    (ZERO, u'本地'),
+    (ONE, u'外地'),
+)
+
+NATIONALITY_CHOICES = (
+    (ZERO, u'中国大陆(内地)'),
+    (ONE, u'中国香港'),
+    (TOW, u'中国台湾'),
+    (THREE, u'中国澳门'),
+    (FOUR, u'外国籍'),
+)
+
+ITYPE_CHOICES = (
+    (ZERO, u'身份证'),
+    (ONE, u'护照'),
+    (TOW, u'军官证'),
+    (THREE, u'户口'),
+    (FOUR, u'临时身份证'),
+    (FIVE, u'港澳台通行证'),
+)
+
+HUNYIN_CHOICES = (
+    (ZERO, u'未婚'),
+    (ONE, u'已婚'),
+    (TOW, u'离异'),
+    (THREE, u'丧偶'),
+    (FOUR, u'其他'),
+)
+JIAOYU_CHOICES = (
+    (ZERO, u'高中以下'),
+    (ONE, u'高中'),
+    (TOW, u'专科'),
+    (THREE, u'学士'),
+    (FOUR, u'硕士'),
+    (FIVE, u'博士'),
+)
+FAGNCHAN_CHOICES = (
+    (ZERO, u'按揭商品房'),
+    (ONE, u'单位房产'),
+    (TOW, u'全款自购商品房'),
+    (THREE, u'直系亲属房产'),
+    (FOUR, u'自建房'),
+    (FIVE, u'租赁房'),
+    (SIX, u'其他'),
+)
+YOUJI_CHOICES = (
+    (ZERO, u'同居住地址'),
+    (ONE, u'同单位地址'),
+)
+HANGYE_CHOICES = (
+    (ZERO, u'农林牧鱼'),
+    (ONE, u'制造业'),
+    (TOW, u'批发零售'),
+    (THREE, u'信息传输/软件/信息技术服务'),
+    (FOUR, u'房地产'),
+    (FIVE, u'建筑业'),
+    (SIX, u'住宿/餐饮'),
+    (SEVEN, u'卫生/社会工作'),
+    (EIGHT, u'科研/技术服务'),
+    (NINE, u'公共管理/社会保障/社会组织'),
+    (TEN, u'采矿业'),
+    (TEN1, u'文化/体育/娱乐业'),
+    (TEN2, u'居民服务/修理/其他服务业'),
+    (TEN3, u'租赁/商务服务业'),
+    (TEN4, u'交通运输/仓储/邮政业'),
+    (TEN5, u'教育'),
+    (TEN6, u'金融'),
+    (TEN7, u'国际组织'),
+    (TEN8, u'电热力/燃气/水生产供应业'),
+    (TEN9, u'水利/环境/公共设施管理'),
+    (TEN10, u'其他'),
+)
+ZHIYE_CHOICES = (
+    (ZERO, u'个体工商户'),
+    (ONE, u'私/民营企业'),
+    (TOW, u'公务员(政府机关正式员工)'),
+    (THREE, u'国有企业/事业单位'),
+    (FOUR, u'外资企业'),
+    (FIVE, u'专业技术人员'),
+    (SIX, u'现代金融关联企业'),
+    (SEVEN, u'其他'),
+)
+GUANXI_CHOICES = (
+    (ZERO, u'配偶'),
+    (ONE, u'父母'),
+    (TOW, u'子女'),
+    (THREE, u'其他'),
+)

+ 2 - 2
apps/order/filters.py

@@ -4,10 +4,10 @@ import django_filters
 from .models import *
 from apps.base import clean_datetime_range
 
-class PackageFilter(django_filters.FilterSet):
+class ProductFilter(django_filters.FilterSet):
 
     class Meta:
-        model = Package
+        model = Product
         fields = '__all__'
 
 class OrderFilter(django_filters.FilterSet):

+ 94 - 117
apps/order/models.py

@@ -1,136 +1,118 @@
 # coding=utf-8
 from django.db import models
 from django.conf import settings
-from django.utils import timezone
 from utils.exceptions import CustomError
-from apps.base import Formater
-from apps.option.models import Balance
 from apps.log.models import BizLog
 from django.contrib.auth import get_user_model
 User = get_user_model()
+from apps.upload.models import Upload
+from apps import order
 
-class Pay(models.Model):
-    WAIT = 0
-    PAY = 1
-    UNDO = 2
-    STATUS_CHOICES = (
-        (WAIT, u'待付款'),
-        (PAY, u'已付款'),
-        (UNDO, u'已取消'),
-    )
-    CUSTOMER = 1
-    TYPE_CHOICES = (
-        (CUSTOMER, u'客户'),
-    )
-
-    pay_no = models.CharField(max_length=25, verbose_name='支付单号', unique=True, null=True)
-    status = models.PositiveSmallIntegerField(choices=STATUS_CHOICES, verbose_name='状态', default=WAIT)
-    type = models.PositiveSmallIntegerField(choices=TYPE_CHOICES, verbose_name='类别', default=CUSTOMER)
-    precreate_amount = models.BigIntegerField(verbose_name=u"预支付金额")
-    create_time = models.DateTimeField(verbose_name=u"创建时间", default=timezone.now)
-    amount = models.BigIntegerField(verbose_name=u"支付金额", null=True)
-    user = models.ForeignKey(settings.AUTH_USER_MODEL, verbose_name=u'下单人', related_name='pay_user',
-                             on_delete=models.PROTECT)
-    pay_time = models.DateTimeField(verbose_name=u"创建时间", null=True)
-
-    class Meta:
-        db_table = "pay"
-        verbose_name = u"支付信息"
-        ordering = ('-id',)
-        default_permissions = ()
-
-    def payClosed(self):
-        if self.status != Pay.WAIT:
-            return
-
-        self.status = Pay.UNDO
-        self.save()
-
-    def paySuccess(self, pay_amount):
-        if self.status != Pay.WAIT:
-            return
-
-        self.status = Pay.PAY
-        self.amount = Formater.formatPrice(pay_amount)
-        self.pay_time = timezone.now()
-        self.save()
-        order = Order.objects.filter(pay=self).first()
-        if order:
-            order.status = Order.FINISH
-            order.actual_amount = self.amount
-
-            if order.package:
-                desc = '充值{}元,赠送{}元'.format(Formater.formatPriceShow(order.package.amount),
-                                            Formater.formatPriceShow(order.package.give_amount))
-                Balance.update_balance(order.create_user, order.package.amount+order.package.give_amount, desc)
-            order.save()
-
-    @staticmethod
-    def getByNo(pay_no):
-        instance = Pay.objects.filter(pay_no=pay_no).first()
-        if not instance:
-            raise CustomError(u'未找到相应的支付单号!')
-        return instance
-
-    # 小程序支付
-    @staticmethod
-    def wechatAppPay(user, amount, type=1):
-        item = Pay._precreatePay(
-            user,
-            amount,
-            type,
-        )
-        return item
-
-    @staticmethod
-    def _precreatePay(user, amount, type):
-
-        pay_no = '{0}{1}'.format(user.id, timezone.now().strftime('%y%m%d%H%M%S'))
-        pay = Pay.objects.create(
-            pay_no=pay_no,
-            status=Pay.WAIT,
-            precreate_amount=amount,
-            user=user,
-            type=type,
-        )
-        return pay
-
-class Package(models.Model):
+class Product(models.Model):
     create_user = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='package_create_user', verbose_name=u"添加人",
                                     on_delete=models.PROTECT, editable=False)
     create_time = models.DateTimeField(verbose_name=u'添加时间', auto_now_add=True, editable=False)
-    amount = models.BigIntegerField(verbose_name=u'充值金额', default=0)
-    give_amount = models.BigIntegerField(verbose_name=u'赠送余额', default=0)
-
+    month = models.IntegerField(verbose_name=u'贷款期限')
+    name = models.CharField(verbose_name=u'产品名称', max_length=200)
+    enable = models.BooleanField(verbose_name=u'是否在用', default=True,)
+    main_image = models.ForeignKey(Upload, verbose_name=u'主图', on_delete=models.SET_NULL, null=True,
+                                   related_name='main_image')
     class Meta:
-        db_table = "package"
-        verbose_name = u"套餐"
+        db_table = "product"
+        verbose_name = u"贷款产品"
         ordering = ('-id',)
         default_permissions = ()
         permissions = [
         ]
 
+class ProductImages(models.Model):
+
+    name = models.CharField(verbose_name=u'名称', max_length=200)
+    product = models.ForeignKey(Product, verbose_name=u'产品', on_delete=models.PROTECT, related_name='product_images')
+    image = models.ForeignKey(Upload, verbose_name=u'图片', on_delete=models.PROTECT)
+
+    class Meta:
+        db_table = "product_images"
+        verbose_name = u"产品图片"
+        ordering = ('id',)
+        default_permissions = ()
+
 class Order(models.Model):
-    WAIT_PAY = 1
-    FINISH = 2
-    CANCEL = 3
-    STATUS_CHOICES = (
-        (WAIT_PAY, u'待付款'),
-        (FINISH, u'已完成'),
-        (CANCEL, u'已取消'),
-    )
-
-    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)
-    package = models.ForeignKey(Package, verbose_name='套餐', on_delete=models.PROTECT, null=True, editable=False)
-
-    status = models.PositiveSmallIntegerField(choices=STATUS_CHOICES, verbose_name=u"订单状态", default=WAIT_PAY)
+
+
+    category = models.PositiveSmallIntegerField(choices=order.CATEGORY_CHOICES, verbose_name=u"订单类型", default=order.ZERO)
+    status = models.PositiveSmallIntegerField(choices=order.STATUS_CHOICES, verbose_name=u"订单状态", default=order.ZERO)
+    seller = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='order_seller', verbose_name=u"业务人员",
+                                    on_delete=models.PROTECT, editable=False)
     create_user = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='order_create_user', verbose_name=u"添加人",
                                     on_delete=models.PROTECT, editable=False)
     create_time = models.DateTimeField(verbose_name=u'添加时间', auto_now_add=True, editable=False)
-    total_amount = models.BigIntegerField(verbose_name=u'总金额', default=0)
-    balance_deduction = models.BigIntegerField(verbose_name=u'余额抵扣', editable=False, default=0)
-    actual_amount = models.BigIntegerField(verbose_name=u'实付金额', editable=False, default=0)
+    cancel_reason = models.CharField(max_length=100, verbose_name=u"未通过原因", null=True)
+
+    vmodel = models.CharField(max_length=100, verbose_name=u"车型", null=True)
+    invioce = models.CharField(max_length=10, verbose_name=u"车辆发票金额", null=True)
+
+    ptax = models.CharField(max_length=10, verbose_name=u"购置税", null=True)
+    insurance = models.CharField(max_length=10, verbose_name=u"保险", null=True)
+    boutique = models.CharField(max_length=10, verbose_name=u"精品", null=True)
+    wextension = models.CharField(max_length=10, verbose_name=u"延保", null=True)
+    upkeep = models.CharField(max_length=10, verbose_name=u"保养", null=True)
+    dpratio = models.CharField(max_length=10, verbose_name=u"首付比例", null=True)
+    lamount = models.CharField(max_length=10, verbose_name=u"申请贷款金额", null=True)
+    package = models.ForeignKey(Product, verbose_name=u'贷款产品', on_delete=models.PROTECT, null=True)
+
+    name = models.CharField(max_length=10, verbose_name=u"姓名", null=True)
+    sex = models.PositiveSmallIntegerField(choices=order.STATUS_CHOICES, verbose_name=u"性别", default=order.ZERO)
+    bdate = models.DateField(verbose_name=u"出生日期", null=True)
+    rpr = models.PositiveSmallIntegerField(choices=order.HUKOU_CHOICES, verbose_name=u"户口", default=order.ZERO)
+    nationality = models.PositiveSmallIntegerField(choices=order.NATIONALITY_CHOICES, verbose_name=u"国籍/地区", default=order.ZERO)
+    ntype = models.PositiveSmallIntegerField(choices=order.ITYPE_CHOICES, verbose_name=u"身份证件类型", default=order.ZERO)
+    inumber = models.CharField(max_length=18, verbose_name=u"身份证件号码", null=True)
+    mstatus = models.PositiveSmallIntegerField(choices=order.HUNYIN_CHOICES, verbose_name=u"婚姻状况", default=order.ZERO)
+    elevel = models.PositiveSmallIntegerField(choices=order.JIAOYU_CHOICES, verbose_name=u"教育程度", default=order.ZERO)
+    naddress = models.CharField(max_length=100, verbose_name=u"现居住地址", null=True)
+    hptype = models.PositiveSmallIntegerField(choices=order.FAGNCHAN_CHOICES, verbose_name=u"现居住房产类型", default=order.ZERO)
+    maddress = models.PositiveSmallIntegerField(choices=order.YOUJI_CHOICES, verbose_name=u"邮寄地址", default=order.ZERO)
+    email = models.CharField(max_length=100, verbose_name=u"电子邮箱", null=True)
+    wx = models.CharField(max_length=100, verbose_name=u"微信号", null=True)
+    phone = models.CharField(max_length=15, verbose_name=u"住宅固定电话", null=True)
+    tel = models.CharField(max_length=11, verbose_name=u"手机号", null=True)
+    wname = models.CharField(max_length=100, verbose_name=u"现工作单位名称", null=True)
+    wphone = models.CharField(max_length=15, verbose_name=u"单位电话", null=True)
+    waddress = models.CharField(max_length=100, verbose_name=u"现工作单位地址", null=True)
+    itype = models.PositiveSmallIntegerField(choices=order.HANGYE_CHOICES, verbose_name=u"行业类型", default=order.ZERO)
+    otype = models.PositiveSmallIntegerField(choices=order.ZHIYE_CHOICES, verbose_name=u"职业类型", default=order.ZERO)
+    position = models.CharField(max_length=20, verbose_name=u"职位", null=True)
+
+    wbst = models.BooleanField(verbose_name=u"是否挂靠", default=False)
+    bstname = models.CharField(max_length=100, verbose_name=u"挂靠公司名称", null=True)
+    bstcode = models.CharField(max_length=100, verbose_name=u"挂靠公司组织机构代码", null=True)
+    bsttel = models.CharField(max_length=100, verbose_name=u"挂靠公司电话", null=True)
+    bstaddress = models.CharField(max_length=100, verbose_name=u"挂靠公司地址", null=True)
+
+    cname = models.CharField(max_length=10, verbose_name=u"联系人1名称", null=True)
+    ctel = models.CharField(max_length=11, verbose_name=u"联系人1手机号", null=True)
+    relation = models.PositiveSmallIntegerField(choices=order.GUANXI_CHOICES, verbose_name=u"与借款人关系", default=order.ZERO)
+    caddress = models.CharField(max_length=100, verbose_name=u"现居住地址", null=True)
+    ctname = models.CharField(max_length=10, verbose_name=u"联系人2姓名", null=True)
+    cttel = models.CharField(max_length=11, verbose_name=u"联系人2手机号", null=True)
+
+    thesame = models.BooleanField(verbose_name=u"是否有共同借款人", default=False)
+    tsname = models.CharField(max_length=10, verbose_name=u"共借人姓名", null=True)
+    tsbdate = models.DateField(verbose_name=u"出生日期", null=True)
+    tsitype = models.PositiveSmallIntegerField(choices=order.ITYPE_CHOICES, verbose_name=u"身份证件类型", default=order.ZERO)
+    tsinumber = models.CharField(max_length=18, verbose_name=u"身份证件号码", null=True)
+    tstel = models.CharField(max_length=11, verbose_name=u"手机号", null=True)
+    tsrelation = models.PositiveSmallIntegerField(choices=order.GUANXI_CHOICES, verbose_name=u"与借款人关系",
+                                                default=order.ZERO)
+    tsnaddress = models.CharField(max_length=100, verbose_name=u"现居住地址", null=True)
+    tsmaddress = models.PositiveSmallIntegerField(choices=order.YOUJI_CHOICES, verbose_name=u"邮寄地址", default=order.ZERO)
+    tsemail = models.CharField(max_length=50, verbose_name=u"电子邮箱", null=True)
+    tswx = models.CharField(max_length=20, verbose_name=u"微信号", null=True)
+    tswname = models.CharField(max_length=100, verbose_name=u"现工作单位名称", null=True)
+    tswphone = models.CharField(max_length=15, verbose_name=u"单位电话", null=True)
+    tswaddress = models.CharField(max_length=100, verbose_name=u"现工作单位地址", null=True)
+    tsmincome = models.CharField(max_length=10, verbose_name=u"税后月收入", null=True)
 
     class Meta:
         db_table = "order"
@@ -140,11 +122,6 @@ class Order(models.Model):
         permissions = [
         ]
 
-    def get_no(self):
-        now = timezone.now()
-        no = '%s%s' % (self.create_user.id, now.strftime('%Y%m%d%H%M%S'))
-        return no
-
     @staticmethod
     def get_instance_by_id(id):
         try:

+ 5 - 15
apps/order/serializers.py

@@ -6,29 +6,23 @@ from django.conf import settings
 from utils.booleancharfield import PriceShowCharField
 from apps.base import Formater
 
-class PackageSerializer(serializers.ModelSerializer):
+class ProductSerializer(serializers.ModelSerializer):
     create_user_text = serializers.CharField(source='create_user.username', read_only=True)
     create_time_f = serializers.DateTimeField(source='create_time', format=settings.SHORT_DATETIME_FORMAT,
                                               read_only=True)
-    amount = PriceShowCharField(read_only=True)
-    give_amount = PriceShowCharField(read_only=True)
 
     class Meta:
-        model = Package
+        model = Product
         fields = '__all__'
 
     def create(self, validated_data):
         validated_data['create_user'] = self.context['request'].user
-        validated_data['amount'] = Formater.formatPrice(self.initial_data['amount'])
-        validated_data['give_amount'] = Formater.formatPrice(self.initial_data['give_amount'])
-        instance = super(PackageSerializer, self).create(validated_data)
+        instance = super(ProductSerializer, self).create(validated_data)
         instance.save()
         return instance
 
     def update(self, instance, validated_data):
-        validated_data['amount'] = Formater.formatPrice(self.initial_data['amount'])
-        validated_data['give_amount'] = Formater.formatPrice(self.initial_data['give_amount'])
-        instance = super(PackageSerializer, self).update(instance, validated_data)
+        instance = super(ProductSerializer, self).update(instance, validated_data)
         instance.save()
         return instance
 
@@ -37,18 +31,14 @@ class OrderSerializer(serializers.ModelSerializer):
     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)
+    category_text = serializers.CharField(source='get_category_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
         fields = '__all__'
 
     def create(self, validated_data):
         validated_data['create_user'] = self.context['request'].user
-        validated_data['total_amount'] = abs(Formater.formatPrice(self.initial_data['total_amount']))
         instance = super(OrderSerializer, self).create(validated_data)
-        instance.no = instance.get_no()
         instance.save()
         return instance

+ 2 - 2
apps/order/urls.py

@@ -5,10 +5,10 @@ from rest_framework.routers import SimpleRouter
 from .views import *
 
 urlpatterns = [
-    url(r'packageDict/$', PackageView.as_view()),
+    url(r'productDict/$', ProductView.as_view()),
 ]
 
 router = SimpleRouter()
-router.register(r'package', PackageViewSet)
+router.register(r'product', ProductViewSet)
 router.register(r'', OrderViewSet)
 urlpatterns += router.urls

+ 11 - 50
apps/order/views.py

@@ -13,33 +13,32 @@ from utils import response_ok, response_error
 from utils.permission import isLogin
 from apps.order.models import Order
 from apps.WeChatResponse import WechatAppletPay
-from apps.option.models import Balance
 from django.contrib.auth import get_user_model
 
 User = get_user_model()
 
 
-class PackageView(APIView):
+class ProductView(APIView):
 
     def get(self, request):
         data = []
-        queryset = Package.objects.filter()
+        queryset = Product.objects.filter(enable=True)
         for row in queryset:
             item = {
                 'id':row.id,
-                'amount':Formater.formatPriceShow(row.amount),
-                'give_amount':Formater.formatPriceShow(row.give_amount),
+                'name':row.name,
+                'month':row.month,
             }
             data.append(item)
         return response_ok(data)
 
-class PackageViewSet(CustomModelViewSet):
+class ProductViewSet(CustomModelViewSet):
     permission_classes = [isLogin, ]
-    queryset = Package.objects.filter()
-    serializer_class = PackageSerializer
+    queryset = Product.objects.filter()
+    serializer_class = ProductSerializer
 
     def filter_queryset(self, queryset):
-        f = PackageFilter(self.request.GET, queryset=queryset)
+        f = ProductFilter(self.request.GET, queryset=queryset)
         return f.qs
 
 class OrderViewSet(CustomModelViewSet):
@@ -68,57 +67,19 @@ class OrderViewSet(CustomModelViewSet):
         return response_ok(serializer.data)
 
     def filter_queryset(self, queryset):
-        queryset = queryset.filter()
+        queryset = queryset.filter(Q(create_user=self.request.user))
         f = OrderFilter(self.request.GET, queryset=queryset)
         return f.qs
 
     def create(self, request, *args, **kwargs):
-        openid = request.POST.get('openid')
-        appid = request.POST.get('appid')
-        package = request.POST.get('package') or ''
         try:
             with transaction.atomic():
                 serializer = self.get_serializer(data=request.data)
                 if serializer.is_valid(raise_exception=True):
                     instance = serializer.save()
-                    total_amount = instance.total_amount
-
-                    # 充值套餐
-                    if package:
-                        package = Package.objects.filter(id=package).first()
-                        if package:
-                            instance.package = package
-                            actual_amount = package.amount
-                        else:
-                            raise CustomError('套餐错误,请刷新重试!')
-                    else:
-                        # 余额抵扣
-                        balance = Balance.objects.filter(create_user=request.user).first()
-                        if balance and balance.balance > 0:
-                            if balance.balance >= total_amount:
-                                instance.balance_deduction = total_amount
-                                actual_amount = 0
-                                instance.status = Order.FINISH
-
-                                desc = '支付抵扣{}元'.format(Formater.formatPriceShow(total_amount))
-                                Balance.update_balance(instance.create_user, -instance.balance_deduction, desc)
-                            else:
-                                raise CustomError('余额不足,请充值!')
-                        else:
-                            raise CustomError('余额不足,请充值!')
-                    data = ''
-                    if actual_amount:
-                        # 小程序在线支付
-                        pay = Pay.wechatAppPay(self.request.user, actual_amount, Pay.CUSTOMER)
-                        wechatpay = WechatAppletPay(appid)
-                        data = wechatpay.weChatUnifiedOrder(openid, pay.pay_no,
-                                                            Formater.formatPriceShow(actual_amount))
-                        instance.pay = pay
-
-                    instance.save()
                     BizLog.objects.addnew(self.request.user, BizLog.INSERT,
-                                          u'添加订单[%s],id=%d' % (instance.no, instance.id), request.data)
-                    return response_ok(data)
+                                          u'添加订单[%s],id=%d' % (instance.id), request.data)
+                    return response_ok()
         except CustomError as e:
             return response_error(e.get_error_msg())
         except Exception as e:

+ 0 - 0
apps/option/migrations/__init__.py → apps/upload/__init__.py


+ 0 - 0
apps/upload/migrations/__init__.py


+ 90 - 0
apps/upload/models.py

@@ -0,0 +1,90 @@
+# coding=utf-8
+import os
+
+from PIL import Image
+from django.conf import settings
+from django.db import models
+from utils.file_operation import UploadFile, DeleteFile
+
+class UploadManager(models.Manager):
+
+    def _addnew(self, file):
+        width = None
+        height = None
+
+        path = UploadManager.calculatePath()
+        filename = UploadFile(file, path)
+        fullname = "%s%s" % (settings.MEDIA_ROOT, filename)
+        size = os.path.getsize(fullname)
+
+        try:
+            img = Image.open(fullname)
+            width, height = img.size
+            # 缩略图压缩宽或高最大200
+            if width > 1440:
+                img = img.resize((1440, int((height / width) * 1440)), Image.ANTIALIAS)
+                img.save(fullname)
+                width, height = img.size
+        except:
+            pass
+
+        instance = self.model(
+            picture="%s%s" % (settings.MEDIA_URL, filename),
+            width=width,
+            height=height,
+            file_size="%.2f" % (float(size) / 1024),
+        )
+        instance.save()
+        return instance
+
+    def _addnew_voice(self, file, time):
+
+        path = UploadManager.calculatePath()
+        filename = UploadFile(file, path)
+        fullname = "%s%s" % (settings.MEDIA_ROOT, filename)
+        size = os.path.getsize(fullname)
+
+        instance = self.model(
+            picture="%s%s" % (settings.MEDIA_URL, filename),
+            width=200,
+            height=200,
+            file_size="%.2f" % (float(size) / 1024),
+            voice_time=time,
+        )
+        instance.save()
+        return instance
+
+    @staticmethod
+    def calculatePath():
+        return commodity_image
+
+commodity_image = "product_image/"
+
+class Upload(models.Model):
+    picture = models.CharField(verbose_name=u'图片路径', max_length=250)
+    width = models.IntegerField(verbose_name=u"图片宽度", blank=True, default=0)
+    height = models.IntegerField(verbose_name=u"图片高度", blank=True, default=0)
+    create_time = models.DateTimeField(verbose_name=u'上传时间', auto_now_add=True, editable=False)
+    file_size = models.FloatField(verbose_name="文件大小", blank=True, default=0)
+
+    objects = UploadManager()
+
+    class Meta:
+        db_table = 'system_upload'
+        verbose_name = u'文件上传'
+        ordering = ['-create_time']
+        index_together = (
+            'create_time',
+        )
+        default_permissions = ()
+
+    def del_images(self):
+        picture = self.picture
+        self.delete()
+        DeleteFile(picture)
+
+    def get_path(self):
+        return '%s%s' % (settings.SERVER_DOMAIN, self.picture)
+
+    def get_picture(self):
+        return self.picture

+ 15 - 0
apps/upload/serializers.py

@@ -0,0 +1,15 @@
+# coding=utf-8
+
+from rest_framework import serializers
+from django.conf import settings
+from .models import Upload
+
+
+class UploadSerializer(serializers.ModelSerializer):
+    user_text = serializers.CharField(source='user.name', read_only=True)
+    create_time_f = serializers.DateTimeField(source='create_time', format=settings.SHORT_DATETIME_FORMAT,
+                                              read_only=True)
+
+    class Meta:
+        model = Upload
+        fields = ('picture', 'create_time_f', 'file_size', 'user_text')

+ 2 - 2
nostone_loan/settings.py

@@ -46,8 +46,8 @@ INSTALLED_APPS = [
     'apps.WechatApplet',
     'apps.WechatTp',
     'apps.api',
-    'apps.option',
     'apps.order',
+    'apps.upload',
 
 ]
 
@@ -118,7 +118,7 @@ WSGI_APPLICATION = 'nostone_loan.wsgi.application'
 DATABASES = {
     'default': {
         'ENGINE': 'django.db.backends.mysql',
-        'NAME': 'nostone_loan',
+        'NAME': 'noston_loan',
         'USER': 'carwin',
         'PASSWORD': 'carwin!@#',
         'HOST': '39.106.109.89',

+ 0 - 1
nostone_loan/urls.py

@@ -25,7 +25,6 @@ urlpatterns = [
     url(r'^$', index),
     url(r'^account/', include('apps.account.urls')),
     url(r'^api/', include('apps.api.urls')),
-    url(r'^option/', include('apps.option.urls')),
     url(r'^order/', include('apps.order.urls')),
 
 ]