lyh hai 1 ano
pai
achega
c5eba7f5bb

+ 17 - 0
apps/base.py

@@ -11,3 +11,20 @@ class Formater(object):
     def formatPriceShow(value):
         return '%.2f' % (float(value or 0)/100.0)
 
+    @staticmethod
+    def formatCount(value):
+        return int(round(float(value or 0) * 100, 0))
+
+    @staticmethod
+    def formatCountShow(value):
+        return '%.2f' % (float(value or 0) / 100.0)
+
+
+    @staticmethod
+    def formatAmount(value):
+        return int(round(float(value or 0) * 10000, 0))
+
+    @staticmethod
+    def formatAmountShow(value):
+        return '%.2f' % (float(value or 0) / 10000.0 + 0.0000001)
+

+ 18 - 0
apps/customer/models.py

@@ -106,3 +106,21 @@ class CustomerVehicle(models.Model):
         db_table = 'customer_vehicle'
         verbose_name = u'客户车辆'
         default_permissions = ()
+
+
+class CustomerAddress(models.Model):
+    customer = models.ForeignKey(Customer, verbose_name=u'客户', on_delete=models.PROTECT)
+    name = models.CharField(max_length=100, verbose_name=u"姓名")
+    tel = models.CharField(max_length=50, verbose_name=u'电话')
+    area = models.CharField(max_length=200, verbose_name=u"地区")
+    addr = models.CharField(max_length=500, verbose_name=u"详细地址")
+    is_default = models.BooleanField(verbose_name=u"默认", default=False)
+    delete = models.BooleanField(verbose_name=u"删除", default=False)
+    create_time = models.DateTimeField(verbose_name=u"添加时间", default=timezone.now, editable=False)
+
+    class Meta:
+        db_table = 'customer_address'
+        verbose_name = u'客户地址'
+        default_permissions = ()
+    
+    

+ 12 - 1
apps/product/filters.py

@@ -2,7 +2,7 @@
 
 import django_filters
 
-from .models import Product, ProductImg
+from .models import Product, ProductImg, ProductOrder
 
 
 class ProductFilter(django_filters.FilterSet):
@@ -18,3 +18,14 @@ class ProductImageFilter(django_filters.FilterSet):
     class Meta:
         model = ProductImg
         fields = '__all__'
+
+
+class ProductOrderFilter(django_filters.FilterSet):
+    customer_name = django_filters.CharFilter(field_name='customer_address__name', lookup_expr='icontains')
+    product_name = django_filters.CharFilter(field_name='product__name', lookup_expr='icontains')
+    tel = django_filters.CharFilter(field_name='customer_address__tel', lookup_expr='icontains')
+    status = django_filters.CharFilter(field_name='status')
+
+    class Meta:
+        model = ProductOrder
+        fields = '__all__'

+ 28 - 0
apps/product/models.py

@@ -5,6 +5,7 @@ from django.conf import settings
 
 from apps.foundation.models import Option
 from apps.images.models import Images
+from apps.customer.models import Customer, CustomerAddress
 
 
 class Product(models.Model):
@@ -36,3 +37,30 @@ class ProductImg(models.Model):
         db_table = 'product_img'
         verbose_name = u'商品图片'
         default_permissions = ()
+
+
+class ProductOrder(models.Model):
+    WAIT_PAY = 1
+    PAID = 2
+    FINISHED = 3
+    STATUS_CHOICES = (
+        (WAIT_PAY, u'待支付'),
+        (PAID, u'已支付'),
+        (FINISHED, u'已完成'),
+    )
+    product = models.ForeignKey(Product, verbose_name=u'商品', on_delete=models.PROTECT)
+    create_time = models.DateTimeField(verbose_name=u"添加时间", auto_now_add=True, editable=False)
+    no = models.CharField(max_length=64, verbose_name=u"单号", null=True, editable=False, blank=True)
+    status = models.PositiveSmallIntegerField(choices=STATUS_CHOICES, verbose_name=u'状态', default=WAIT_PAY)
+    customer = models.ForeignKey(Customer, verbose_name=u'客户', on_delete=models.PROTECT, editable=False)
+    customer_address = models.ForeignKey(CustomerAddress, verbose_name=u'收货信息', on_delete=models.PROTECT, editable=False)
+    count = models.IntegerField(verbose_name=u'购买数量')
+    price = models.BigIntegerField(verbose_name=u'单价', editable=False)
+    amount = models.BigIntegerField(verbose_name=u'合计金额', editable=False)
+    notes = models.CharField(max_length=1000, verbose_name=u'备注', null=True)
+    delete = models.BooleanField(verbose_name=u'删除', default=False, editable=False)
+
+    class Meta:
+        db_table = 'product_order'
+        verbose_name = u'商品订单'
+        default_permissions = ()

+ 30 - 1
apps/product/serializers.py

@@ -9,7 +9,7 @@ from utils.exceptions import CustomError
 from apps.base import Formater
 from apps.images.models import Images
 
-from .models import Product, ProductImg
+from .models import Product, ProductImg, ProductOrder
 
 
 class ProductSerializer(serializers.ModelSerializer):
@@ -71,3 +71,32 @@ class ProductImgSerializer(serializers.ModelSerializer):
     class Meta:
         model = ProductImg
         fields = '__all__'
+
+
+class ProductOrderSerializer(serializers.ModelSerializer):
+    product_name = serializers.CharField(source='product.name', read_only=True)
+    name = serializers.CharField(source='customer.name', read_only=True)
+    customer_name = serializers.CharField(source='customer_address.name', read_only=True)
+    customer_tel = serializers.CharField(source='customer_address.tel', read_only=True)
+    area = serializers.CharField(source='customer_address.area', read_only=True)
+    addr = serializers.CharField(source='customer_address.addr', read_only=True)
+    status_text = serializers.CharField(source='get_status_display', read_only=True)
+    create_time = serializers.DateTimeField(format='%Y-%m-%d %H:%M', read_only=True)
+    price = serializers.SerializerMethodField()
+    amount = serializers.SerializerMethodField()
+
+    def get_price(self, obj):
+        return Formater.formatPriceShow(obj.price)
+
+    def get_amount(self, obj):
+        return Formater.formatAmountShow(obj.amount)
+
+    class Meta:
+        model = ProductOrder
+        fields = '__all__'
+
+    def validate(self, attrs):
+        if 'price' in attrs:
+            attrs['price'] = Formater.formatPrice(attrs['price'])
+        return attrs
+

+ 1 - 0
apps/product/urls.py

@@ -10,6 +10,7 @@ urlpatterns = [
 ]
 
 router = SimpleRouter()
+router.register(r'order', ProductOrderViewSet)
 router.register(r'images', ProductImageViewSet)
 router.register(r'', ProductViewSet)
 urlpatterns += router.urls

+ 21 - 0
apps/product/views.py

@@ -87,3 +87,24 @@ class ProductImageViewSet(CustomModelViewSet):
             instance.delete()
             img.del_images()
         return response_ok()
+
+
+class ProductOrderViewSet(CustomModelViewSet):
+    queryset = ProductOrder.objects.filter(delete=False)
+    serializer_class = ProductOrderSerializer
+
+    def filter_queryset(self, queryset):
+        f = ProductOrderFilter(self.request.GET, queryset=queryset)
+        return f.qs
+
+    @action(methods=['post'], detail=True)
+    def finish(self, request, pk):
+        order = ProductOrder.objects.filter(id=pk).first()
+        with transaction.atomic():
+            if order.status == ProductOrder.WAIT_PAY:
+                raise CustomError(u'订单未支付!')
+            if order.status == ProductOrder.FINISHED:
+                raise CustomError(u'订单已完成!')
+            order.status = ProductOrder.FINISHED
+            order.save()
+        return response_ok()

+ 3 - 3
uis/views/account/login.html

@@ -2,7 +2,7 @@
 <html>
 <head>
   <meta charset="utf-8">
-  <title>小程序商城</title>
+  <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">
@@ -16,7 +16,7 @@
 
     <div class="layadmin-user-login-main">
       <div class="layadmin-user-login-box layadmin-user-login-header">
-        <h2>小程序商城系统</h2>
+        <h2>亿通商城系统</h2>
       </div>
       <form class="layui-form" action="" lay-filter="component-form-element">
       <div class="layadmin-user-login-box layadmin-user-login-body layui-form">
@@ -36,7 +36,7 @@
     </div>
     
     <div class="layui-trans layadmin-user-login-footer">
-      <p>© 2022 小程序商城系统 <a href="http://www.zzliaoyuan.com/" target="_blank">郑州燎原计算机技术有限公司</a></p>
+      <p>© 2022 亿通商城系统 <a href="http://www.zzliaoyuan.com/" target="_blank">郑州燎原计算机技术有限公司</a></p>
     </div>
     
     <!--<div class="ladmin-user-login-theme">

+ 1 - 1
uis/views/dashboard/home.html

@@ -13,7 +13,7 @@
 
 <div class="layui-card" style="height: 100%;display:flex;">
   <div style="margin:auto;font-weight:bold;font-size: 32px;font-style: normal;color:#868686;">
-    欢迎使用小程序商城后台系统
+    欢迎使用亿通商城后台系统
   </div>
 </div>
 

+ 45 - 18
uis/views/index.html

@@ -2,7 +2,7 @@
 <html>
 <head>
     <meta charset="utf-8">
-    <title>小程序商城系统</title>
+    <title>亿通商城系统</title>
     <meta name="renderer" content="webkit">
     <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
     <meta name="viewport"
@@ -59,34 +59,58 @@
         <div class="layui-side layui-side-menu">
             <div class="layui-side-scroll">
                 <div class="layui-logo">
-                    <span>小程序商城<span style="font-size: 12px;">erp</span></span>
+                    <span>亿通商城</span>
                 </div>
 
           <ul class="layui-nav layui-nav-tree" lay-shrink="all" id="LAY-system-side-muen" lay-filter="layadmin-system-side-menu">
-            <li data-name="set" class="layui-nav-item">
-              <a href="javascript:;" lay-tips="业务管理" lay-direction="2">
+              <li data-name="set" class="layui-nav-item">
+              <a href="javascript:;" lay-tips="新车作业" lay-direction="2">
                 <i class="layui-icon layui-icon-cart-simple"></i>
-                <cite>业务管理</cite>
+                <cite>新车作业</cite>
               </a>
               <dl class="layui-nav-child">
                 <dd data-name="button">
-                  <a lay-href="customer/index.html">客户管理</a>
+                  <a lay-href="customer/index.html">询价管理</a>
                 </dd>
                 <dd data-name="button">
-                  <a lay-href="purchase/purchase_price.html">询价管理</a>
+                  <a lay-href="customer/index.html">试驾预约</a>
                 </dd>
+              </dl>
+            </li>
+            <li data-name="set" class="layui-nav-item">
+              <a href="javascript:;" lay-tips="二手车作业" lay-direction="2">
+                <i class="layui-icon layui-icon-cart-simple"></i>
+                <cite>二手车作业</cite>
+              </a>
+              <dl class="layui-nav-child">
                 <dd data-name="button">
-                    <a lay-href="purchase/purchase_order.html">合同管理</a>
-                  </dd>
+                  <a lay-href="customer/index.html">询价管理</a>
+                </dd>
                 <dd data-name="button">
-                    <a lay-href="purchase/purchase_payment.html">付款管理</a>
-                  </dd>
+                  <a lay-href="purchase/purchase_price.html">置换预估</a>
+                </dd>
+              </dl>
+            </li>
+              <li data-name="set" class="layui-nav-item">
+              <a href="javascript:;" lay-tips="维保作业" lay-direction="2">
+                <i class="layui-icon layui-icon-cart-simple"></i>
+                <cite>维保作业</cite>
+              </a>
+              <dl class="layui-nav-child">
                 <dd data-name="button">
-                    <a lay-href="purchase/purchase_invoice.html">发票管理</a>
-                  </dd>
-                <dd data-name="button" >
-                    <a lay-href="purchase/purchase_price_query.html">询价历史</a>
-                  </dd>
+                  <a lay-href="customer/index.html">预约保养</a>
+                </dd>
+              </dl>
+            </li>
+              <li data-name="set" class="layui-nav-item">
+              <a href="javascript:;" lay-tips="商品作业" lay-direction="2">
+                <i class="layui-icon layui-icon-cart-simple"></i>
+                <cite>商品作业</cite>
+              </a>
+              <dl class="layui-nav-child">
+                <dd data-name="button">
+                  <a lay-href="product_order/index.html">商品销售</a>
+                </dd>
               </dl>
             </li>
             <li data-name="set" class="layui-nav-item">
@@ -95,10 +119,13 @@
                 <cite>基础数据</cite>
               </a>
               <dl class="layui-nav-child">
-                <dd data-name="nav" data-permission="vehicle_model.browse_vehicle_series">
+                 <dd data-name="button">
+                  <a lay-href="customer/index.html">客户管理</a>
+                </dd>
+                <dd data-name="nav">
                     <a lay-href="vehicle_series/index.html">车系管理</a>
                 </dd>
-                <dd data-name="nav" data-permission="vehicle_model.browse_vehicle_model">
+                <dd data-name="nav">
                     <a lay-href="vehicle_model/index.html">车型管理</a>
                 </dd>
                 <dd data-name="nav">

+ 149 - 0
uis/views/product_order/index.html

@@ -0,0 +1,149 @@
+<!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">
+  <link rel="stylesheet" type="text/css" href="../../layuiadmin/style/formSelects-v4.css"/>
+    <style type="text/css">
+    .LAY-btns .layui-nav {padding-left:0;padding-right:10px;top:-4px;margin: 0 10px;border: 0;background-color: #009688;}
+    .LAY-btns .layui-nav .layui-nav-item{line-height: 30px;}
+    .LAY-btns .layui-nav .layui-nav-child{top:34px;}
+    .LAY-btns .layui-nav .layui-nav-bar{display: none;}
+    .LAY-btns .layui-nav .layui-nav-child dd.layui-this a{color:#333;background-color:#fff;}
+    .LAY-btns .layui-nav .layui-nav-child dd.layui-this a:hover {background-color: #f2f2f2;color: #000;}
+    .seach_items {float:right;margin-left: 10px;}
+  </style>
+</head>
+<body>
+
+  <div class="layui-fluid">
+    <div class="layui-card">
+        <div class="layui-card-body" pad15>
+        <div class="layui-row layui-col-space15">
+          <div class="layui-col-md12">
+            <div class="LAY-btns" style="margin-bottom: 10px;">
+
+                <form class="layui-form" lay-filter="query-form-element">
+                    <div class="seach_items">
+                        <button class="layui-btn" lay-submit lay-filter="query-form-element"><i class="layui-icon layui-icon-search"></i>查询</button>
+                    </div>
+                    <div class="seach_items">
+                        <input type="text"  name="tel" autocomplete="off" class="layui-input" placeholder="收货电话"/>
+                    </div>
+
+                    <div class="seach_items">
+                        <input type="text"  name="customer_name" autocomplete="off" class="layui-input" placeholder="收货人"/>
+                    </div>
+                    <div class="seach_items">
+                        <input type="text"  name="product_name" autocomplete="off" class="layui-input" placeholder="商品"/>
+                    </div>
+                    <div class="seach_items">
+                       <select  name="status">
+                            <option value="">状态</option>
+                            <option value="1">待支付</option>
+                            <option value="2">已支付</option>
+                            <option value="3">已完成</option>
+                        </select>
+                    </div>
+
+                </form>
+                <div style="clear: both;"></div>
+            </div>
+            <table class="layui-hide" id="datagrid" lay-filter="datagrid-operate"></table>
+
+            <script type="text/html" id="datagrid-operate-bar">
+                <div class="layui-btn-group">
+                    <a class="layui-btn layui-btn-xs" lay-event="finish">完成</a>
+                </div>
+            </script>
+          </div>
+        </div>
+        </div>
+    </div>
+  </div>
+
+  <script src="../../layuiadmin/layui/layui.js?t=1"></script>
+  <script>
+  layui.config({
+    base: '../../../layuiadmin/' //静态资源所在路径
+  }).extend({
+    index: 'lib/index' //主入口模块
+     ,formSelects: 'formSelects-v4'
+  }).use(['index', 'table', 'form', 'formSelects'], function(){
+    var $ = layui.$
+        ,table = layui.table
+        ,form = layui.form;
+
+    table.render({
+      elem: '#datagrid'
+      ,url: '/product/order/'
+      ,cols: [[
+        {field:'no', title:'单号',width: 100}
+       ,{field:'status_text', title:'状态',width: 100}
+       ,{field:'name', title:'客户',width: 100}
+       ,{field:'product_name', title:'商品',width: 150}
+       ,{field:'customer_name', title:'收货人',width: 100}
+       ,{field:'customer_tel', title:'电话',width: 120}
+       ,{field:'count', title:'购买数量',width: 100, align: 'right'}
+       ,{field:'price', title:'单价',width: 80, align: 'right'}
+       ,{field:'amount', title:'合计金额',width: 80, align: 'right'}
+       ,{field:'area', title:'收货地区',width: 150}
+       ,{field:'addr', title:'收货地址',width: 150}
+       ,{field:'create_time', title:'创建时间',width: 150}
+       ,{field:'notes', title:'备注',width: 150}
+        ,{width:80, align:'center', fixed: 'right', toolbar: '#datagrid-operate-bar'}
+      ]]
+      ,page: true
+      ,height: 'full-108'
+      , done: function () {
+        layui.index.removeNoPermButtons()
+      }
+    });
+    form.on('submit(query-form-element)', function(data){
+      //layer.msg(JSON.stringify(data.field));
+      table.reload('datagrid', {
+          where: data.field
+          ,page:{curr:1}
+      });
+      layer.closeAll();
+      return false;
+    });
+    //监听工具条
+    table.on('tool(datagrid-operate)', function(obj){
+      var data = obj.data;
+      table.editdata = data;
+        if(obj.event === 'finish'){
+            if (data.status == '1'){
+                 layer.msg('订单未支付');
+                return;
+            }
+            if (data.status == '3'){
+                 layer.msg('订单已完成');
+                return;
+            }
+         layer.confirm('确定订单已完成吗?', function(index){
+            layer.close(index);
+            layui.admin.req({
+                url: '/product/order/'+data.id + '/finish/'
+                ,type: 'post'
+                ,done: function(res){
+                    if(res.code === 1){
+                        layer.msg(res.msg);
+                        return;
+                    }
+                    table.reload('datagrid',{});
+                }
+            });
+        });
+      }
+    });
+  });
+  </script>
+</body>
+</html>
+