Bläddra i källkod

Merge remote-tracking branch 'origin/master'

jiaweiqi 1 år sedan
förälder
incheckning
58579d522a

+ 7 - 1
apps/foundation/filters.py

@@ -2,7 +2,7 @@
 
 import django_filters
 
-from .models import Option
+from .models import Option, Config
 
 
 class OptionFilter(django_filters.FilterSet):
@@ -12,3 +12,9 @@ class OptionFilter(django_filters.FilterSet):
     class Meta:
         model = Option
         fields = '__all__'
+
+class ConfigFilter(django_filters.FilterSet):
+
+    class Meta:
+        model = Config
+        fields = '__all__'

+ 32 - 0
apps/foundation/models.py

@@ -24,6 +24,7 @@ class Option(models.Model):
     name = models.CharField(max_length=100, verbose_name=u"名称")
     notes = models.CharField(max_length=500, verbose_name=u"备注",blank=True,null=True)
     enable = models.BooleanField(verbose_name=u"在用", default=True)
+    delete = models.BooleanField(verbose_name=u"删除", default=False)
 
     @staticmethod
     def getTypeText(type):
@@ -103,3 +104,34 @@ class BizLog(models.Model):
         ordering = ['-id']
         verbose_name = u"日志管理"
         default_permissions = ()
+
+
+class Config(models.Model):
+    KEY_WECHAT_APPID = "wechat_appid"  #小程序appid
+    KEY_WECHAT_SESSION_KEY = "wechat_session_key" #小程序密钥
+    KEY_ABUTMENT_XGJ = "abutment_xgj" # 对接销管佳
+    KEY_XGJ_SESSION_KEY = "xgj_session_key" # 销管佳密钥
+    KEY_XGJ_IP = "xgj_ip" # 销管佳地址
+
+    property = models.CharField(max_length=100, verbose_name=u'属性')
+    value = models.TextField(verbose_name=u'值')
+
+    class Meta:
+        db_table = "system_config"
+        verbose_name = u"基础设置"
+        index_together = (
+            'property',
+        )
+        default_permissions = ()
+        permissions = [
+            ('browse_config', u'查看'),
+            ('set_config', u'设置'),
+        ]
+
+    @staticmethod
+    def getConfigValue(property):
+        try:
+            row = Config.objects.get(property=property)
+            return row.value
+        except:
+            return ''

+ 22 - 1
apps/foundation/serializers.py

@@ -1,7 +1,8 @@
 # coding=utf-8
 
 from rest_framework import serializers
-from .models import Option
+from .models import Option, Config, BizLog
+from apps.account import tenant_log
 
 
 class OptionSerializer(serializers.ModelSerializer):
@@ -24,3 +25,23 @@ class OptionSerializer(serializers.ModelSerializer):
     def update(self, instance, validated_data):
         instance = super(OptionSerializer, self).update(instance, validated_data)
         return instance
+
+class ConfigSerializer(serializers.ModelSerializer):
+
+    class Meta:
+        model = Config
+        fields = '__all__'
+
+    def create(self, validated_data):
+        tenant = self.context['request'].user.employee.tenant
+        data = self.context['request'].data
+        for item in data:
+            if not item['value'] or item['value'].strip() == '':
+                continue
+            config = Config.objects.filter(property=item['key'], tenant=tenant).first()
+            if config:
+                config.value = item['value']
+                config.save()
+            else:
+                Config.objects.create(property=item['key'], value=item['value'], tenant=tenant)
+        tenant_log(self.context['request'].user, BizLog.INSERT, u'修改系统配置', data)

+ 1 - 0
apps/foundation/urls.py

@@ -12,4 +12,5 @@ urlpatterns = [
 
 router = SimpleRouter()
 router.register(r'option', OptionViewSet)
+router.register(r'config', ConfigViewSet)
 urlpatterns += router.urls

+ 33 - 21
apps/foundation/views.py

@@ -1,15 +1,15 @@
 # coding=utf-8
-
+import json
 from django.db import transaction
 from rest_framework.views import APIView
 from rest_framework.decorators import action
 from utils import response_ok
 from utils.custom_modelviewset import CustomModelViewSet
 from utils.exceptions import CustomError
-from apps.foundation.models import BizLog, Option
+from apps.foundation.models import BizLog, Option, Config
 from apps.account import tenant_log
-from .filters import OptionFilter
-from .serializers import OptionSerializer
+from .filters import OptionFilter, ConfigFilter
+from .serializers import OptionSerializer, ConfigSerializer
 
 class OptionDictView(APIView):
 
@@ -20,7 +20,7 @@ class OptionDictView(APIView):
         return response_ok(ret)
 
 class OptionViewSet(CustomModelViewSet):
-    queryset = Option.objects.filter()
+    queryset = Option.objects.filter(delete=False)
     serializer_class = OptionSerializer
 
     def filter_queryset(self, queryset):
@@ -43,25 +43,11 @@ class OptionViewSet(CustomModelViewSet):
     def destroy(self, request, *args, **kwargs):
         with transaction.atomic():
             instance = self.get_object()
+            instance.delete = True
+            instance.save()
             tenant_log(self.request.user, BizLog.DELETE, u'删除系统选项[%s],id=%d' % (instance.name, instance.id))
-            instance.delete()
-        return response_ok()
-
-    def create_default(self, request):
-        if not self.request.user.has_perm('option.add_option'):
-            raise CustomError(u"您没有[系统选项-添加]权限,无法执行该操作,请联系管理员分配权限!")
-        tenant = request.user.employee.tenant
-        with transaction.atomic():
-            for default in Option.DEFAULT_OPTION:
-                default['tenant'] = tenant
-                is_exist = Option.is_exist(tenant, default['type'], default['name'])
-                if is_exist:
-                    continue
-                Option.objects.create(**default)
-            tenant_log(self.request.user, BizLog.INSERT, u'添加默认系统选项')
         return response_ok()
 
-
 class OptionSearchSearch(APIView):
     def get(self, request):
         type = request.GET.get('type')
@@ -84,3 +70,29 @@ class OptionSearchSearch(APIView):
             data.append(item)
 
         return response_ok(data)
+
+
+class ConfigViewSet(CustomModelViewSet):
+    queryset = Config.objects.filter()
+    serializer_class = ConfigSerializer
+
+    def filter_queryset(self, queryset):
+        queryset = queryset.filter()
+        f = ConfigFilter(self.request.GET, queryset=queryset)
+        return f.qs
+
+    #@action(methods=['post'], detail=True)
+    def create(self, request):
+
+        data = json.loads(request.POST.get('data'))
+        with transaction.atomic():
+            for item in data:
+                config = Config.objects.filter(property=item['key']).first()
+                if item['value']:
+                    if config:
+                        config.value = item['value']
+                        config.save()
+                    else:
+                        config = Config.objects.create(property=item['key'], value=item['value'])
+            tenant_log(self.request.user, BizLog.INSERT, u'修改系统设置', data)
+        return response_ok()

+ 0 - 19
apps/images/models.py

@@ -121,22 +121,3 @@ class Images(models.Model):
     def get_path(self):
         return '%s%s%s' % (settings.SERVER_DOMAIN, settings.MEDIA_URL, self.picture)
 
-    # @staticmethod
-    # def downLoadFace(customer, url):
-    #     save_path = customer_face_file + str(customer.user.id) + '/'
-    #     filename = DownloadFace(url, save_path, 'jpg')
-    #     name = filename.split('/')[-1]
-    #     fullname = "%s/%s" % (settings.MEDIA_ROOT, filename)
-    #     width = None
-    #     height = None
-    #     try:
-    #         img = Image.open(fullname)
-    #         width, height = img.size
-    #     except:
-    #         pass
-    #     instance = Images.objects.create(
-    #         tenant=customer.tenant, user=customer.user, type=Images.CUSTOMER_FACE, name=name, picture=filename,
-    #         width=width, height=height, create_time=timezone.now()
-    #     )
-    #     instance.save()
-    #     return instance

+ 2 - 1
apps/usedvehicle/models.py

@@ -34,6 +34,7 @@ class UsedVehicle(models.Model):
     oil_type = models.CharField(max_length=20, verbose_name=u"燃油类型")
     mileage = models.FloatField(verbose_name=u"车辆里程")
     notes = models.CharField(max_length=200, verbose_name=u"备注", blank=True, null=True)
+    delete = models.BooleanField(verbose_name=u"删除", default=False)
 
     class Meta:
         db_table = "usedvehicle"
@@ -44,7 +45,7 @@ class UsedVehicle(models.Model):
 
 class UsedVehicleImg(models.Model):
     main = models.ForeignKey(UsedVehicle, verbose_name=u'车型', on_delete=models.PROTECT)
-    img = models.ForeignKey(Images, verbose_name=u'图片', on_delete=models.PROTECT)
+    img = models.ForeignKey(Images, verbose_name=u'图片', on_delete=models.PROTECT, blank=True, null=True)
 
     class Meta:
         db_table = 'usedvehicle_img'

+ 5 - 4
apps/usedvehicle/views.py

@@ -14,7 +14,7 @@ from .models import *
 
 
 class UsedVehicleViewSet(CustomModelViewSet):
-    queryset = UsedVehicle.objects.filter()
+    queryset = UsedVehicle.objects.filter(delete=False)
     serializer_class = UsedVehicleSerializer
 
     def filter_queryset(self, queryset):
@@ -39,7 +39,8 @@ class UsedVehicleViewSet(CustomModelViewSet):
         with transaction.atomic():
             instance = self.get_object()
             tenant_log(self.request.user, BizLog.DELETE, u'删除二手车[%s],id=%d' % (instance.number, instance.id))
-            instance.delete()
+            instance.delete = True
+            instance.save()
         return response_ok()
 
     @action(methods=['post'], detail=True)
@@ -85,8 +86,8 @@ class UsedVehicleViewSet(CustomModelViewSet):
             raise CustomError(u'未找到上传文件!')
 
         with transaction.atomic():
-            image = Images.objects.employee_addnew(request.user.employee, Images.USEDVEHICLE_FILE, image)
-            UsedVehicleImg.objects.create(vehicle_model=vehicle, img=image)
+            image = Images.objects.employee_addnew(request.user, Images.USEDVEHICLE_FILE, image)
+            UsedVehicleImg.objects.create(main=vehicle, img=image)
             tenant_log(request.user, BizLog.DELETE,
                        u'二手车[%s]上传图片,id=%d' % (vehicle.number, vehicle.id))
 

+ 147 - 0
uis/views/config/index.html

@@ -0,0 +1,147 @@
+<!DOCTYPE html>
+<html>
+<head>
+  <meta charset="utf-8">
+  <title>修改密码</title>
+  <meta name="renderer" content="webkit">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+  <meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=0">
+  <link rel="stylesheet" href="../../layuiadmin/layui/css/layui.css" media="all">
+  <link rel="stylesheet" href="../../layuiadmin/style/admin.css" media="all">
+   <style type="text/css">
+        .input {
+            width: 70%;
+            border-radius: 2px;
+            height: 30px;
+            border-width: 1px;
+            border-color: lightgray;
+            border-style: solid;
+            background-color: white;
+            padding-left: 3px;
+            margin-top: 20px;
+        }
+    </style>
+</head>
+<body>
+
+  <div class="layui-fluid">
+    <div class="layui-card">
+        <div class="layui-card-body" pad15>
+            <form class="layui-form" action="" lay-filter="component-form-element">
+              <div class="layui-row layui-col-space10 layui-form-item">
+                 <div>
+                    <label >销管佳对接:</label>
+                      <input type="checkbox" name="abutment_xgj" lay-skin="switch" lay-text="是|否" >
+                </div>
+                <div>
+                    <label >销管佳地址:</label>
+                    <input type="text" name="xgj_ip" autocomplete="off" class="input">
+                </div>
+                  <div>
+                    <label >销管佳密钥:</label>
+                    <input type="text" name="xgj_session_key"  autocomplete="off" class="input">
+                </div>
+                 <div>
+                  <label><font color='red' size="4">*</font>小程序appid:</label>
+                  <input type="text" name="wechat_appid" lay-verify="required" autocomplete="off" class="input">
+                </div>
+                <div>
+                    <label ><font color='red' size="4">*</font>小程序密钥:</label>
+                    <input type="text" name="wechat_session_key" lay-verify="required" autocomplete="off" class="input">
+                </div>
+                <div class="layui-input-block">
+                  <button class="layui-btn" lay-submit lay-filter="component-form-element">保存</button>
+                </div>
+              </div>
+            </form>
+          </div>
+        </div>
+      </div>
+
+
+  <script src="../../layuiadmin/layui/layui.js"></script>
+  <script>
+  layui.config({
+    base: '../../../layuiadmin/' //静态资源所在路径
+  }).extend({
+    index: 'lib/index' //主入口模块
+  }).use(['index', 'form', 'utils'], function(){
+    var $ = layui.$
+    ,admin = layui.admin
+    ,element = layui.element
+    ,form = layui.form;
+    form.render(null, 'component-form-element');
+    element.render('breadcrumb', 'breadcrumb');
+
+    admin.req({
+        url: '/foundation/config/',
+        done: function (res) {
+            var data = res.data;
+            var edit_data = {};
+            for(var i in data) {
+                if (data[i].property === 'wechat_appid'){
+                    edit_data['wechat_appid'] = data[i].value;
+                }else if (data[i].property === 'wechat_session_key') {
+                    edit_data['wechat_session_key'] = data[i].value;
+                }else if (data[i].property === 'abutment_xgj'){
+                    if (data[i].value == 'true') {
+                        edit_data['abutment_xgj'] = true
+                    }else {
+                        edit_data['abutment_xgj'] = false
+                    }
+                }else if(data[i].property === 'xgj_session_key'){
+                    edit_data['xgj_session_key'] = data[i].value
+                }else if(data[i].property === 'xgj_ip'){
+                    edit_data['xgj_ip'] = data[i].value
+                }
+            }
+            form.val("component-form-element", edit_data);
+            form.render();
+        }
+    });
+
+    form.on('submit(component-form-element)', function(data){
+      var save_data = [];
+      if (data.field['wechat_appid']){
+          save_data.push({key: 'wechat_appid', value: data.field['wechat_appid']})
+      }
+      if (data.field['wechat_session_key']){
+          save_data.push({key: 'wechat_session_key', value: data.field['wechat_session_key']})
+      }
+      if (data.field['abutment_xgj']){
+          save_data.push({key: 'abutment_xgj',  value: 'true'});
+      }else{
+           save_data.push({key: 'abutment_xgj',  value: 'false'})
+      }
+      if (data.field['xgj_session_key']){
+          save_data.push({key: 'xgj_session_key',  value: data.field['xgj_session_key']})
+      }
+      if (data.field['xgj_ip']){
+          save_data.push({key: 'xgj_ip',  value: data.field['xgj_ip']})
+      }
+      admin.req({
+        url: '/foundation/config/'
+        ,data: {data: JSON.stringify(save_data)}
+        ,type: 'post'
+        ,done: function(res){
+            layer.open({
+                 type: 1
+                ,content: '<div style="padding: 20px 100px;">保存成功</div>'
+                ,btn: '关闭'
+                ,btnAlign: 'c' //按钮居中
+                ,shade: 0 //不显示遮罩
+                ,yes: function(){
+                  layer.closeAll();
+                  //admin.exit();
+                }
+            });
+        }
+      });
+
+      return false;
+    });
+
+  });
+  </script>
+</body>
+</html>

+ 4 - 4
uis/views/usedvehicle/edit.html

@@ -86,21 +86,21 @@
                   </div>
                 </div>
                 <div>
-                  <label class="layui-form-label">座位数:</label>
+                  <label class="layui-form-label"><font color='red' size="4">*</font>座位数:</label>
                   <div class="layui-input-block">
-                    <input type="text" name="seat_count" lay-verify="intGeZ" placeholder="请输入座位数" autocomplete="off" class="layui-input">
+                    <input type="text" name="seat_count" lay-verify="required|intGeZ" placeholder="请输入座位数" autocomplete="off" class="layui-input">
                   </div>
                 </div>
                 <div>
                   <label class="layui-form-label">上牌日期:</label>
                   <div class="layui-input-block">
-                    <input id="plate_date" type="text" name="plate_date" placeholder="请输入上牌日期" autocomplete="off" class="layui-input" lay-verify="required">
+                    <input id="plate_date" type="text" name="plate_date" placeholder="请输入上牌日期" autocomplete="off" class="layui-input">
                   </div>
                 </div>
                 <div>
                   <label class="layui-form-label">出厂日期:</label>
                   <div class="layui-input-block">
-                    <input id="factory_date" type="text" name="factory_date" placeholder="请输入出厂日期" autocomplete="off" class="layui-input" lay-verify="required">
+                    <input id="factory_date" type="text" name="factory_date" placeholder="请输入出厂日期" autocomplete="off" class="layui-input" >
                   </div>
                 </div>
                 <div>

+ 2 - 2
uis/views/usedvehicle/index.html

@@ -59,7 +59,7 @@
                     <a class="layui-btn layui-btn-xs" lay-event="edit">修改</a>
                     <a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a>
                     <a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="sale">售出</a>
-                    <a class="layui-btn layui-btn-xs" lay-event="sale">售出</a>
+                    <a class="layui-btn layui-btn-xs" lay-event="upload">车辆图片</a>
                 </div>
             </script>
           </div>
@@ -116,7 +116,7 @@
        ,{field:'oil_type', title:'燃油类型',width: 100}
        ,{field:'mileage', title:'车辆里程',width: 100}
        ,{field:'notes', title:'备注',width: 150}
-        ,{width:180, align:'center', fixed: 'right', toolbar: '#datagrid-operate-bar'}
+        ,{width:200, align:'center', fixed: 'right', toolbar: '#datagrid-operate-bar'}
       ]]
       ,page: true
       ,height: 'full-108'