lyh 3 éve
szülő
commit
8cff7565d2

+ 20 - 1
apps/activity/filters.py

@@ -41,6 +41,7 @@ class MemberCouponFilter(django_filters.FilterSet):
 
 class OrderFilter(django_filters.FilterSet):
     activity_name = django_filters.CharFilter(field_name='activity__title', lookup_expr='icontains')
+    activity = django_filters.CharFilter(field_name='activity')
     delete = django_filters.CharFilter(field_name='delete')
 
     class Meta:
@@ -51,6 +52,7 @@ class OrderFilter(django_filters.FilterSet):
 
 class CouponFilter(django_filters.FilterSet):
     name = django_filters.CharFilter(field_name='name',lookup_expr='icontains')
+    activity = django_filters.CharFilter(field_name='activity')
     enabled = django_filters.CharFilter(field_name='enabled')
 
     class Meta:
@@ -61,4 +63,21 @@ class CouponFilter(django_filters.FilterSet):
 
     def __init__(self, data=None, *args, **kwargs):
         data = clean_datetime_range(data, 'create_time')
-        super(CouponFilter, self).__init__(data, *args, **kwargs)
+        super(CouponFilter, self).__init__(data, *args, **kwargs)
+
+
+class ActivityFilter(django_filters.FilterSet):
+    title = django_filters.CharFilter(field_name='title',lookup_expr='icontains')
+    branch_name = django_filters.CharFilter(field_name='branch_name', lookup_expr='icontains')
+    enabled = django_filters.CharFilter(field_name='enabled')
+    check_status = django_filters.CharFilter(field_name='check_status')
+
+    class Meta:
+        model = Activity
+        fields = (
+            'title', 'branch_name', 'check_status', 'enabled'
+        )
+
+    def __init__(self, data=None, *args, **kwargs):
+        data = clean_datetime_range(data, 'create_time')
+        super(ActivityFilter, self).__init__(data, *args, **kwargs)

+ 13 - 1
apps/activity/models.py

@@ -59,10 +59,22 @@ class Activity(models.Model):
     branch_name = models.CharField(max_length=200, verbose_name=u"门店名称", null=True, blank=True)
     branch_tel = models.CharField(max_length=50, verbose_name=u"门店电话", null=True, blank=True)
     branch_address = models.CharField(max_length=200, verbose_name=u"门店地址", null=True, blank=True)
+    required_signs = models.CharField(verbose_name=u'必填项', max_length=300, null=True, editable=False)
     create_time = models.DateTimeField(verbose_name=u"添加时间", auto_now_add=True, editable=False)
     enabled = models.BooleanField(verbose_name=u"在用", default=True)
     delete = models.BooleanField(verbose_name=u"删除", default=False)
 
+    @staticmethod
+    def getById(id):
+        try:
+            id = int(id)
+        except:
+            raise CustomError(u'无效的活动')
+        instance = Activity.objects.filter(pk=id).first()
+        if not instance:
+            raise CustomError(u'未找到相应的活动')
+        return instance
+
     class Meta:
         db_table = "activity"
         ordering = ['-id']
@@ -86,6 +98,7 @@ class Order(models.Model):
     model = models.CharField(max_length=200, verbose_name=u"车型", null=True, blank=True)
     tel = models.CharField(max_length=100, verbose_name=u"电话", null=True, blank=True)
     number = models.CharField(max_length=50, verbose_name=u"车牌号", null=True, blank=True)
+    name = models.CharField(max_length=50, verbose_name=u"姓名", null=True, blank=True)
     create_time = models.DateTimeField(verbose_name=u"添加时间", auto_now_add=True, editable=False)
     delete = models.BooleanField(verbose_name=u"删除", default=False)
 
@@ -131,7 +144,6 @@ class MemberCoupon(models.Model):
     activity = models.ForeignKey(Activity, verbose_name=u"活动", on_delete=models.PROTECT)
     member = models.ForeignKey(Member, verbose_name=u"会员", on_delete=models.PROTECT)
     coupon = models.ForeignKey(Coupon, verbose_name=u"优惠券", on_delete=models.PROTECT)
-    activity = models.ForeignKey(Activity, verbose_name=u"活动", on_delete=models.PROTECT)
     receive_date = models.DateField(verbose_name=u"领取日期", null=True, blank=True)
     end_date = models.DateField(verbose_name=u"有效期至", null=True, blank=True)
     write_off = models.BooleanField(verbose_name=u"核销", default=True)

+ 67 - 0
apps/activity/serializers.py

@@ -102,6 +102,7 @@ class OrderSerializer(serializers.ModelSerializer):
 
 
 class CouponSerializer(serializers.ModelSerializer):
+    branch_name = serializers.CharField(source='branch.name', read_only=True)
     create_time = serializers.DateTimeField(format=base.DATETIME_FORMAT, read_only=True)
     enabled_text = serializers.SerializerMethodField()
 
@@ -149,3 +150,69 @@ class CouponSerializer(serializers.ModelSerializer):
         BizLog.objects.addnew(self.user, BizLog.UPDATE, u"修改优惠券[%s],id=%s" % (instance.name, instance.id),validated_data)
         instance = super(CouponSerializer, self).update(instance, validated_data)
         return instance
+
+class ActivitySerializer(serializers.ModelSerializer):
+    create_time = serializers.DateTimeField(format='%Y-%m-%d %H:%M', read_only=True)
+    check_status_text = serializers.CharField(source='get_check_status_display', read_only=True)
+    enabled_text = serializers.SerializerMethodField()
+    coupons = serializers.SerializerMethodField()
+
+
+    class Meta:
+        model = Activity
+        fields = '__all__'
+
+    def get_enabled_text(self, obj):
+        if obj.enabled:
+            return u'是'
+        return u'否'
+
+    def get_coupons(self, obj):
+        data = []
+        rows = ActivityCoupon.objects.filter(activity=obj)
+        data.extend([s.id for s in rows])
+        return data
+
+    @staticmethod
+    def factory(user, data, id=None):
+        if id:
+            instance = Activity.getById(id)
+        else:
+            instance = None
+        serializer = ActivitySerializer(instance, data=data)
+        serializer.user = user
+        return serializer
+
+    def validSave(self):
+        if self.is_valid():
+            return self.save()
+        else:
+            raise CustomError(dump_serializer_errors(self))
+
+    def validate(self, data):
+        if 'enabled' in data:
+            data['enabled'] = True
+        else:
+            data['enabled'] = False
+        return data
+
+    def create(self, validated_data):
+        instance = super(ActivitySerializer, self).create(validated_data)
+        instance.save()
+        BizLog.objects.addnew(self.user, BizLog.INSERT, u"添加活动[%s],id=%s" % (instance.title, instance.id),
+                              validated_data)
+        return instance
+
+    def update(self, instance, validated_data):
+        BizLog.objects.addnew(self.user, BizLog.UPDATE, u"修改活动[%s],id=%s" % (instance.title, instance.id),
+                              validated_data)
+        instance = super(ActivitySerializer, self).update(instance, validated_data)
+        return instance
+
+
+class CouponComboboxSerializer(serializers.ModelSerializer):
+    value = serializers.CharField(source='id', read_only=True)
+
+    class Meta:
+        model = Coupon
+        fields = ('value', 'name',)

+ 9 - 0
apps/activity/urls.py

@@ -5,6 +5,7 @@ from .views import *
 urlpatterns = (
     url(r'^branch/data/$', branch_list),
     url(r'^branch/save/$', branch_save),
+    url(r'^self_branch/$', self_branch),
 
     url(r'^member/data/$', member_list),
     url(r'^member_coupon/data/$', member_coupon_list),
@@ -15,5 +16,13 @@ urlpatterns = (
 
     url(r'^coupon/data/$', coupon_list),
     url(r'^coupon/save/$', coupon_save),
+    url(r'^coupon/dict/$', coupon_dict),
+
+    url(r'^activity/data/$', activity_list),
+    url(r'^activity/save/$', activity_save),
+    url(r'^activity/delete/$', activity_delete),
+    url(r'^activity/check/$', activity_check),
+    url(r'^activity/signs_save/$', activity_signs_save),
+    url(r'^activity/coupon_save/$', activity_coupon_save),
 )
 

+ 158 - 0
apps/activity/views.py

@@ -44,6 +44,15 @@ def branch_save(request):
         return JSONError(u'保存失败!')
 
 
+@token_required
+def self_branch(request):
+    order = Branch.objects.filter(id=request.user.branch_id).first()
+    data = {}
+    if order:
+        data = {'name': order.name, 'tel': order.tel, 'address': order.address}
+    return JSONResponse({'data': data})
+
+
 @token_required
 def member_list(request):
     f = MemberFilter(request.GET, queryset=Member.objects.filter(branch=request.user.branch))
@@ -128,3 +137,152 @@ def coupon_save(request):
     except Exception as e:
         traceback.print_exc()
         return JSONError(u'保存失败!')
+
+
+@token_required
+def coupon_dict(request):
+    rows = Coupon.objects.filter(
+        Q(branch=request.user.branch, enabled=True) &
+        Q(
+            Q(end_date__isnull=False) & Q(end_date__gt=timezone.now().date()) |
+            Q(end_date__isnull=True)
+        )
+    )
+
+    serializer = CouponComboboxSerializer(rows, many=True)
+    return DataGridJSONResponse(serializer.data, rows.count())
+
+
+@token_required
+def activity_list(request):
+    if request.user.is_superuser:
+        rows = Activity.objects.filter(delete=False)
+    else:
+        rows = Activity.objects.filter(branch_id=request.user.branch_id, delete=False)
+    f = ActivityFilter(request.GET, queryset=rows)
+    rows, total = utils.get_page_data(request, f.qs)
+    serializer = ActivitySerializer(rows, many=True)
+    return DataGridJSONResponse(serializer.data, total)
+
+
+@token_required
+def activity_save(request):
+    id = request.GET.get('id')
+    data = json.loads(request.body)
+
+    try:
+        with transaction.atomic():
+            data['branch'] = request.user.branch_id
+            serializer = ActivitySerializer.factory(request.user, data, id)
+            serializer.validSave()
+        return JSONResponse(serializer.data)
+    except CustomError as e:
+        return JSONError(e.get_error_msg())
+    except Exception as e:
+        traceback.print_exc()
+        return JSONError(u'保存失败!')
+
+@token_required
+def activity_delete(request):
+    id = request.GET.get('id')
+
+    try:
+        with transaction.atomic():
+            order = Activity.objects.filter(id=id).first()
+            if order.check_status == settings.PASS:
+                raise CustomError(u'该活动已审核')
+
+            order.delete = True
+            order.save()
+            BizLog.objects.addnew(request.user, BizLog.INSERT, u"删除活动[%s],id=%s" % (order.title, order.id))
+        return JSONResponse({})
+    except CustomError as e:
+        return JSONError(e.get_error_msg())
+    except Exception as e:
+        traceback.print_exc()
+        return JSONError(u'保存失败!')
+
+
+@token_required
+def activity_check(request):
+    id = request.GET.get('id')
+    status = request.GET.get('status')
+
+    try:
+        with transaction.atomic():
+            order = Activity.objects.filter(id=id).first()
+            if order.delete:
+                raise CustomError(u'该活动已删除')
+
+            if order.check_status == int(status):
+                raise CustomError(u'该活动已当前状态不允许执行此操作')
+
+            if int(status) == settings.PASS:
+                order.check_status = settings.PASS
+                order.save()
+                BizLog.objects.addnew(request.user, BizLog.INSERT, u"审核活动[%s],id=%s" % (order.title, order.id))
+            else:
+                order.check_status = settings.DEFAULT
+                order.save()
+                BizLog.objects.addnew(request.user, BizLog.INSERT, u"活动撤销审核[%s],id=%s" % (order.title, order.id))
+
+        return JSONResponse({})
+    except CustomError as e:
+        return JSONError(e.get_error_msg())
+    except Exception as e:
+        traceback.print_exc()
+        return JSONError(u'保存失败!')
+
+
+@token_required
+def activity_signs_save(request):
+    id = request.GET.get('id')
+    signs = request.POST.get('signs')
+
+    try:
+        with transaction.atomic():
+            signs = json.loads(signs)
+            order = Activity.objects.filter(id=id).first()
+            if order.delete:
+                raise CustomError(u'该活动已删除')
+
+            save_sign = ''
+            for sign in signs:
+                save_sign += sign + ','
+            order.required_signs = save_sign
+            order.save()
+
+            BizLog.objects.addnew(request.user, BizLog.INSERT, u"活动设置必填项[%s],id=%s" % (order.title, order.id),signs )
+        return JSONResponse({})
+    except CustomError as e:
+        return JSONError(e.get_error_msg())
+    except Exception as e:
+        traceback.print_exc()
+        return JSONError(u'保存失败!')
+
+@token_required
+def activity_coupon_save(request):
+    id = request.GET.get('id')
+    coupon_ids = request.POST.get('coupons')
+
+    try:
+        with transaction.atomic():
+            coupons = json.loads(coupon_ids)
+            order = Activity.objects.filter(id=id).first()
+            if order.delete:
+                raise CustomError(u'该活动已删除')
+
+            ActivityCoupon.objects.filter(activity=order).delete()
+            for coupon in coupons:
+                ActivityCoupon.objects.create(
+                    activity=order,
+                    coupon_id=coupon
+                )
+
+            BizLog.objects.addnew(request.user, BizLog.INSERT, u"活动添加优惠券[%s],id=%s" % (order.title, order.id),coupon_ids )
+        return JSONResponse({})
+    except CustomError as e:
+        return JSONError(e.get_error_msg())
+    except Exception as e:
+        traceback.print_exc()
+        return JSONError(u'保存失败!')

+ 2 - 1
carwin_activity/settings.py

@@ -14,7 +14,7 @@ https://docs.djangoproject.com/en/1.9/ref/settings/
 import os
 
 # 软件版本
-VERSION = '1.2.0'
+VERSION = '1.0.0'
 
 # Build paths inside the project like this: os.path.join(BASE_DIR, ...)
 BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
@@ -34,6 +34,7 @@ DEBUG = True
 ALLOWED_HOSTS = ['*']
 
 TAXRATIO = 16
+DATA_UPLOAD_MAX_MEMORY_SIZE = 10485760 #10M
 
 
 # Application definition

+ 96 - 0
uis/views/activity/coupons.html

@@ -0,0 +1,96 @@
+<!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>
+        #group_selecter dl{max-height: 200px;}
+    </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 class="layui-col-lg6">
+                  <label class="layui-form-label">优惠券:</label>
+                  <div class="layui-input-block" id="group_selecter">
+                    <select name="groups" xm-select="selectGroup">
+
+                    </select>
+                  </div>
+                </div>
+                <button id="id_save" class="layui-btn" lay-submit lay-filter="component-form-element" style="display: none">保存</button>
+              </div>
+            </form>
+          </div>
+        </div>
+      </div>
+
+  <script src="../../layuiadmin/layui/layui.js"></script>
+  <script>
+
+  layui.config({
+    base: '../../../layuiadmin/' //静态资源所在路径
+  }).extend({
+    index: 'lib/index',
+    formSelects: 'formSelects-v4'
+  }).use(['index', 'form', 'utils', 'formSelects'], function(){
+    var $ = layui.$
+    ,admin = layui.admin
+    ,formSelects = layui.formSelects
+    ,form = layui.form;
+    var id = layui.view.getParameterByName('id');
+
+     formSelects.config('selectGroup', {
+      beforeSuccess:function(eid, url, searchVal, result){
+          if(id){
+              var coupons = layui.view.getParameterByName('coupons');
+              for(var n in result.data){
+                  var item = result.data[n];
+                  if(coupons.indexOf(parseInt(item.value)) > -1)
+                      item.selected = 'selected';
+              }
+          }
+
+          return result;
+      }
+    });
+
+    formSelects.data('selectGroup', 'server', {
+        url: '/activity/coupon/dict/'
+    });
+
+
+    form.on('submit(component-form-element)', function(data){
+      //layer.msg(JSON.stringify(data.field));
+      var groups = formSelects.value('selectGroup', 'val');
+      admin.req({
+        url: '/activity/activity/coupon_save/?id='+id
+        ,data: {'coupons': JSON.stringify(groups)}
+        ,type: 'post'
+        ,done: function(res){
+            parent.layer.closeAll('iframe');
+            parent.layui.table.reload('datagrid',{});
+        }
+      });
+
+      return false;
+    });
+
+    parent.layui.submitChild = function () {
+      $("#id_save").click();
+    };
+  });
+  </script>
+</body>
+</html>

+ 134 - 0
uis/views/activity/details.html

@@ -0,0 +1,134 @@
+<!DOCTYPE html>
+<html lang="en">
+<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">
+</head>
+<body>
+    <div class="layui-fluid">
+        <div class="layui-card">
+            <div class="layui-card-body" pad15>
+               <div class="layui-tab layui-tab-card">
+                   <ul class="layui-tab-title">
+                       <li class="layui-this">活动信息</li>
+                       <li>购买记录</li>
+                       <li>优惠券</li>
+                   </ul>
+                   <div class="layui-tab-content">
+                       <div class="layui-tab-item layui-show">
+                           <table class="layui-table">
+                               <tr>
+                                   <th style="width: 100px;">标题</th>
+                                   <td id="title" class="cell"></td>
+                               </tr>
+                               <tr>
+                                   <th style="width: 100px;">门店名称</th>
+                                   <td id="branch_name" class="cell"></td>
+                               </tr>
+                               <tr>
+                                   <th style="width: 100px;">门店电话</th>
+                                   <td id="branch_tel" class="cell"></td>
+                               </tr>
+
+                              <tr>
+                                   <th style="width: 100px;">费用</th>
+                                   <td id="amount" class="cell"></td>
+                               </tr>
+                               <tr>
+                                   <th style="width: 100px;">返利</th>
+                                   <td id="rebate" class="cell"></td>
+                               </tr>
+                               <tr>
+                                   <th style="width: 100px;">介绍</th>
+                                   <td id="describe" class="cell"></td>
+                               </tr>
+                                <tr>
+                                   <th style="width: 100px;">截止日期</th>
+                                   <td id="end_date" class="cell"></td>
+                               </tr>
+                                <tr>
+                                   <th style="width: 100px;">状态</th>
+                                   <td id="check_status_text" class="cell"></td>
+                               </tr>
+                               <tr>
+                                   <th style="width: 100px;">门店地址</th>
+                                   <td id="branch_address" class="cell"></td>
+                               </tr>
+                               <tr>
+                                   <th style="width: 100px;">添加时间</th>
+                                   <td id="create_time" class="cell"></td>
+                               </tr>
+                           </table>
+                       </div>
+                       <div class="layui-tab-item">
+                           <table class="layui-hide" id="datagrid" style="margin-top: 10px;"></table>
+                       </div>
+                       <div class="layui-tab-item">
+                           <table class="layui-hide" id="coupon_datagrid" style="margin-top: 10px;"></table>
+                       </div>
+                   </div>
+               </div>
+            </div>
+        </div>
+    </div>
+
+    <script src="../../layuiadmin/layui/layui.js?t=1"></script>
+    <script>
+        layui.config({
+            base: '../../../layuiadmin/' //静态资源所在路径
+        }).extend({
+            index: 'lib/index' //主入口模块
+        }).use(['index', 'table','laydate', 'utils'], function () {
+            var $ = layui.$;
+            var table = layui.table;
+            var admin = layui.admin;
+            var options = null;
+
+            var id = layui.view.getParameterByName('id');
+            var editdata = JSON.parse(JSON.stringify(parent.layui.table.editdata));
+            $('.cell').each(function (index, element) {
+                if (editdata[element.id]){
+                    element.innerHTML =  (editdata[element.id]);
+                }
+            });
+
+            table.render({
+              elem: '#datagrid'
+              ,url: '/activity/order/data/'
+              ,cols: [[
+                {field:'member_name', title:'会员名称',width: 120}
+                ,{field:'member_tel', title:'会员电话',width: 120}
+                ,{field:'name', title:'姓名', width:100}
+                ,{field:'model', title:'车型', width:200}
+                ,{field:'tel', title:'电话', width:120}
+                ,{field:'number', title:'车牌号', width:110}
+                ,{field:'status_text', title:'状态', width:90}
+                ,{field:'create_time', title:'创建时间', width:180}
+              ]]
+              ,where: {'activity': id, 'delete': 0}
+              ,height: 'full-108'
+            });
+
+            table.render({
+              elem: '#coupon_datagrid'
+              ,url: '/activity/coupon/data/'
+              ,cols: [[
+                {field:'name', title:'名称', width:200}
+                ,{field:'end_date', title:'截止日期',width: 150}
+                ,{field:'end_days', title:'截止天数',width: 100}
+                ,{field:'create_time', title:'添加时间', width:300}
+                ,{field:'enabled_text', title:'在用', width:90}
+              ]]
+              ,where: {'activity': id}
+              ,height: 'full-108'
+            });
+
+        })
+    </script>
+</body>
+</html>

+ 159 - 0
uis/views/activity/edit.html

@@ -0,0 +1,159 @@
+<!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"/>
+  <link rel="stylesheet" type="text/css" href="../../layuiadmin/layui/ueditor/themes/default/css/umeditor.css"/>
+    <script type="text/javascript" src="../../layuiadmin/layui/ueditor/third-party/jquery.min.js"></script>
+    <script type="text/javascript" charset="utf-8" src="../../layuiadmin/layui/ueditor/umeditor.config.js"></script>
+    <script type="text/javascript" charset="utf-8" src="../../layuiadmin/layui/ueditor/umeditor.js"></script>
+    <script type="text/javascript" src="../../layuiadmin/layui/ueditor/lang/zh-cn/zh-cn.js"></script>
+</head>
+<body>
+
+  <div class="layui-fluid">
+    <div class="layui-row layui-col-space15">
+        <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 class="layui-form-label"><font color='red' size="4">*</font>门店名称:</label>
+                  <div class="layui-input-block">
+                    <input type="text" id="id_branch_name" name="branch_name" lay-verify="required" placeholder="请输入门店名称" autocomplete="off" class="layui-input">
+                  </div>
+                </div>
+
+                <div>
+                  <label class="layui-form-label"><font color='red' size="4">*</font>门店电话:</label>
+                  <div class="layui-input-block">
+                    <input type="text" id="id_branch_tel" name="branch_tel" lay-verify="required" placeholder="请输入门店电话" autocomplete="off" class="layui-input">
+                  </div>
+                </div>
+
+                <div>
+                  <label class="layui-form-label"><font color='red' size="4">*</font>活动标题:</label>
+                  <div class="layui-input-block">
+                    <input type="text" name="title" lay-verify="required" placeholder="请输入标题" autocomplete="off" class="layui-input">
+                  </div>
+                </div>
+
+                <div>
+                  <label class="layui-form-label"><font color='red' size="4">*</font>活动价格:</label>
+                  <div class="layui-input-block">
+                    <input type="text" name="amount" lay-verify="required|numberGtZ" placeholder="请输入价格" autocomplete="off" class="layui-input">
+                  </div>
+                </div>
+
+                <div>
+                  <label class="layui-form-label"><font color='red' size="4">*</font>活动返利:</label>
+                  <div class="layui-input-block">
+                    <input type="text" name="rebate" lay-verify="required|numberGtZ" placeholder="请输入返利" autocomplete="off" class="layui-input">
+                  </div>
+                </div>
+
+                <div>
+                  <label class="layui-form-label"><font color='red' size="4">*</font>截止时间:</label>
+                  <div class="layui-input-block">
+                   <input id="date" type="text" name="end_date" placeholder="请输入报名截止时间" autocomplete="off" class="layui-input" lay-verify="required">
+                  </div>
+                </div>
+
+                <div style="margin-top: 20px;">
+                  <label class="layui-form-label"><font color='red' size="4">*</font>活动介绍:</label>
+                  <div class="layui-input-block">
+                    <script type="text/plain" id="myEditor"></script>
+                  </div>
+                </div>
+
+                <div>
+                  <label class="layui-form-label">门店地址:</label>
+                  <div class="layui-input-block">
+                    <input type="text" id="id_branch_address" name="branch_address" placeholder="请输入门店地址" autocomplete="off" class="layui-input">
+                  </div>
+                </div>
+
+                <div class="layui-col-xs12 layui-col-sm6">
+                  <label class="layui-form-label">是否在用:</label>
+                  <div class="layui-input-block">
+                    <input type="checkbox" name="enabled" lay-skin="switch" lay-text="是|否" checked="" value="1">
+                  </div>
+                </div>
+
+                <button class="layui-btn" id="id_save" lay-submit lay-filter="component-form-element" style="display: none">保存</button>
+              </div>
+            </form>
+          </div>
+        </div>
+      </div>
+    </div>
+  <script src="../../layuiadmin/layui/layui.js"></script>
+  <script>
+  layui.config({
+    base: '../../../layuiadmin/' //静态资源所在路径
+  }).extend({
+    index: 'lib/index',
+    formSelects: 'formSelects-v4'
+  }).use(['index', 'form', 'utils', 'upload', 'laydate'], function(){
+    var $ = layui.$
+    ,admin = layui.admin
+    ,upload = layui.upload
+    ,laydate = layui.laydate
+    ,form = layui.form;
+    var id = layui.view.getParameterByName('id');
+
+    var um = UM.getEditor('myEditor');
+    um.setWidth('100%');
+    $(".edui-body-container").css("width", "98%");
+
+    laydate.render({
+        elem: '#date'
+        ,type: 'date'
+        ,trigger: 'click'
+    });
+    if(id){
+        var editdata = JSON.parse(JSON.stringify(parent.layui.table.editdata)); // 框架有Bug所以这么转换
+        form.val("component-form-element", editdata);
+        um.setContent(editdata.describe);
+    }else{
+        admin.req({
+            url: '/activity/self_branch/'
+            , done: function (res) {
+                $('#id_branch_name').val(res.data.data.name);
+                $('#id_branch_tel').val(res.data.data.tel);
+                $('#id_branch_address').val(res.data.data.address);
+            }
+        });
+    }
+
+    form.render(null, 'component-form-element');
+    form.on('submit(component-form-element)', function(data){
+        var describe = UM.getEditor('myEditor').getContent();
+        data.field['describe'] = describe;
+
+        admin.req({
+            url: '/activity/activity/save/?id='+id
+            ,data: JSON.stringify(data.field)
+            ,type: 'post'
+            ,done: function(res){
+                parent.layui.onSubmitChild(res.data);
+            }
+          });
+      return false;
+    });
+
+    parent.layui.submitChild = function () {
+      $("#id_save").click();
+    };
+  });
+  </script>
+</body>
+</html>

+ 362 - 0
uis/views/activity/index.html

@@ -0,0 +1,362 @@
+<!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">
+</head>
+<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;}
+  </style>
+<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;">
+              <button class="layui-btn layui-btn-sm"  id="btn_add"><i class="layui-icon layui-icon-add-circle"></i>添加</button>
+              <button class="layui-btn layui-btn-sm"  id="btn_del"><i class="layui-icon layui-icon-delete"></i>删除</button>
+                <button class="layui-nav" id="show_check">
+                <div class="layui-nav-item">
+                  <a href="javascript:;" style="color:#fff;">审核</a>
+                  <dl class="layui-nav-child"> <!-- 二级菜单 -->
+                    <dd><a href="#" id="btn_check">审核</a></dd>
+                    <dd><a href="#" id="btn_revoke_check">撤销审核</a></dd>
+                  </dl>
+                </div>
+              </button>
+              <button class="layui-btn layui-btn-sm"  id="btn_coupon"><i class="layui-icon layui-icon-ok-circle"></i>添加优惠券</button>
+              <button class="layui-btn layui-btn-sm"  id="btn_set"><i class="layui-icon layui-icon-ok-circle"></i>购买设置</button>
+              <button class="layui-btn layui-btn-sm" id="btn_query"><i class="layui-icon layui-icon-search"></i>查询</button>
+            </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="view">查看</a>
+                  <a class="layui-btn layui-btn-xs"  lay-event="edit">修改</a>
+                  <a class="layui-btn layui-btn-xs"  lay-event="code">二维码</a>
+                </div>
+            </script>
+          </div>
+        </div>
+        </div>
+    </div>
+  </div>
+
+  <div id="dlg_query" style="display: none">
+    <div class="layui-card-body" pad15>
+        <form class="layui-form" lay-filter="query-form-element">
+          <div class="layui-row layui-col-space10 layui-form-item">
+              <div class="layui-col-xs12 layui-col-sm12">
+                <label class="layui-form-label">标题:</label>
+                <div class="layui-input-block">
+                    <input type="text" name="title" autocomplete="off" class="layui-input">
+                </div>
+            </div>
+
+              <div class="layui-col-xs12 layui-col-sm12">
+                <label class="layui-form-label">门店名称:</label>
+                <div class="layui-input-block">
+                    <input type="text" name="branch_name" autocomplete="off" class="layui-input">
+                </div>
+            </div>
+
+              <div class="layui-col-xs12 layui-col-sm12">
+                <label class="layui-form-label">状态:</label>
+                <div class="layui-input-block">
+                    <select name="check_status">
+                        <option value="">全部</option>
+                        <option value="0" selected>未审核</option>
+                        <option value="1">已审核</option>
+                    </select>
+                </div>
+            </div>
+
+            <div class="layui-col-xs12 layui-col-sm12">
+                <label class="layui-form-label">是否在用:</label>
+                <div class="layui-input-block">
+                    <select name="enabled">
+                        <option value="">全部</option>
+                        <option value="1" selected>是</option>
+                        <option value="0">否</option>
+                    </select>
+                </div>
+            </div>
+
+          </div>
+          <div class="layui-form-item" style="display: none">
+                <button id="query_search" class="layui-btn" lay-submit lay-filter="query-form-element">查询</button>
+          </div>
+        </form>
+    </div>
+   </div>
+
+  <script src="../../layuiadmin/layui/layui.js?t=1"></script>
+  <script>
+  var _params = '';
+  layui.config({
+    base: '../../../layuiadmin/' //静态资源所在路径
+  }).extend({
+    index: 'lib/index' //主入口模块
+  }).use(['index', 'table', 'utils'], function(){
+    var $ = layui.$
+    ,form = layui.form
+    ,utils = layui.utils;
+    var table = layui.table;
+
+    var superuser = layui.data(layui.setter.tableName)['superuser'];
+      if(!superuser){
+          $('#show_check').remove();
+      }
+
+    table.render({
+      elem: '#datagrid'
+      ,url: '/activity/activity/data/'
+      ,cols: [[
+          {type: 'radio', width: 50}
+        ,{field:'title', title:'标题', width:200}
+        ,{field:'end_date', title:'截止日期',width: 200}
+        ,{field:'amount', title:'费用',width: 100}
+        ,{field:'rebate', title:'返利',width: 100}
+        ,{field:'check_status_text', title:'状态',width: 100}
+        ,{field:'branch_name', title:'门店名称',width: 100}
+        ,{field:'branch_tel', title:'门店电话',width: 100}
+        ,{field:'branch_address', title:'门店地址',width: 100}
+        ,{field:'create_time', title:'添加时间', width:300}
+        ,{field:'enabled_text', title:'在用', width:90}
+        ,{width:150, align:'left', fixed: 'right', toolbar: '#datagrid-operate-bar'}
+      ]]
+      ,where: {'enabled': 1}
+      ,page: true
+      ,height: 'full-104'
+      ,done: function () {
+        layui.index.removeNoPermButtons();
+      }
+    });
+
+    //监听工具条
+    table.on('tool(datagrid-operate)', function(obj){
+      var data = obj.data;
+      table.editdata = data;
+        if(obj.event === 'edit'){
+        if (data.check_status == 1) {
+            layer.msg('该活动已审核');
+            return false;
+        }
+        layer.open({
+          type: 2,
+          title: '修改',
+          shadeClose: false,
+          area: ['70%', '90%'],
+          btn: ['保存', '取消'],
+          yes: function(index, dom){
+             layui.onSubmitChild = function (data) {
+              layer.close(index);
+              table.reload('datagrid',{});
+            };
+            layui.submitChild();
+          },
+          btn2: function(index, layero){
+            layer.close(index);//关闭当前按钮
+          },
+          content: 'edit.html?id='+data.id
+        });
+      }else if(obj.event === 'view'){
+        layer.open({
+          type: 2,
+          title: '查看',
+          shadeClose: true,
+          area: ['70%', '90%'],
+          content: 'details.html?id='+data.id
+        });
+      }
+    });
+
+    $('#btn_add').on('click', function(){
+        layer.open({
+          type: 2,
+          title: '添加',
+          shadeClose: false,
+          area: ['70%', '90%'],
+          btn: ['保存', '取消'],
+          yes: function(index, dom){
+             layui.onSubmitChild = function (data) {
+              layer.close(index);
+              table.reload('datagrid',{});
+            };
+            layui.submitChild();
+          },
+          btn2: function(index, layero){
+            layer.close(index);//关闭当前按钮
+          },
+          content: 'edit.html'
+        });
+    });
+
+    $('#btn_query').on('click', function(){
+        layer.open({
+          type: 1,
+          shadeClose: true,
+          area: ['500px', '400px'],
+          title: '查询',
+          btn: ['查询'],
+          yes: function(index, dom){
+             $('#query_search').click();
+          },
+          content: $('#dlg_query')
+        });
+    });
+
+    //删除
+    $('#btn_del').on('click', function(){
+        var data = utils.getSelectedRow('datagrid');
+         if(data == false){
+             return false;
+         }
+
+         if (data.check_status == 1) {
+              layer.msg('该活动已审核');
+                return false;
+         }
+
+         layer.confirm('确定要删除吗?', function (index) {
+            layer.close(index);
+            layui.admin.req({
+                url: '/activity/activity/delete/?id=' + data.id
+                , done: function (res) {
+                    table.reload('datagrid', {});
+                }
+            });
+        });
+    });
+
+    //审核
+    $('#btn_check').on('click', function(){
+        var data = utils.getSelectedRow('datagrid');
+         if(data == false){
+             return false;
+         }
+
+         if (data.check_status == 1) {
+              layer.msg('该活动已审核');
+                return false;
+         }
+
+         layer.confirm('确定要审核吗?', function (index) {
+            layer.close(index);
+            layui.admin.req({
+                url: '/activity/activity/check/?id=' + data.id + '&status=1'
+                , done: function (res) {
+                    table.reload('datagrid', {});
+                }
+            });
+        });
+    });
+
+    //撤销审核
+    $('#btn_revoke_check').on('click', function(){
+        var data = utils.getSelectedRow('datagrid');
+         if(data == false){
+             return false;
+         }
+
+         if (data.check_status == 0) {
+              layer.msg('该活动尚未审核');
+                return false;
+         }
+
+         layer.confirm('确定要撤销审核吗?', function (index) {
+            layer.close(index);
+            layui.admin.req({
+                url: '/activity/activity/check/?id=' + data.id + '&status=0'
+                , done: function (res) {
+                    table.reload('datagrid', {});
+                }
+            });
+        });
+    });
+
+     //必填项设置
+    $('#btn_set').on('click', function(){
+        var data = utils.getSelectedRow('datagrid');
+         if(data == false){
+             return false;
+         }
+
+         layer.open({
+          type: 2,
+          title: '购买必填设置',
+          shadeClose: true,
+          area: ['70%', '90%'],
+          btn: ['保存', '取消'],
+          yes: function (index, dom) {
+            layui.onSubmitChild = function (data) {
+                layer.close(index);
+                table.reload('datagrid', {});
+              };
+              layui.submitChild();
+          },
+          btn2: function(index, layero){
+            layer.close(index);//关闭当前按钮
+          },
+          content: 'sale_set.html?id='+data.id + '&required_signs=' + data.required_signs
+        });
+    });
+
+     //优惠券设置
+    $('#btn_coupon').on('click', function(){
+        var data = utils.getSelectedRow('datagrid');
+         if(data == false){
+             return false;
+         }
+
+         layer.open({
+          type: 2,
+          title: '添加优惠券',
+          shadeClose: true,
+          area: ['70%', '90%'],
+          btn: ['保存', '取消'],
+          yes: function (index, dom) {
+            layui.onSubmitChild = function (data) {
+                layer.close(index);
+                table.reload('datagrid', {});
+              };
+              layui.submitChild();
+          },
+          btn2: function(index, layero){
+            layer.close(index);//关闭当前按钮
+          },
+          content: 'coupons.html?id='+data.id + '&coupons=' + data.coupons
+        });
+    });
+
+    form.on('submit(query-form-element)', function(data){
+      //layer.msg(JSON.stringify(data.field));
+      _params = data.field;
+      table.reload('datagrid', {
+          where: data.field,
+          page:{curr:1}
+      });
+      layer.closeAll();
+      return false;
+    });
+
+  });
+  </script>
+</body>
+</html>
+

+ 93 - 0
uis/views/activity/sale_set.html

@@ -0,0 +1,93 @@
+<!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>
+        #group_selecter dl{max-height: 200px;}
+    </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 class="layui-col-lg6">
+                  <label class="layui-form-label">购买必填:</label>
+                  <div class="layui-input-block" id="group_selecter">
+                    <select name="groups" xm-select="selectGroup">
+
+                    </select>
+                  </div>
+                </div>
+                <button id="id_save" class="layui-btn" lay-submit lay-filter="component-form-element" style="display: none">保存</button>
+              </div>
+            </form>
+          </div>
+        </div>
+      </div>
+
+  <script src="../../layuiadmin/layui/layui.js"></script>
+  <script>
+
+  layui.config({
+    base: '../../../layuiadmin/' //静态资源所在路径
+  }).extend({
+    index: 'lib/index',
+    formSelects: 'formSelects-v4'
+  }).use(['index', 'form', 'utils', 'formSelects'], function(){
+    var $ = layui.$
+    ,admin = layui.admin
+    ,formSelects = layui.formSelects
+    ,form = layui.form;
+    var id = layui.view.getParameterByName('id');
+    var required_signs = layui.view.getParameterByName('required_signs');
+    var signs = [];
+    if (required_signs){
+        signs = required_signs.split(',');
+    }
+
+    var group_data = [{value: '姓名', name:'姓名'}, {value: '车牌号', name:'车牌号'},  {value: '车型', name:'车型'}];
+     for(var n in group_data){
+          var item = group_data[n];
+          if(signs.indexOf(item.value) > -1){
+              item['selected'] = 'selected';
+          }
+     }
+
+     formSelects.data('selectGroup', 'local', {
+        arr: group_data
+    });
+
+    form.on('submit(component-form-element)', function(data){
+      //layer.msg(JSON.stringify(data.field));
+      var groups = formSelects.value('selectGroup', 'val');
+      admin.req({
+        url: '/activity/activity/signs_save/?id='+id
+        ,data: {'signs': JSON.stringify(groups)}
+        ,type: 'post'
+        ,done: function(res){
+            parent.layer.closeAll('iframe');
+            parent.layui.table.reload('datagrid',{});
+        }
+      });
+
+      return false;
+    });
+
+    parent.layui.submitChild = function () {
+      $("#id_save").click();
+    };
+  });
+  </script>
+</body>
+</html>

+ 11 - 2
uis/views/index.html

@@ -67,16 +67,21 @@
                 <cite>活动管理</cite>
               </a>
               <dl class="layui-nav-child">
+                <dd data-name="nav">
+                  <a lay-href="activity/index.html">活动管理</a>
+                </dd>
+              </dl>
+              <dl class="layui-nav-child" id="manage_coupon">
                 <dd data-name="nav">
                   <a lay-href="coupon/index.html">优惠券管理</a>
                 </dd>
               </dl>
-              <dl class="layui-nav-child">
+              <dl class="layui-nav-child" id="manage_member">
                 <dd data-name="nav">
                   <a lay-href="member/index.html">会员管理</a>
                 </dd>
               </dl>
-              <dl class="layui-nav-child">
+              <dl class="layui-nav-child" id="manage_order">
                 <dd data-name="nav">
                   <a lay-href="order/index.html">订单管理</a>
                 </dd>
@@ -151,6 +156,10 @@
       var superuser = layui.data(layui.setter.tableName)['superuser'];
       if(!superuser){
           $('#manage_employee').remove()
+      }else{
+           $('#manage_coupon').remove();
+           $('#manage_member').remove();
+           $('#manage_order').remove();
       }
       /**$('#LAY-system-side-muen .layui-nav-child dd').each(function () {
           var perm = $(this).data("permission");

+ 1 - 0
uis/views/order/index.html

@@ -91,6 +91,7 @@
         ,{field:'member_tel', title:'会员电话',width: 120}
         ,{field:'amount', title:'费用', width:120}
         ,{field:'model', title:'车型', width:200}
+        ,{field:'name', title:'姓名', width:100}
         ,{field:'tel', title:'电话', width:120}
         ,{field:'number', title:'车牌号', width:110}
         ,{field:'status_text', title:'状态', width:90}