lyh %!s(int64=2) %!d(string=hai) anos
pai
achega
2b113f5e90

+ 22 - 2
apps/activity/filters.py

@@ -83,7 +83,6 @@ 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:
@@ -111,4 +110,25 @@ class ActivityFilter(django_filters.FilterSet):
 
     def __init__(self, data=None, *args, **kwargs):
         data = clean_datetime_range(data, 'create_time')
-        super(ActivityFilter, self).__init__(data, *args, **kwargs)
+        super(ActivityFilter, self).__init__(data, *args, **kwargs)
+
+class ActivityDetailsFilter(django_filters.FilterSet):
+    name = django_filters.CharFilter(field_name='name', lookup_expr='icontains')
+    main = django_filters.CharFilter(field_name='main')
+
+    class Meta:
+        model = ActivityDetails
+        fields = (
+            'name', 'main'
+        )
+
+class ActivityCouponFilter(django_filters.FilterSet):
+    name = django_filters.CharFilter(field_name='main__name', lookup_expr='icontains')
+    order = django_filters.CharFilter(field_name='main__main')
+    main = django_filters.CharFilter(field_name='main')
+
+    class Meta:
+        model = ActivityCoupon
+        fields = (
+            'name', 'main', 'order'
+        )

+ 28 - 3
apps/activity/models.py

@@ -19,8 +19,8 @@ class Activity(models.Model):
     describe = models.TextField(verbose_name=u'活动介绍', null=True, blank=True)
     pic = models.CharField(max_length=500,verbose_name=u'活动图片', null=True, blank=True)
     end_date = models.DateField(verbose_name=u"截止日期")
-    amount = models.FloatField(verbose_name=u"费用", default=0)
-    rebate = models.FloatField(verbose_name=u"返利", default=0)
+    # amount = models.FloatField(verbose_name=u"费用", default=0)
+    # rebate = models.FloatField(verbose_name=u"返利", default=0)
     check_status = models.PositiveSmallIntegerField(choices=settings.CHECK_STATUS_CHOICES, verbose_name=u"审核", editable=False, default=settings.DEFAULT)
     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)
@@ -69,6 +69,30 @@ class Activity(models.Model):
             raise CustomError(u'未找到相应的活动')
         return instance
 
+class ActivityDetails(models.Model):
+    main = models.ForeignKey(Activity, verbose_name=u"活动", on_delete=models.PROTECT)
+    name = models.CharField(max_length=200, verbose_name=u"名称")
+    amount = models.FloatField(verbose_name=u"费用", default=0)
+    rebate = models.FloatField(verbose_name=u"返利", default=0)
+    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 = "activity_details"
+        ordering = ['-id']
+        verbose_name = u"活动明细"
+
+    @staticmethod
+    def getById1(id):
+        try:
+            id = int(id)
+        except:
+            raise CustomError(u'无效的活动明细Id')
+        instance = ActivityDetails.objects.filter(pk=id).first()
+        if not instance:
+            raise CustomError(u'未找到相应的活动明细')
+        return instance
+
 
 class SplitAccount(models.Model):
     WAIT = 1
@@ -551,7 +575,8 @@ class MemberCoupon(models.Model):
         return instance
 
 class ActivityCoupon(models.Model):
-    activity = models.ForeignKey(Activity, verbose_name=u"活动", on_delete=models.PROTECT)
+    #activity = models.ForeignKey(Activity, verbose_name=u"活动", on_delete=models.PROTECT)
+    main = models.ForeignKey(ActivityDetails, verbose_name=u"活动明细", on_delete=models.PROTECT)
     coupon = models.ForeignKey(Coupon, verbose_name=u"优惠券", on_delete=models.PROTECT)
 
     class Meta:

+ 51 - 2
apps/activity/serializers.py

@@ -207,7 +207,7 @@ class ActivitySerializer(serializers.ModelSerializer):
 
     def get_coupons(self, obj):
         data = []
-        rows = ActivityCoupon.objects.filter(activity=obj)
+        rows = ActivityCoupon.objects.filter(main__main=obj)
         data.extend([s.id for s in rows])
         return data
 
@@ -250,9 +250,58 @@ class ActivitySerializer(serializers.ModelSerializer):
         return instance
 
 
+class ActivityDetailsSerializer(serializers.ModelSerializer):
+
+    class Meta:
+        model = ActivityDetails
+        fields = '__all__'
+
+    @staticmethod
+    def factory(user, data):
+        if data['id']:
+            instance = ActivityDetails.getById1(data['id'])
+        else:
+            instance = None
+        serializer = ActivityDetailsSerializer(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 data['amount'] * 0.3 < data['rebate']:
+    #         raise CustomError(u'项目[%s]返利不得超过价格的30%' % data['name'])
+    #     return data
+
+    def create(self, validated_data):
+        instance = super(ActivityDetailsSerializer, self).create(validated_data)
+        instance.save()
+        return instance
+
+    def update(self, instance, validated_data):
+        instance = super(ActivityDetailsSerializer, 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',)
+        fields = ('value', 'name',)
+
+
+class ActivityCouponSerializer(serializers.ModelSerializer):
+    create_time = serializers.DateTimeField(source='coupon.create_time', format=base.DATETIME_FORMAT, read_only=True)
+    end_date = serializers.DateField(source='coupon.end_date', format=base.DATE_FORMAT, read_only=True)
+    end_days = serializers.CharField(source='coupon.end_days', read_only=True)
+    activity_name = serializers.CharField(source='main.name', read_only=True)
+    coupon_name = serializers.CharField(source='coupon.name', read_only=True)
+
+    class Meta:
+        model = ActivityCoupon
+        fields = '__all__'

+ 4 - 0
apps/activity/urls.py

@@ -20,8 +20,12 @@ urlpatterns = (
     url(r'^coupon/save/$', coupon_save),
     url(r'^coupon/dict/$', coupon_dict),
 
+    url(r'^activity/details/$', activity_details),
+    url(r'^activity/detail/data/$', activity_detail_list),
+    url(r'^activity/coupon/data/$', activity_coupon_list),
     url(r'^activity/data/$', activity_list),
     url(r'^activity/save/$', activity_save),
+    url(r'^activity/edit/$', activity_edit),
     url(r'^activity/delete/$', activity_delete),
     url(r'^activity/check/$', activity_check),
     url(r'^activity/signs_save/$', activity_signs_save),

+ 88 - 8
apps/activity/views.py

@@ -267,17 +267,97 @@ def activity_list(request):
     return DataGridJSONResponse(serializer.data, total)
 
 
+@token_required
+@login_required()
+def activity_details(request):
+    if request.user.is_superuser:
+        rows = ActivityDetails.objects.filter(delete=False)
+    else:
+        rows = ActivityDetails.objects.filter(main__branch_id=request.user.branch_id, delete=False)
+    f = ActivityDetailsFilter(request.GET, queryset=rows)
+    serializer = ActivityDetailsSerializer(f.qs, many=True)
+    return DataGridJSONResponse(serializer.data, len(serializer.data))
+
+
+@token_required
+@login_required()
+def activity_detail_list(request):
+    if request.user.is_superuser:
+        rows = ActivityDetails.objects.filter(delete=False)
+    else:
+        rows = ActivityDetails.objects.filter(main__branch_id=request.user.branch_id, delete=False)
+    f = ActivityDetailsFilter(request.GET, queryset=rows)
+    rows, total = utils.get_page_data(request, f.qs)
+    serializer = ActivityDetailsSerializer(rows, many=True)
+    return DataGridJSONResponse(serializer.data, total)
+
+
+@token_required
+@login_required()
+def activity_coupon_list(request):
+    if request.user.is_superuser:
+        rows = ActivityCoupon.objects.filter(coupon__enabled=True)
+    else:
+        rows = ActivityCoupon.objects.filter(coupon__branch_id=request.user.branch_id, coupon__enabled=True)
+    f = ActivityCouponFilter(request.GET, queryset=rows)
+    rows, total = utils.get_page_data(request, f.qs)
+    serializer = ActivityCouponSerializer(rows, many=True)
+    return DataGridJSONResponse(serializer.data, total)
+
+
 @token_required
 @login_required()
 def activity_save(request):
+    #id = request.GET.get('id')
+    items = json.loads(request.POST.get('items'))
+    production_data = json.loads(request.POST.get('production'))
+
+    try:
+        with transaction.atomic():
+            production_data['branch'] = request.user.branch_id
+            serializer = ActivitySerializer.factory(request.user, production_data)
+            order = serializer.validSave()
+
+            for item in items:
+                if float(item['amount']) * 0.3 < float(item['rebate']):
+                    raise CustomError(u"项目[%s]返利不得超过价格的30%" % item['name'])
+                item['main'] = order.id
+                production = ActivityDetailsSerializer.factory(request.user, data=item)
+                production.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
+@login_required()
+def activity_edit(request):
     id = request.GET.get('id')
-    data = json.loads(request.body)
+    items = json.loads(request.POST.get('items'))
+    production_data = json.loads(request.POST.get('production'))
 
     try:
         with transaction.atomic():
-            data['branch'] = request.user.branch_id
-            serializer = ActivitySerializer.factory(request.user, data, id)
-            serializer.validSave()
+            production_data['branch'] = request.user.branch_id
+            serializer = ActivitySerializer.factory(request.user, production_data, id)
+            order = serializer.validSave()
+
+            edit_ids = []
+            exist_rows = ActivityDetails.objects.filter(main_id=order.id, delete=False).values('id')
+            exist_ids = [exist_row['id'] for exist_row in exist_rows]
+            for item in items:
+                if float(item['amount']) * 0.3 < float(item['rebate']):
+                    raise CustomError(u"项目[%s]返利不得超过价格的30%" % item['name'])
+                if item['id']:
+                    edit_ids.append(item['id'])
+                item['main'] = order.id
+                production = ActivityDetailsSerializer.factory(request.user, data=item)
+                production.validSave()
+
+            ActivityDetails.objects.filter(Q(main_id=order.id, id__in=exist_ids), ~Q(id__in=edit_ids)).update(delete=True)
         return JSONResponse(serializer.data)
     except CustomError as e:
         return JSONError(e.get_error_msg())
@@ -375,18 +455,18 @@ def activity_coupon_save(request):
     try:
         with transaction.atomic():
             coupons = json.loads(coupon_ids)
-            order = Activity.objects.filter(id=id).first()
+            order = ActivityDetails.objects.filter(id=id).first()
             if order.delete:
                 raise CustomError(u'该活动已删除')
 
-            ActivityCoupon.objects.filter(activity=order).delete()
+            ActivityCoupon.objects.filter(main=order).delete()
             for coupon in coupons:
                 ActivityCoupon.objects.create(
-                    activity=order,
+                    main=order,
                     coupon_id=coupon
                 )
 
-            BizLog.objects.addnew(request.user, BizLog.INSERT, u"活动添加优惠券[%s],id=%s" % (order.title, order.id),coupon_ids )
+            BizLog.objects.addnew(request.user, BizLog.INSERT, u"活动添加优惠券[%s],项目[%s],id=%s" % (order.main.title, order.name, order.id),coupon_ids )
         return JSONResponse({})
     except CustomError as e:
         return JSONError(e.get_error_msg())

+ 1 - 1
run.bat

@@ -1 +1 @@
-venv\Scripts\python.exe manage.py runserver 0.0.0.0:8055
+venv\Scripts\python.exe manage.py runserver 0.0.0.0:8555

+ 233 - 0
uis/views/activity/add.html

@@ -0,0 +1,233 @@
+<!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>
+  <style type="text/css">
+        .table-overlay .layui-table-view,
+        .table-overlay .layui-table-header,
+        .table-overlay .layui-table-box,
+        .table-overlay .layui-table-body{overflow: visible;}
+        .table-overlay .layui-table-cell{height: auto; overflow: visible;}
+    </style>
+</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 id="date" type="text" name="end_date" placeholder="请输入报名截止时间" autocomplete="off" class="layui-input" lay-verify="required">
+                  </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>
+                  <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>
+
+                <div>
+                  <fieldset class="layui-elem-field layui-field-title">
+                    <legend>明细<button type="button" id="detills-btn-add" class="layui-btn layui-btn-primary layui-btn-sm"><i class="layui-icon"></i></button></legend>
+                  </fieldset>
+                  <div>
+                    <table id="details_table" lay-filter="details_table" class="layui-hide"></table>
+                  </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', 'table', 'laydate'], function(){
+    var $ = layui.$
+    ,admin = layui.admin
+    ,laydate = layui.laydate
+    ,table = layui.table
+    ,form = layui.form;
+
+    laydate.render({
+        elem: '#date'
+        ,type: 'date'
+        ,trigger: 'click'
+    });
+     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);
+          }
+      });
+
+
+    var details_table = "details_table";
+    var goods_tableIns = table.render({
+        elem: '#details_table',
+        id: details_table,
+        data: [],
+        page: false,
+        limit: 1000,
+        loading: true,
+        even: true, //不开启隔行背景
+        cols: [[
+            {title: '序号', type: 'numbers'},
+            {field: 'name', title: '名称', minWidth: 150, templet: function (d){
+                return '<input id="name'+ d.index +'" type="text" autocomplete="off" value="'+d.name+'" lay-verify="required" class="layui-input" autocomplete="off">';
+            }},
+            {field: 'amount', title: '价格', width: 100, templet: function (d){
+                return '<input id="amount'+d.index+'" type="text" value="'+d.amount+'" lay-verify="required|numberGtZ" autocomplete="off" class="layui-input">';
+            }},
+            {field: 'rebate', title: '返利', width: 100, templet: function (d){
+                return '<input id="rebate'+d.index+'" type="text" value="'+d.rebate+'" lay-verify="required|numberGtZ" autocomplete="off" class="layui-input">';
+            }},
+            {field: 'notes', title: '备注', minWidth: 150, templet: function (d){
+                return '<input id="notes'+ d.index +'" type="text" autocomplete="off" value="'+d.notes+'" class="layui-input" autocomplete="off">';
+            }},
+            {
+                field: 'index', title: '操作', minWidth:120,templet: function (d) {
+                    return '<a class="layui-btn layui-btn-xs layui-btn-danger" lay-event="del"><i class="layui-icon layui-icon-delete"></i>删除</a>';
+                }
+            }
+        ]]
+        ,done: function (res, curr, count) {
+        }
+    });
+
+    //监听工具条
+    table.on('tool(details_table)', function (obj) {
+        var data = obj.data;
+        var event = obj.event;
+
+        switch (event) {
+            case "del":
+                obj.del();
+                layer.msg('删除成功', {icon: 6});
+                break;
+        }
+    });
+
+    var getdetailsData = function () {
+        var rows = table.cache[details_table];
+        var data = [];
+        for (var n in rows) {
+            if (rows[n] == false) {
+                continue;
+            }
+
+            var notes = $('#notes'+n).val();
+            var name = $('#name'+n).val();
+            var amount = $('#amount'+n).val();
+            var rebate = $('#rebate'+n).val();
+
+            var item = {
+                id: '',
+                index: rows[n].index,
+                name: name,
+                amount: amount,
+                rebate: rebate,
+                notes:notes
+            };
+            data.push(item);
+        }
+        return data;
+    };
+
+    $('#detills-btn-add').on('click', function () {
+        var oldData = getdetailsData();
+        var index = oldData.length;
+        var newRow = {
+            id: '',
+            index: index,
+            name: '',
+            amount: '',
+            rebate: '',
+            notes: ''
+        };
+        oldData.push(newRow);
+
+        goods_tableIns.reload({
+            data: oldData
+        });
+    });
+
+    form.render(null, 'component-form-element');
+    form.on('submit(component-form-element)', function(data){
+        var items = getdetailsData();
+
+        admin.req({
+            url: '/activity/activity/save/?id='
+            ,data: {production: JSON.stringify(data.field), items: JSON.stringify(items)}
+            ,type: 'post'
+            ,done: function(res){
+                parent.layui.onSubmitChild(res.data);
+            }
+          });
+      return false;
+    });
+
+    parent.layui.submitChild = function () {
+      $("#id_save").click();
+    };
+  });
+  </script>
+</body>
+</html>

+ 53 - 14
uis/views/activity/details.html

@@ -19,6 +19,7 @@
                <div class="layui-tab layui-tab-card">
                    <ul class="layui-tab-title">
                        <li class="layui-this">活动信息</li>
+                       <li>明细</li>
                        <li>购买记录</li>
                        <li>优惠券</li>
                    </ul>
@@ -37,15 +38,6 @@
                                    <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>
@@ -70,12 +62,20 @@
                                </tr>
                            </table>
                        </div>
+                       <div class="layui-tab-item">
+                           <table class="layui-hide" id="details_datagrid" style="margin-top: 10px;" lay-filter="datagrid-operate"></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>
+                       <script type="text/html" id="datagrid-operate-bar">
+                            <div class="layui-btn-group">
+                              <a class="layui-btn layui-btn-xs" lay-event="coupon">添加优惠券</a>
+                            </div>
+                        </script>
                    </div>
                </div>
             </div>
@@ -105,6 +105,21 @@
                 }
             });
 
+            table.render({
+              elem: '#details_datagrid'
+              ,url: '/activity/activity/detail/data/'
+              ,cols: [[
+                {field:'name', title:'名称',width: 120}
+                ,{field:'amount', title:'价格',width: 120}
+                ,{field:'rebate', title:'返利', width:100}
+                ,{field:'notes', title:'备注', width:200}
+                ,{width:100, align:'center', fixed: 'right', toolbar: '#datagrid-operate-bar'}
+              ]]
+              ,page: true
+              ,where: {'main': id, 'delete': 0}
+              ,height: 'full-108'
+            });
+
             table.render({
               elem: '#datagrid'
               ,url: '/activity/order/data/'
@@ -125,19 +140,43 @@
 
             table.render({
               elem: '#coupon_datagrid'
-              ,url: '/activity/coupon/data/'
+              ,url: '/activity/activity/coupon/data/'
               ,cols: [[
-                {field:'name', title:'名称', width:200}
+                {field:'activity_name', title:'活动项目', width:150}
+                ,{field:'coupon_name', title:'优惠券', width:150}
                 ,{field:'end_date', title:'截止日期',width: 150}
                 ,{field:'end_days', title:'截止天数',width: 100}
-                ,{field:'create_time', title:'添加时间', width:300}
-                ,{field:'enabled_text', title:'在用', width:90}
+                ,{field:'create_time', title:'添加时间', width:150}
               ]]
               ,page: true
-              ,where: {'activity': id}
+              ,where: {'order': id}
               ,height: 'full-108'
             });
 
+            table.on('tool(datagrid-operate)', function(obj){
+              var data = obj.data;
+                if(obj.event === 'coupon'){
+                    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
+                    });
+              }
+            });
+
         })
     </script>
 </body>

+ 134 - 53
uis/views/activity/edit.html

@@ -14,6 +14,13 @@
     <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>
+  <style type="text/css">
+        .table-overlay .layui-table-view,
+        .table-overlay .layui-table-header,
+        .table-overlay .layui-table-box,
+        .table-overlay .layui-table-body{overflow: visible;}
+        .table-overlay .layui-table-cell{height: auto; overflow: visible;}
+    </style>
 </head>
 <body>
 
@@ -46,20 +53,6 @@
                   </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">
@@ -67,13 +60,6 @@
                   </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">
@@ -81,13 +67,22 @@
                   </div>
                 </div>
 
-                <div class="layui-col-xs12 layui-col-sm6">
+                <div>
                   <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>
 
+                <div>
+                  <fieldset class="layui-elem-field layui-field-title">
+                    <legend>明细<button type="button" id="detills-btn-add" class="layui-btn layui-btn-primary layui-btn-sm"><i class="layui-icon"></i></button></legend>
+                  </fieldset>
+                  <div>
+                    <table id="details_table" lay-filter="details_table" class="layui-hide"></table>
+                  </div>
+                </div>
+
                 <button class="layui-btn" id="id_save" lay-submit lay-filter="component-form-element" style="display: none">保存</button>
               </div>
             </form>
@@ -102,55 +97,141 @@
   }).extend({
     index: 'lib/index',
     formSelects: 'formSelects-v4'
-  }).use(['index', 'form', 'utils', 'upload', 'laydate'], function(){
+  }).use(['index', 'form', 'utils', 'table', 'laydate'], function(){
     var $ = layui.$
     ,admin = layui.admin
-    ,upload = layui.upload
     ,laydate = layui.laydate
+    ,table = layui.table
     ,form = layui.form;
     var id = layui.view.getParameterByName('id');
 
-    // var um = UM.getEditor('myEditor', {
-    //     imageUrl: '/activity/ueditor/images/',
-    //     imagePath: "",
-    // });
-    // 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);
+    var editdata = JSON.parse(JSON.stringify(parent.layui.table.editdata)); // 框架有Bug所以这么转换
+    form.val("component-form-element", editdata);
+
+    admin.req({
+          url: '/activity/activity/details/?main=' + id,
+          done: function (res) {
+              var data = res.data;
+              var detailsData = table.cache[details_table];
+              for (var i in data) {
+                  var newRow = {
+                      index: i,
+                      id: data[i].id,
+                      name: data[i].name,
+                      amount: data[i].amount,
+                      rebate: data[i].rebate,
+                      notes: data[i].notes
+                  };
+                  detailsData.push(newRow);
+              }
+              goods_tableIns.reload({
+                  data: detailsData
+              });
+          }
+      });
+
+    var details_table = "details_table";
+    var goods_tableIns = table.render({
+        elem: '#details_table',
+        id: details_table,
+        data: [],
+        page: false,
+        limit: 1000,
+        loading: true,
+        even: true, //不开启隔行背景
+        cols: [[
+            {title: '序号', type: 'numbers'},
+            {field: 'name', title: '名称', minWidth: 150, templet: function (d){
+                return '<input id="name'+ d.index +'" type="text" autocomplete="off" value="'+d.name+'" lay-verify="required" class="layui-input" autocomplete="off">';
+            }},
+            {field: 'amount', title: '价格', width: 100, templet: function (d){
+                return '<input id="amount'+d.index+'" type="text" value="'+d.amount+'" lay-verify="required|numberGtZ" autocomplete="off" class="layui-input">';
+            }},
+            {field: 'rebate', title: '返利', width: 100, templet: function (d){
+                return '<input id="rebate'+d.index+'" type="text" value="'+d.rebate+'" lay-verify="required|numberGtZ" autocomplete="off" class="layui-input">';
+            }},
+            {field: 'notes', title: '备注', minWidth: 150, templet: function (d){
+                return '<input id="notes'+ d.index +'" type="text" autocomplete="off" value="'+d.notes+'" class="layui-input" autocomplete="off">';
+            }},
+            {
+                field: 'index', title: '操作', minWidth:120,templet: function (d) {
+                    return '<a class="layui-btn layui-btn-xs layui-btn-danger" lay-event="del"  ><i class="layui-icon layui-icon-delete"></i>删除</a>';
+                }
             }
+        ]]
+        ,done: function (res, curr, count) {
+        }
+    });
+
+    //监听工具条
+    table.on('tool(details_table)', function (obj) {
+        var data = obj.data;
+        var event = obj.event;
+
+        switch (event) {
+            case "del":
+                obj.del();
+                layer.msg('删除成功', {icon: 6});
+                break;
+        }
+    });
+
+    var getdetailsData = function () {
+        var rows = table.cache[details_table];
+        var data = [];
+        for (var n in rows) {
+            if (rows[n] == false) {
+                continue;
+            }
+
+            var notes = $('#notes'+n).val();
+            var name = $('#name'+n).val();
+            var amount = $('#amount'+n).val();
+            var rebate = $('#rebate'+n).val();
+
+            var item = {
+                id: rows[n].id,
+                index: rows[n].index,
+                name: name,
+                amount: amount,
+                rebate: rebate,
+                notes:notes
+            };
+            data.push(item);
+        }
+        return data;
+    };
+
+    $('#detills-btn-add').on('click', function () {
+        var oldData = getdetailsData();
+        var index = oldData.length;
+        var newRow = {
+            id: '',
+            index: index,
+            name: '',
+            amount: '',
+            rebate: '',
+            notes: ''
+        };
+        oldData.push(newRow);
+
+        goods_tableIns.reload({
+            data: oldData
         });
-    }
+    });
 
     form.render(null, 'component-form-element');
     form.on('submit(component-form-element)', function(data){
-        var amount = data.field['amount'];
-        var rebate = data.field['rebate'];
-        if (parseFloat(amount * 0.3) < parseFloat(rebate)) {
-            layer.msg('返利不得超过价格的30%');
-            return false;
-        }
-        // var describe = UM.getEditor('myEditor').getContent();
-        // data.field['describe'] = describe;
+        var items = getdetailsData();
 
         admin.req({
-            url: '/activity/activity/save/?id='+id
-            ,data: JSON.stringify(data.field)
+            url: '/activity/activity/edit/?id='+id
+            ,data: {production: JSON.stringify(data.field), items: JSON.stringify(items)}
             ,type: 'post'
             ,done: function(res){
                 parent.layui.onSubmitChild(res.data);

+ 39 - 34
uis/views/activity/index.html

@@ -27,6 +27,7 @@
 
             <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_edit"><i class="layui-icon layui-icon-edit"></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">
@@ -37,7 +38,6 @@
                   </dl>
                 </div>
               </button>
-              <button class="layui-btn layui-btn-sm"  id="btn_coupon"><i class="layui-icon layui-icon-add-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>
@@ -46,8 +46,7 @@
 
             <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="view">查看</a>
                   <a class="layui-btn layui-btn-xs"  lay-event="upload_poster">上传介绍</a>
                   <a class="layui-btn layui-btn-xs"  lay-event="code">二维码</a>
                 </div>
@@ -125,8 +124,8 @@
       }else {
           $('#btn_add').remove();
           $('#btn_set').remove();
-          $('#btn_coupon').remove();
           $('#btn_del').remove();
+          $('#btn_edit').remove();
       }
 
     table.render({
@@ -136,15 +135,13 @@
           {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:220, align:'center', fixed: 'right', toolbar: '#datagrid-operate-bar'}
+        ,{width:200, align:'center', fixed: 'right', toolbar: '#datagrid-operate-bar'}
       ]]
       ,where: {'enabled': 1}
       ,page: true
@@ -158,30 +155,7 @@
     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'){
+        if(obj.event === 'view'){
         layer.open({
           type: 2,
           title: '查看',
@@ -239,7 +213,7 @@
           btn2: function(index, layero){
             layer.close(index);//关闭当前按钮
           },
-          content: 'edit.html'
+          content: 'add.html'
         });
     });
 
@@ -280,6 +254,37 @@
         });
     });
 
+    $('#btn_edit').on('click', function(){
+        var data = utils.getSelectedRow('datagrid');
+        if (!data) {
+            layer.msg('请选择一条记录');
+            return false;
+        }
+        table.editdata = data;
+         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
+        });
+    });
+
     //审核
     $('#btn_check').on('click', function(){
         var data = utils.getSelectedRow('datagrid');
@@ -354,7 +359,7 @@
     });
 
      //优惠券设置
-    $('#btn_coupon').on('click', function(){
+    /**$('#btn_coupon').on('click', function(){
         var data = utils.getSelectedRow('datagrid');
          if(data == false){
              return false;
@@ -378,7 +383,7 @@
           },
           content: 'coupons.html?id='+data.id + '&coupons=' + data.coupons
         });
-    });
+    });**/
 
     form.on('submit(query-form-element)', function(data){
       //layer.msg(JSON.stringify(data.field));