lyh 3 yıl önce
ebeveyn
işleme
e87a1d54d1

+ 9 - 0
apps/WechatApplet/models.py

@@ -62,3 +62,12 @@ class WechatApplet(models.Model):
         page = 'pages/index/index'
         filename = WeChat.getActivityCode(self.getAccessToken(), page, customer_id, activity_id)
         return filename
+
+    def generateActivityWXappCode(self, activity_id):
+        filename = "{}_{}.png".format("activiytCode/", activity_id)
+        full_filename = "{}/{}".format(settings.MEDIA_ROOT, filename)
+        if os.path.exists(full_filename):
+            return filename
+        page = 'pages/index/index'
+        filename = WeChat.getActivityWXappCode(self.getAccessToken(), page, activity_id)
+        return filename

+ 4 - 0
apps/account/views.py

@@ -9,6 +9,7 @@ from django.db.models import F,ProtectedError
 from django.shortcuts import get_object_or_404
 from django.views.decorators.csrf import csrf_exempt
 from django.contrib.auth.models import Permission, Group
+from django.contrib.auth.decorators import login_required
 from django.utils import timezone
 from libs import utils
 from libs.utils import dump_form_errors
@@ -62,6 +63,7 @@ def login(request):
 
 
 @token_required
+@login_required()
 def employee_list(request):
     f = EmployeeFilter(request.GET, queryset=User.objects.filter(branch_id__isnull=False))
     rows, total = utils.get_page_data(request, f.qs)
@@ -70,6 +72,7 @@ def employee_list(request):
 
 
 @token_required
+@login_required()
 def employee_save(request):
     id = request.GET.get('id')
     data = json.loads(request.body)
@@ -94,6 +97,7 @@ def employee_save(request):
 
 
 @token_required
+@login_required()
 def password_save(request):
     data = json.loads(request.body)
     try:

+ 24 - 0
apps/activity/base.py

@@ -0,0 +1,24 @@
+#coding=utf-8
+
+import datetime
+import re
+
+import tablib
+
+from libs.utils import strfdate
+from libs import utils
+from django.db.models import Q, Sum
+from .models import *
+
+class OrderUpdate():
+    @staticmethod
+    def update_status():
+        now_date = timezone.now().date()
+        Order.objects.filter(
+            Q(status=Order.DEFAULT),
+            Q(
+                Q(activity__enabled=False)|
+                Q(activity__delete=True)|
+                Q(activity__end_date__lt=now_date)
+            )
+        ).update(status=Order.FAIL)

+ 1 - 0
apps/activity/models.py

@@ -25,6 +25,7 @@ class Activity(models.Model):
     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)
+    wxapp_img = models.CharField(verbose_name=u'活动二维码', max_length=250, null=True)
     enabled = models.BooleanField(verbose_name=u"在用", default=True)
     delete = models.BooleanField(verbose_name=u"删除", default=False)
 

+ 8 - 0
apps/activity/serializers.py

@@ -93,6 +93,7 @@ class OrderSerializer(serializers.ModelSerializer):
     branch_name = serializers.CharField(source='branch.name', read_only=True)
     status_text = serializers.CharField(source='get_status_display', read_only=True)
     delete_text = serializers.SerializerMethodField()
+    split_status_text = serializers.SerializerMethodField()
     create_time = serializers.DateTimeField(format='%Y-%m-%d %H:%M', read_only=True)
 
     class Meta:
@@ -104,6 +105,13 @@ class OrderSerializer(serializers.ModelSerializer):
             return u'是'
         return u'否'
 
+    def get_split_status_text(self, obj):
+        if obj.status == Order.FINISH:
+            account_detail = SplitAccountDetail.objects.filter(main_id=obj.splitaccount_id).first()
+            if account_detail:
+                return SplitAccountDetail.STATUS_CHOICES[account_detail.status][1]
+            return ''
+        return ''
 
 class CouponSerializer(serializers.ModelSerializer):
     branch_name = serializers.CharField(source='branch.name', read_only=True)

+ 1 - 0
apps/activity/urls.py

@@ -24,5 +24,6 @@ urlpatterns = (
     url(r'^activity/check/$', activity_check),
     url(r'^activity/signs_save/$', activity_signs_save),
     url(r'^activity/coupon_save/$', activity_coupon_save),
+    url(r'^activity/code/$', activity_code),
 )
 

+ 46 - 1
apps/activity/views.py

@@ -7,6 +7,7 @@ from django.utils import timezone
 from libs import utils
 from libs.http import JSONError, JSONResponse,DataGridJSONResponse
 from apps.account.decorators import token_required
+from django.contrib.auth.decorators import login_required
 from django.db import transaction, IntegrityError
 from apps.exceptions import CustomError
 
@@ -19,9 +20,12 @@ from .serializers import *
 from .filters import *
 from apps.customer.models import Customer
 from apps.account.models import Branch
+from apps.WechatApplet.models import WechatApplet
+from .base import OrderUpdate
 
 
 @token_required
+@login_required()
 def branch_list(request):
     f = BranchFilter(request.GET, queryset=Branch.objects.filter())
     rows, total = utils.get_page_data(request, f.qs)
@@ -30,6 +34,7 @@ def branch_list(request):
 
 
 @token_required
+@login_required()
 def branch_save(request):
     id = request.GET.get('id')
     data = json.loads(request.body)
@@ -47,6 +52,7 @@ def branch_save(request):
 
 
 @token_required
+@login_required()
 def self_branch(request):
     order = Branch.objects.filter(id=request.user.branch_id).first()
     data = {}
@@ -56,6 +62,7 @@ def self_branch(request):
 
 
 @token_required
+@login_required()
 def member_list(request):
     f = CustomerFilter(request.GET, queryset=Customer.objects.filter(branch=request.user.branch))
     rows, total = utils.get_page_data(request, f.qs)
@@ -64,6 +71,7 @@ def member_list(request):
 
 
 @token_required
+@login_required()
 def member_coupon_list(request):
     f = MemberCouponFilter(request.GET, queryset=MemberCoupon.objects.filter(member__branch=request.user.branch))
     rows, total = utils.get_page_data(request, f.qs)
@@ -72,6 +80,7 @@ def member_coupon_list(request):
 
 
 @token_required
+@login_required()
 def coupon_write_off(request):
     id = request.GET.get('id')
     try:
@@ -90,6 +99,7 @@ def coupon_write_off(request):
 
 
 @token_required
+@login_required()
 def coupon_cancel_write_off(request):
     id = request.GET.get('id')
     try:
@@ -108,7 +118,9 @@ def coupon_cancel_write_off(request):
 
 
 @token_required
+@login_required()
 def order_list(request):
+    OrderUpdate.update_status()
     if request.user.is_superuser:
         rows = Order.objects.filter()
     else:
@@ -128,6 +140,7 @@ def order_list(request):
 
 
 @token_required
+@login_required()
 def coupon_list(request):
     f = BranchFilter(request.GET, queryset=Coupon.objects.filter(branch=request.user.branch))
     rows, total = utils.get_page_data(request, f.qs)
@@ -136,6 +149,7 @@ def coupon_list(request):
 
 
 @token_required
+@login_required()
 def coupon_save(request):
     id = request.GET.get('id')
     data = json.loads(request.body)
@@ -154,6 +168,7 @@ def coupon_save(request):
 
 
 @token_required
+@login_required()
 def coupon_dict(request):
     rows = Coupon.objects.filter(
         Q(branch=request.user.branch, enabled=True) &
@@ -168,6 +183,7 @@ def coupon_dict(request):
 
 
 @token_required
+@login_required()
 def activity_list(request):
     if request.user.is_superuser:
         rows = Activity.objects.filter(delete=False)
@@ -180,6 +196,7 @@ def activity_list(request):
 
 
 @token_required
+@login_required()
 def activity_save(request):
     id = request.GET.get('id')
     data = json.loads(request.body)
@@ -197,6 +214,7 @@ def activity_save(request):
         return JSONError(u'保存失败!')
 
 @token_required
+@login_required()
 def activity_delete(request):
     id = request.GET.get('id')
 
@@ -218,6 +236,7 @@ def activity_delete(request):
 
 
 @token_required
+@login_required()
 def activity_check(request):
     id = request.GET.get('id')
     status = request.GET.get('status')
@@ -249,6 +268,7 @@ def activity_check(request):
 
 
 @token_required
+@login_required()
 def activity_signs_save(request):
     id = request.GET.get('id')
     signs = request.POST.get('signs')
@@ -275,6 +295,7 @@ def activity_signs_save(request):
         return JSONError(u'保存失败!')
 
 @token_required
+@login_required()
 def activity_coupon_save(request):
     id = request.GET.get('id')
     coupon_ids = request.POST.get('coupons')
@@ -299,4 +320,28 @@ def activity_coupon_save(request):
         return JSONError(e.get_error_msg())
     except Exception as e:
         traceback.print_exc()
-        return JSONError(u'保存失败!')
+        return JSONError(u'保存失败!')
+
+
+@token_required
+@login_required()
+def activity_code(request):
+    id = request.GET.get('id')
+    try:
+        with transaction.atomic():
+            order = Activity.getById(id)
+            if order.delete:
+                raise CustomError(u'该活动已删除')
+
+            if not order.wxapp_img:
+                app = WechatApplet.objects.filter().first()
+                wxCode = app.generateActivityWXappCode(order.id)
+                order.wxapp_img = settings.MEDIA_URL + wxCode
+                order.save()
+
+        return JSONResponse({'data': order.wxapp_img})
+    except CustomError as e:
+        return JSONError(e.get_error_msg())
+    except Exception as e:
+        traceback.print_exc()
+        return JSONError(u'获取失败!')

+ 2 - 2
carwin_activity/app_settings.py

@@ -6,8 +6,8 @@ DATABASES = {
     'default': {
         'ENGINE': 'django.db.backends.mysql',
         'NAME': 'carwin_activity',
-        'USER': 'root',  # Not used with sqlite3.
-        'PASSWORD': '123456',  # Not used with sqlite3.
+        'USER': 'carwin',  # Not used with sqlite3.
+        'PASSWORD': 'carwin!@#',  # Not used with sqlite3.
         'HOST': '127.0.0.1',
     },
 }

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

@@ -183,6 +183,14 @@
           area: ['70%', '90%'],
           content: 'details.html?id='+data.id
         });
+      }else if(obj.event === 'code'){
+        layer.open({
+          type: 2,
+          title: '二维码',
+          shadeClose: true,
+          area: ['70%', '90%'],
+          content: 'wxapp_code.html?id='+data.id
+        });
       }
     });
 

+ 71 - 0
uis/views/activity/wxapp_code.html

@@ -0,0 +1,71 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <meta charset="utf-8">
+    <title>二维码</title>
+    <meta name="renderer" content="webkit">
+    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+    <meta name="viewport"
+          content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=0">
+    <link rel="stylesheet" href="../../layuiadmin/layui/css/layui.css" media="all">
+    <link rel="stylesheet" href="../../layuiadmin/style/admin.css" media="all">
+    <style type="text/css">
+
+        .imgStyle{
+            width: 200px;
+            height: auto;
+        }
+    </style>
+</head>
+<body>
+
+<div class="layui-fluid">
+    <div class="layui-card">
+        <div class="layui-card-body">
+            <div align="center">
+                <br>
+                <img id="wxapp_img" src="" class="imgStyle"/>
+                <br>
+            </div>
+            <form class="layui-form" action="" lay-filter="component-form-element">
+
+                <button class="layui-btn" id="id_save" lay-submit lay-filter="component-form-element"
+                        style="display: none">保存
+                </button>
+            </form>
+        </div>
+    </div>
+</div>
+
+<script src="../../layuiadmin/layui/layui.js"></script>
+
+<script>
+    layui.config({
+        base: '../../../layuiadmin/' //静态资源所在路径
+    }).extend({
+        index: 'lib/index',
+    }).use(['index', 'form',], function () {
+        var $ = layui.$
+            , admin = layui.admin
+            , form = layui.form;
+        var id = layui.view.getParameterByName('id');
+        admin.req({
+            url: '/activity/activity/code/?id=' + id,
+            type:'post',
+            done: function (res) {
+                $('#wxapp_img').attr('src', res.data.data);
+            }
+        });
+
+        form.on('submit(component-form-element)', function (data) {
+            parent.layui.onSubmitChild();
+            return false;
+        });
+
+        parent.layui.submitChild = function () {
+            $("#id_save").click();
+        };
+    });
+</script>
+</body>
+</html>

+ 29 - 29
uis/views/order/index.html

@@ -16,14 +16,12 @@
         <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_split"><i class="layui-icon layui-icon-dollar"></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>
 
-
           </div>
         </div>
         </div>
@@ -83,9 +81,10 @@
     base: '../../../layuiadmin/' //静态资源所在路径
   }).extend({
     index: 'lib/index' //主入口模块
-  }).use(['index', 'table'], function(){
+  }).use(['index', 'table', 'utils'], function(){
     var $ = layui.$
-    ,form = layui.form;
+    ,form = layui.form
+    ,utils = layui.utils;
     var table = layui.table;
 
     table.render({
@@ -93,7 +92,8 @@
       ,url: '/activity/order/data/'
         ,where: {'delete': 0}
       ,cols: [[
-        {field:'branch_name', title:'门店', width:100}
+          {type: 'radio', width: 50}
+        ,{field:'branch_name', title:'门店', width:100}
         ,{field:'activity_name', title:'活动名称', width:200}
         ,{field:'member_name', title:'会员名称',width: 120}
         ,{field:'member_tel', title:'会员电话',width: 120}
@@ -105,6 +105,7 @@
         ,{field:'status_text', title:'状态', width:90}
         ,{field:'recommend_member_name', title:'推荐人', width:90}
         ,{field:'rebate', title:'返利', width:90}
+        ,{field:'split_status_text', title:'分账状态', width:90}
         ,{field:'delete_text', title:'是否删除', width:100}
         ,{field:'create_time', title:'创建时间', width:180}
       ]]
@@ -133,29 +134,28 @@
       }
     });
 
-    //监听工具条
-    table.on('tool(datagrid-operate)', function(obj){
-      var data = obj.data;
-        if(obj.event === 'view_coupon'){
-        table.editdata = data;
-        layer.open({
-          type: 2,
-          title: '优惠券',
-          shadeClose: false,
-          area: ['85%', '85%'],
-          yes: function(index, dom){
-             layui.onSubmitChild = function (data) {
-              layer.close(index);
-              table.reload('datagrid',{});
-            };
-            layui.submitChild();
-          },
-          btn2: function(index, layero){
-            layer.close(index);//关闭当前按钮
-          },
-          content: 'coupon_detail.html?id='+data.id
-        });
-      }
+    //分账
+    $('#btn_split').on('click', function(){
+        var data = utils.getSelectedRow('datagrid');
+         if(data == false){
+             layer.msg('请选择一条记录');
+             return false;
+         }
+
+         if (data.split_status_text !== '已关闭') {
+              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_query').on('click', function(){

+ 19 - 0
util/wx/wechat.py

@@ -289,6 +289,25 @@ class WeChat(object):
             destination.write(result.content)
         return filename
 
+    @staticmethod
+    def getActivityWXappCode(access_token, page, activity_id):
+        '''获取活动二维码'''
+        url = 'https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token={}'.format(access_token)
+        data = {
+            "scene": "activity_id={}".format(activity_id),
+            "page": page,
+            "line_color": {"r": 43, "g": 162, "b": 69},  # 自定义颜色
+            "is_hyaline": True,
+        }
+        result = requests.post(url, json=data)
+        upload_path = PathAndRename("activiytCode/")
+        filename = "{}_{}.png".format(upload_path.path, activity_id)
+        filename = filename.lower()
+        full_filename = "%s%s" % (settings.MEDIA_ROOT, filename)
+        with open(full_filename, 'wb') as destination:
+            destination.write(result.content)
+        return filename
+
     @staticmethod
     def getCommodityCode(access_token, page, commodity_id, company_no):
         '''获取商品二维码'''