il 73
+    }
74
+    
75
+    public func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated: Bool) {
76
+        guard let navBar = navigationBar as? NavigationBar,
77
+            navBar.needsInteractive else { return }
78
+        
79
+        guard let coordinator = transitionCoordinator,
80
+            animated else {
81
+                navBar.setBackgroundImage()
82
+                navBar.clear()
83
+                return
84
+        }
85
+        
86
+        navBar.constructViewHierarchy()
87
+        
88
+        guard !coordinator.isInteractive else { return }
89
+        
90
+        coordinator.animate(alongsideTransition: { (transitionContext) in
91
+            DispatchQueue.main.async {
92
+                UIView.beginAnimations(nil, context: nil)
93
+                UIView.setAnimationCurve(transitionContext.completionCurve)
94
+                UIView.setAnimationDuration(transitionContext.transitionDuration)
95
+                navBar.transitionAnimation()
96
+                UIView.commitAnimations()
97
+            }
98
+        }, completion: { (transitionContext) in
99
+            navBar.clear()
100
+        })
101
+    }
102
+}
103
+
104
+extension NavigationController: UIGestureRecognizerDelegate {
105
+    public func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool {
106
+        if gestureRecognizer == interactivePopGestureRecognizer {
107
+            return viewControllers.count > 1
108
+        }
109
+        return true
110
+    }
111
+}

+ 8 - 30
PaiAi/PaiaiUIKit/Reusable/UIKit/PageViewController/PageViewController.swift

@@ -72,7 +72,7 @@ open class PageViewController: UIViewController {
72 72
         constructViewHierarchy()
73 73
         activateConstraints()
74 74
         setMenuGestureRecognizer()
75
-        setupNavigationBarInteractivePopDelegate()
75
+        
76 76
     }
77 77
     
78 78
     open override func viewDidLayoutSubviews() {
@@ -90,8 +90,8 @@ open class PageViewController: UIViewController {
90 90
     }
91 91
     
92 92
     private func constructViewHierarchy() {
93
+        navigationItem.titleView = menuView
93 94
         view.addSubview(scrollView)
94
-        navigationController?.navigationBar.addSubview(menuView)
95 95
         menuView.addSubview(sliderView)
96 96
     }
97 97
 }
@@ -150,15 +150,12 @@ fileprivate extension PageViewController {
150 150
             
151 151
             let left: NSLayoutConstraint
152 152
             if let lastLabel = last {
153
-                left = label.leftAnchor
154
-                    .constraint(equalTo: lastLabel.rightAnchor, constant: option.spacing)
153
+                left = label.leftAnchor.constraint(equalTo: lastLabel.rightAnchor, constant: option.spacing)
155 154
             } else {
156
-                left = label.leadingAnchor
157
-                    .constraint(equalTo: menuView.leadingAnchor)
155
+                left = label.leadingAnchor.constraint(equalTo: menuView.leadingAnchor)
158 156
             }
159 157
             
160
-            let centerY = label.centerYAnchor
161
-                .constraint(equalTo: menuView.centerYAnchor)
158
+            let centerY = label.centerYAnchor.constraint(equalTo: menuView.centerYAnchor)
162 159
             
163 160
             if i == 0 {
164 161
                 label.textColor = option.selectedColor
@@ -178,17 +175,16 @@ fileprivate extension PageViewController {
178 175
     
179 176
     func setSliderViewDetail() {
180 177
         guard let label = menuView.viewWithTag(baseTag) else { return }
181
-        sliderConstraint = sliderView.centerXAnchor
182
-            .constraint(equalTo: label.centerXAnchor)
178
+        sliderConstraint = sliderView.centerXAnchor.constraint(equalTo: label.centerXAnchor)
183 179
         
184
-        NSLayoutConstraint.activate([sliderConstraint!])
180
+        NSLayoutConstraint.activate([sliderConstraint!,
181
+                                     sliderView.topAnchor.constraint(equalTo: label.bottomAnchor, constant: 6)])
185 182
     }
186 183
 }
187 184
 
188 185
 /// layout
189 186
 fileprivate extension PageViewController {
190 187
     func activateConstraints() {
191
-        activateConstraintsMenuView()
192 188
         activateConstraintsSliderView()
193 189
         activateConstraintsScrollView()
194 190
     }
@@ -206,18 +202,6 @@ fileprivate extension PageViewController {
206 202
         NSLayoutConstraint.activate([width, height, top, leading, bottom, trailing])
207 203
     }
208 204
     
209
-    func activateConstraintsMenuView() {
210
-        guard let barContentView = navigationController?.navigationBar else {  return }
211
-        
212
-        menuView.translatesAutoresizingMaskIntoConstraints = false
213
-        
214
-        NSLayoutConstraint.activate([
215
-            menuView.topAnchor.constraint(equalTo: barContentView.topAnchor),
216
-            menuView.bottomAnchor.constraint(equalTo: barContentView.bottomAnchor),
217
-            menuView.centerXAnchor.constraint(equalTo: barContentView.centerXAnchor)
218
-            ])
219
-    }
220
-    
221 205
     func activateConstraintsSliderView() {
222 206
         
223 207
         sliderView.translatesAutoresizingMaskIntoConstraints = false
@@ -366,9 +350,3 @@ fileprivate extension PageViewController {
366 350
         }
367 351
     }
368 352
 }
369
-
370
-extension PageViewController: NavigationBarInteractiveViewController {    
371
-    public var navigationView: UIView {
372
-        return menuView
373
-    }
374
-}

+ 0 - 1
PaiAi/Paiai_iOS/App/Group/GroupDetail/GroupNameModificationViewController.swift

@@ -86,5 +86,4 @@ extension GroupNameModificationViewController {
86 86
     }
87 87
 }
88 88
 
89
-
90 89
 extension GroupNameModificationViewController: NavigationBackViewController {}

+ 6 - 19
PaiAi/Paiai_iOS/App/Group/GroupViewController.swift

@@ -59,6 +59,7 @@ final class GroupViewController: UIViewController {
59 59
                                       bundle: Bundle(identifier: "com.Paiai-iOS")),
60 60
                                 forCellWithReuseIdentifier: "photoCell")
61 61
         setup()
62
+        setNavigationBar()
62 63
         binding()
63 64
     }
64 65
     
@@ -149,7 +150,7 @@ fileprivate extension GroupViewController {
149 150
     }
150 151
 }
151 152
 
152
-extension GroupViewController: NavigationBarInteractiveViewController {
153
+extension GroupViewController {
153 154
     var navigationView: UIView {
154 155
         return navigationBarView
155 156
     }
@@ -157,14 +158,13 @@ extension GroupViewController: NavigationBarInteractiveViewController {
157 158
     func setNavigationBar() {
158 159
         guard navigationViewNotReady else { return }
159 160
         setRightBarButtonItems()
160
-        construvtNaivgationViewHierarchy()
161
+        constructNaivgationViewHierarchy()
161 162
         activateConstraintsNavigation()
162
-        
163 163
         navigationViewNotReady = false
164 164
     }
165 165
     
166
-    private func construvtNaivgationViewHierarchy() {
167
-        navigationController?.navigationBar.addSubview(navigationBarView)
166
+    private func constructNaivgationViewHierarchy() {
167
+        navigationItem.titleView = navigationBarView
168 168
         navigationBarView.addSubview(navigationBarViewImage)
169 169
         navigationBarView.addSubview(navigationBarViewTitle)
170 170
     }
@@ -172,7 +172,7 @@ extension GroupViewController: NavigationBarInteractiveViewController {
172 172
     private func setRightBarButtonItems() {
173 173
         let item = UIBarButtonItem(images: [UIImage(named: "navigation-QR"),
174 174
                                             UIImage(named: "navigation-right")],
175
-                                   targets: [self, viewModel],
175
+                                   targets: [self, viewModel!],
176 176
                                    actions: [#selector(GroupViewController.presentGroupQR),
177 177
                                              #selector(GroupViewModel.navigateToGroupDetail)])
178 178
 
@@ -194,23 +194,10 @@ extension GroupViewController: NavigationBarInteractiveViewController {
194 194
 fileprivate extension GroupViewController {
195 195
     
196 196
     func activateConstraintsNavigation() {
197
-        activateConstraintsNavigationBarView()
198 197
         activateConstraintsNavigationBarViewImage()
199 198
         activateConstraintsNavigationBarViewTitle()
200 199
     }
201 200
     
202
-    func activateConstraintsNavigationBarView() {
203
-        guard let barContentView = navigationController?.navigationBar else {  return }
204
-        
205
-        navigationBarView.translatesAutoresizingMaskIntoConstraints = false
206
-        
207
-        NSLayoutConstraint.activate([
208
-            navigationBarView.topAnchor.constraint(equalTo: barContentView.topAnchor),
209
-            navigationBarView.bottomAnchor.constraint(equalTo: barContentView.bottomAnchor),
210
-            navigationBarView.centerXAnchor.constraint(equalTo: barContentView.centerXAnchor)
211
-            ])
212
-    }
213
-    
214 201
     func activateConstraintsNavigationBarViewTitle() {
215 202
         navigationBarViewTitle.translatesAutoresizingMaskIntoConstraints = false
216 203
         NSLayoutConstraint.activate([

+ 3 - 2
PaiAi/Paiai_iOS/App/Home/ScanQRViewController.swift

@@ -24,7 +24,8 @@ final class ScanQRViewController: UIViewController {
24 24
     override func viewDidLoad() {
25 25
         super.viewDidLoad()
26 26
         scanView.delegate = self
27
-        viewModel.join(code: "http://pai.ai/g/SpA5be3")
27
+//        viewModel.join(code: "http://pai.ai/g/SpA5be3")
28
+        setNavigationBar()
28 29
     }
29 30
     
30 31
     func setNavigationBar() {
@@ -34,7 +35,7 @@ final class ScanQRViewController: UIViewController {
34 35
     
35 36
     override func viewWillAppear(_ animated: Bool) {
36 37
         super.viewWillAppear(animated)
37
-        setNavigationBar()
38
+        
38 39
     }
39 40
 
40 41
     override func viewWillDisappear(_ animated: Bool) {

+ 1 - 14
PaiAi/Paiai_iOS/App/Message/MessageListViewController.swift

@@ -48,7 +48,7 @@ final class MessageListViewController: UIViewController {
48 48
         setup()
49 49
         binding()
50 50
         setNavigationBar()
51
-        self.viewModel.reload()
51
+        self.viewModel.reload()        
52 52
     }
53 53
     
54 54
     private func setNavigationBar() {
@@ -174,19 +174,6 @@ fileprivate extension MessageListViewController {
174 174
                     self.tableView.endRefreshing(at: .bottom)
175 175
                 }
176 176
             }).disposed(by: disposeBag)
177
-        
178
-        viewModel.hasMoreData
179
-            .asDriver(onErrorJustReturn: true)
180
-            .drive(onNext: {[weak self] flag in
181
-                guard let `self` = self else { return }
182
-                if flag {
183
-                    if self.tableView.bottomPullToRefresh == nil {
184
-                        self.setupLoadingControl()
185
-                    }
186
-                } else {
187
-//                    self.tableViewt
188
-                }
189
-            }).disposed(by: disposeBag)
190 177
     }
191 178
 }
192 179
 

+ 0 - 13
PaiAi/Paiai_iOS/App/Mine/MineGroupViewController.swift

@@ -128,19 +128,6 @@ fileprivate extension MineGroupViewController {
128 128
                     self.tableView.endRefreshing(at: .bottom)
129 129
                 }
130 130
             }).disposed(by: disposeBag)
131
-        
132
-        viewModel.hasMoreData
133
-            .asDriver(onErrorJustReturn: true)
134
-            .drive(onNext: {[weak self] flag in
135
-                guard let `self` = self else { return }
136
-                if flag {
137
-                    if self.tableView.bottomPullToRefresh == nil {
138
-                        self.setupLoadingControl()
139
-                    }
140
-                } else {
141
-                    //                    self.tableViewt
142
-                }
143
-            }).disposed(by: disposeBag)
144 131
     }
145 132
 }
146 133
 

+ 0 - 13
PaiAi/Paiai_iOS/App/Mine/MineOrderViewController.swift

@@ -111,19 +111,6 @@ fileprivate extension MineOrderViewController {
111 111
                     self.tableView.endRefreshing(at: .bottom)
112 112
                 }
113 113
             }).disposed(by: disposeBag)
114
-        
115
-        viewModel.hasMoreData
116
-            .asDriver(onErrorJustReturn: true)
117
-            .drive(onNext: {[weak self] flag in
118
-                guard let `self` = self else { return }
119
-                if flag {
120
-                    if self.tableView.bottomPullToRefresh == nil {
121
-                        self.setupLoadingControl()
122
-                    }
123
-                } else {
124
-                    //                    self.tableViewt
125
-                }
126
-            }).disposed(by: disposeBag)
127 114
     }
128 115
 }
129 116
 

kodo - Gogs: Go Git Service

Brak opisu

views.py 14KB

    # -*- coding: utf-8 -*- from django.conf import settings from django.db import transaction from django.db.models import Sum from django_logit import logit from django_models_ext.provincemodels import ProvinceShortModelMixin from django_query import get_query_value from django_response import response from TimeConvert import TimeConvert as tc from mch.models import BrandInfo, DistributorInfo, ModelInfo, SaleclerkInfo from statistic.models import (ConsumeDistributorSaleStatisticInfo, ConsumeModelSaleStatisticInfo, ConsumeProvinceSaleStatisticInfo, ConsumeSaleStatisticInfo, ConsumeUserStatisticInfo, DistributorSaleStatisticInfo, ModelSaleStatisticInfo, ProvinceSaleStatisticInfo, RegisterStatisticInfo, SaleclerkSaleStatisticInfo, SaleStatisticInfo) from utils.rdm_utils import randnum @logit def tj_distributor(request): brand_id = request.POST.get('brand_id') or settings.KODO_DEFAULT_BRAND_ID ymd = int(tc.local_string(format='%Y%m%d')) # 注册用户统计 & 今日注册用户 try: register_num = RegisterStatisticInfo.objects.get(brand_id=brand_id, ymd=ymd).num except RegisterStatisticInfo.DoesNotExist: register_num = 0 # # 注册用户数趋势 # register_trends = RegisterStatisticInfo.objects.filter(status=True).order_by('-ymd') # register_trends = [r.data for r in register_trends] # 销量统计 & 今日销量 try: sale_num = SaleStatisticInfo.objects.get(brand_id=brand_id, ymd=ymd).num except SaleStatisticInfo.DoesNotExist: sale_num = 0 # # 商品销量趋势 # sale_trends = SaleStatisticInfo.objects.filter(status=True).order_by('-ymd') # sale_trends = [s.data for s in sale_trends] # 型号销量统计 & 热销商品榜 model_sales = ModelSaleStatisticInfo.objects.filter(brand_id=brand_id, ymd=ymd, status=True).order_by('-num') model_sales = [m.data for m in model_sales] # 经销商销量统计 & 经销商榜 distributor_sales = DistributorSaleStatisticInfo.objects.filter(brand_id=brand_id, ymd=ymd, status=True).order_by('-num') distributor_sales = [d.data for d in distributor_sales] # 各地区实时销量 province_sales = ProvinceSaleStatisticInfo.objects.filter(brand_id=brand_id, ymd=ymd, status=True).order_by('position') province_sales = [p.data for p in province_sales] # TOADD: ROI rois = ModelSaleStatisticInfo.objects.filter(brand_id=brand_id, ymd=ymd, status=True) rois = [m.roi for m in rois] return response(200, 'Get TJ Data Success', u'获取统计数据成功', { 'register_num': randnum() if settings.DEBUG_STATISTIC_DATA_FLAG else register_num, # 注册用户统计 & 今日注册用户 # 'register_trends': register_trends, # 注册用户数趋势 'sale_num': randnum() if settings.DEBUG_STATISTIC_DATA_FLAG else sale_num, # 销量统计 & 今日销量 # 'sale_trends': sale_trends, # 商品销量趋势 'model_sales': model_sales, # 型号销量统计 & 热销商品榜 'distributor_sales': distributor_sales, # 经销商销量统计 & 经销商榜 'province_sales': province_sales, # 各地区实时销量 'rois': rois, # ROI }) @logit def tj_consumer(request): brand_id = request.POST.get('brand_id') or settings.KODO_DEFAULT_BRAND_ID ymd = int(tc.local_string(format='%Y%m%d')) # 注册用户统计 & 今日注册用户 try: register_num = RegisterStatisticInfo.objects.get(brand_id=brand_id, ymd=ymd).num except RegisterStatisticInfo.DoesNotExist: register_num = 0 # 注册用户数趋势 register_trends = RegisterStatisticInfo.objects.filter(brand_id=brand_id, status=True).order_by('-ymd')[:30] register_trends = [r.data for r in register_trends][::-1] # 销量统计 & 今日销量 try: sale_num = ConsumeSaleStatisticInfo.objects.get(brand_id=brand_id, ymd=ymd).num except ConsumeSaleStatisticInfo.DoesNotExist: sale_num = 0 # 商品销量趋势 sale_trends = ConsumeSaleStatisticInfo.objects.filter(brand_id=brand_id, status=True).order_by('-ymd')[:30] sale_trends = [s.data for s in sale_trends][::-1] # 型号销量统计 & 热销商品榜 model_sales = ConsumeModelSaleStatisticInfo.objects.filter(brand_id=brand_id, ymd=ymd, status=True).order_by('-num') model_sales = [m.data for m in model_sales] # 经销商销量统计 & 经销商榜 distributor_sales = ConsumeDistributorSaleStatisticInfo.objects.filter(brand_id=brand_id, ymd=ymd, status=True).order_by('-num') distributor_sales = [d.data for d in distributor_sales] # 各地区实时销量 province_sales = ConsumeProvinceSaleStatisticInfo.objects.filter(brand_id=brand_id, ymd=ymd, status=True).order_by('position') province_sales = [p.data for p in province_sales] return response(200, 'Get TJ Data Success', u'获取统计数据成功', { 'register_num': randnum() if settings.DEBUG_STATISTIC_DATA_FLAG else register_num, # 注册用户统计 & 今日注册用户 'register_trends': register_trends, # 注册用户数趋势 'sale_num': randnum() if settings.DEBUG_STATISTIC_DATA_FLAG else sale_num, # 销量统计 & 今日销量 'sale_trends': sale_trends, # 商品销量趋势 'model_sales': model_sales, # 型号销量统计 & 热销商品榜 'distributor_sales': distributor_sales, # 经销商销量统计 & 经销商榜 'province_sales': province_sales, # 各地区实时销量 }) @logit @transaction.atomic def tj_generate(request): # 1 0 * * * curl http://kodo.xfoto.com.cn/api/tj/generate __tj_generate(ymd=None) return response() @transaction.atomic def __tj_generate(ymd=None): ymd = ymd or int(tc.local_string(format='%Y%m%d')) brands = BrandInfo.objects.filter(status=True) for brand in brands: for pcode, pname in ProvinceShortModelMixin.PROVINCE_CODE_NAME_DICT.items(): pssi, created = ProvinceSaleStatisticInfo.objects.get_or_create( brand_id=brand.brand_id, province_code=pcode, ymd=ymd, ) pssi.province_name = pname pssi.save() cpssi, created = ConsumeProvinceSaleStatisticInfo.objects.get_or_create( brand_id=brand.brand_id, province_code=pcode, ymd=ymd, ) cpssi.province_name = pname cpssi.save() models = ModelInfo.objects.filter(brand_id=brand.brand_id, status=True) for mdl in models: mssi, created = ModelSaleStatisticInfo.objects.get_or_create( brand_id=brand.brand_id, model_id=mdl.model_id, ymd=ymd, ) mssi.model_name = mdl.model_name mssi.save() cmssi, created = ConsumeModelSaleStatisticInfo.objects.get_or_create( brand_id=brand.brand_id, model_name=mdl.model_uni_name, ymd=ymd, ) cmssi.save() distributors = DistributorInfo.objects.filter(brand_id=brand.brand_id, status=True) for dtbt in distributors: dssi, created = DistributorSaleStatisticInfo.objects.get_or_create( brand_id=brand.brand_id, distributor_id=dtbt.distributor_id, ymd=ymd, ) dssi.distributor_name = dtbt.distributor_name dssi.save() cdssi, created = ConsumeDistributorSaleStatisticInfo.objects.get_or_create( brand_id=brand.brand_id, distributor_id=dtbt.distributor_id, ymd=ymd, ) cdssi.distributor_name = dtbt.distributor_name cdssi.save() RegisterStatisticInfo.objects.select_for_update().get_or_create( brand_id=brand.brand_id, ymd=ymd, ) SaleStatisticInfo.objects.select_for_update().get_or_create( brand_id=brand.brand_id, ymd=ymd, ) ConsumeSaleStatisticInfo.objects.select_for_update().get_or_create( brand_id=brand.brand_id, ymd=ymd, ) def ytj(brand_id): # [消费者维度] 周期内扫描用户人数 cusis = ConsumeUserStatisticInfo.objects.filter(brand_id=brand_id, ymd__lt=9999) users = [] for cusi in cusis: users += cusi.users scan_user_count = len(set(users)) # [消费者维度] 周期内镜头销售支数 sell_volume_count = ConsumeSaleStatisticInfo.objects.filter(brand_id=brand_id, ymd__lt=9999).aggregate(Sum('num')).get('num__sum', 0) or 0 startd = tc.local_string(months=-12, format='%Y%m%d') endd = tc.local_string(format='%Y%m%d') # [消费者维度] 统计周期内型号扫描排行数据,请按顺序返回 models = ConsumeModelSaleStatisticInfo.objects.filter( brand_id=brand_id, ymd__gt=startd, ymd__lte=endd, status=True ).order_by( 'model_name' ).values( 'model_id', 'model_name' ).annotate( num=Sum('num') ).order_by( '-num' )[:20] # [经销商维度] 统计周期内销售员排行数据,请按顺序返回 salesmen = SaleclerkSaleStatisticInfo.objects.filter( brand_id=brand_id, ymd__gt=startd, ymd__lte=endd, status=True ).order_by( 'clerk_id' ).values( 'clerk_id' ).annotate( num=Sum('num') ).order_by( '-num' )[:20] clerks = SaleclerkInfo.objects.filter(brand_id=brand_id, status=True) clerks = {clerk.clerk_id: {'distributor_id': clerk.distributor_id, 'distributor_name': clerk.distributor_name, 'clerk_name': clerk.clerk_name, 'salesman_id': clerk.clerk_id, 'salesman_name': clerk.clerk_name} for clerk in clerks} salesmen = [dict(sm, **clerks.get(sm.get('clerk_id', ''), {})) for sm in salesmen] # [收费者维度] 统计周期内省份销量排行数据,请按顺序返回 provinces = ConsumeProvinceSaleStatisticInfo.objects.filter( brand_id=brand_id, ymd__gt=startd, ymd__lte=endd, status=True ) # ).order_by( # 'province_code' # ).values( # 'province_code' # ).annotate( # num=Sum('num') # ).order_by( # '-num' # ) provinces_users = {} for province in provinces: if provinces_users.get(province.province_code): provinces_users[province.province_code] += province.users else: provinces_users[province.province_code] = province.users provinces = [{'province_code': province_code, 'num': len(set(users))} for province_code, users in provinces_users.items()] provinces = sorted(provinces, key=lambda p: p['num'], reverse=True) return { 'scan_user_count': scan_user_count, 'sell_volume_count': sell_volume_count, 'user_count_increase_pct': -1, # 与上个统计周期数据的用户人数比例 'volume_count_increase_pct': -1, # 与上个统计周期数据的销售支数比例 'models': list(models), 'salesmen': salesmen, 'provinces': provinces, } def ymdtj(brand_id, ymd, lastymd): # [消费者维度] 周期内扫描用户人数 try: scan_user_count = ConsumeUserStatisticInfo.objects.get(brand_id=brand_id, ymd=ymd).num except ConsumeUserStatisticInfo.DoesNotExist: scan_user_count = 0 try: last_scan_user_count = ConsumeUserStatisticInfo.objects.get(brand_id=brand_id, ymd=lastymd).num except ConsumeUserStatisticInfo.DoesNotExist: last_scan_user_count = 0 # [消费者维度] 周期内镜头销售支数 try: sell_volume_count = ConsumeSaleStatisticInfo.objects.get(brand_id=brand_id, ymd=ymd).num except ConsumeSaleStatisticInfo.DoesNotExist: sell_volume_count = 0 try: last_sell_volume_count = ConsumeSaleStatisticInfo.objects.get(brand_id=brand_id, ymd=lastymd).num except ConsumeSaleStatisticInfo.DoesNotExist: last_sell_volume_count = 0 # 与上个统计周期数据的销售支数比例 volume_count_increase_pct = '%.2f' % (sell_volume_count * 100.0 / last_sell_volume_count) if last_sell_volume_count != 0 else -1 # 与上个统计周期数据的用户人数比例 user_count_increase_pct = '%.2f' % (scan_user_count * 100.0 / last_scan_user_count) if last_scan_user_count != 0 else -1 # [消费者维度] 统计周期内型号扫描排行数据,请按顺序返回 current_models = ConsumeModelSaleStatisticInfo.objects.filter(brand_id=brand_id, ymd=ymd, status=True).order_by('-num') models = [m.data for m in current_models[:20]] # [经销商维度] 统计周期内销售员排行数据,请按顺序返回 salesmen = SaleclerkSaleStatisticInfo.objects.filter(brand_id=brand_id, ymd=ymd, status=True).order_by('-num') salesmen = [s.data for s in salesmen[:20]] # [收费者维度] 统计周期内省份销量排行数据,请按顺序返回 provinces = ConsumeProvinceSaleStatisticInfo.objects.filter(brand_id=brand_id, ymd=ymd, status=True).order_by('-num') provinces = [p.data for p in provinces] return { 'scan_user_count': scan_user_count, 'sell_volume_count': sell_volume_count, 'user_count_increase_pct': user_count_increase_pct, 'volume_count_increase_pct': volume_count_increase_pct, 'models': models, 'salesmen': salesmen, 'provinces': provinces, } @logit def v2_tj_distributor(request): brand_id = get_query_value(request, 'brand_id', settings.KODO_DEFAULT_BRAND_ID) year = tc.local_string(format='%Y') month = tc.local_string(format='%Y%m') day = tc.local_string(format='%Y%m%d') lastyear = tc.local_string(years=-1, format='%Y') lastmonth = tc.local_string(months=-1, format='%Y%m') lastday = tc.local_string(days=-1, format='%Y%m%d') # year_data = ytj(brand_id) year_data = ymdtj(brand_id, year, lastyear) month_data = ymdtj(brand_id, month, lastmonth) day_data = ymdtj(brand_id, day, lastday) return response(200, 'Get TJ Data Success', u'获取统计数据成功', data={ 'year_data': year_data, 'month_data': month_data, 'day_data': day_data, })