de nl-8 ol-8"> 75
-        }
76
-        if(loginTask.getStatus()== AsyncTask.Status.RUNNING){
77
-            loginTask.cancel(true);
78
-        }
79
-        loginTask = null;
175
+    private void wxLogin(HashMap<String, String> params) {
176
+
177
+        loginTask = new HttpPostTask(params) {
178
+
179
+            String lensmanId;
180
+            String message;
181
+
182
+            @Override
183
+            protected boolean parseResponse(String response) {
184
+                try {
185
+                    JSONObject json = new JSONObject(response);
186
+                    int status = json.getInt("status");
187
+                    if (status == 200) {
188
+                        JSONObject info = json.getJSONObject("data");
189
+                        lensmanId = info.getString("user_id");
190
+                        return true;
191
+                    } else {
192
+                        message = json.getString("message");
193
+                    }
194
+                } catch (Exception e) {
195
+                    e.printStackTrace();
196
+                }
197
+                return false;
198
+            }
199
+
200
+            @Override
201
+            protected void onPostFail() {
202
+                super.onPostFail();
203
+                listener.onInteractFail(message);
204
+            }
205
+
206
+            @Override
207
+            protected void onPostSuccess() {
208
+                super.onPostSuccess();
209
+                listener.onInteractSuccess(lensmanId);
210
+            }
211
+        };
212
+        loginTask.executeOnExecutor(ThreadExecutor.getInstance().getExecutor(), UrlContainer.WX_LOGIN_URL);
80 213
     }
81 214
 
82 215
 }

+ 11 - 7
app/src/main/java/ai/pai/lensman/login/LoginPresenter.java

@@ -1,6 +1,7 @@
1 1
 package ai.pai.lensman.login;
2 2
 
3 3
 import android.content.Context;
4
+import android.text.TextUtils;
4 5
 
5 6
 import com.tencent.mm.sdk.modelmsg.SendAuth;
6 7
 import com.tencent.mm.sdk.openapi.IWXAPI;
@@ -26,13 +27,6 @@ public class LoginPresenter implements LoginContract.Presenter,BaseInteractor.In
26 27
 
27 28
     @Override
28 29
     public void login() {
29
-        view.showProgressView();
30
-        interactor = new LoginInteractor(this);
31
-        interactor.startJob();
32
-    }
33
-
34
-    @Override
35
-    public void start() {
36 30
         IWXAPI api = WXAPIFactory.createWXAPI(context, APP_ID, true);
37 31
         api.registerApp(APP_ID);
38 32
         SendAuth.Req req = new SendAuth.Req();
@@ -42,6 +36,16 @@ public class LoginPresenter implements LoginContract.Presenter,BaseInteractor.In
42 36
     }
43 37
 
44 38
     @Override
39
+    public void start() {
40
+        String wxCode = Preferences.getInstance(context).getWXCode();
41
+        if(!TextUtils.isEmpty(wxCode)){
42
+            view.showProgressView();
43
+            interactor = new LoginInteractor(wxCode,this);
44
+            interactor.startJob();
45
+        }
46
+    }
47
+
48
+    @Override
45 49
     public void stop() {
46 50
         if(interactor!=null){
47 51
             interactor.cancelJob();

+ 21 - 1
app/src/main/java/ai/pai/lensman/utils/UrlContainer.java

@@ -13,7 +13,27 @@ public class UrlContainer {
13 13
 
14 14
     public static final String SESSION_IDS_CREATE = HOST_URL+"uuid";
15 15
 
16
-    public static final String PHOTO_UPLOAD_URL = HOST_URL+"photos/upload";
16
+    /**
17
+     * user_id  # 用户唯一标识
18
+     * nickname  # 用户昵称
19
+     * session_id  # SESSION唯一标识
20
+     * photo_id  # 照片唯一标识
21
+     * photo  # @File 需要上传的照片
22
+     * current_id  # 当前以获取照片最大id,不传默认为-1
23
+     */
24
+    public static final String PHOTO_UPLOAD_URL = HOST_URL+"l/upload";
25
+
26
+    /**
27
+     * unionid  # 摄影师微信授权 Unionid
28
+     * openid  # 摄影师微信授权 Openid
29
+     * sex  # 性别
30
+     * nickname or screen_name  # 昵称,Android 和 iOS 貌似不同
31
+     * headimgurl or profile_image_url  # 头像,Android 和 iOS 貌似不同
32
+     * country  # 国家
33
+     * province  # 省份
34
+     * city  # 城市
35
+     */
36
+    public static final String WX_LOGIN_URL = HOST_URL+"l/wx/authorize";
17 37
 
18 38
 
19 39
 

+ 3 - 0
app/src/main/java/ai/pai/lensman/wxapi/WXEntryActivity.java

@@ -11,6 +11,8 @@ import com.tencent.mm.sdk.openapi.IWXAPI;
11 11
 import com.tencent.mm.sdk.openapi.IWXAPIEventHandler;
12 12
 import com.tencent.mm.sdk.openapi.WXAPIFactory;
13 13
 
14
+import ai.pai.lensman.db.Preferences;
15
+
14 16
 public class WXEntryActivity extends Activity implements IWXAPIEventHandler {
15 17
 
16 18
     private IWXAPI api;
@@ -42,6 +44,7 @@ public class WXEntryActivity extends Activity implements IWXAPIEventHandler {
42 44
         if(resp instanceof SendAuth.Resp){
43 45
             SendAuth.Resp newResp = (SendAuth.Resp) resp;
44 46
             String code = newResp.code;
47
+            Preferences.getInstance(this).setWXCode(code);
45 48
         }
46 49
     }
47 50
 

kodo - Gogs: Go Git Service

No Description

mch_views.py 17KB

    # -*- coding: utf-8 -*- from __future__ import division import json from django.conf import settings from django.contrib.auth.hashers import check_password from django.db import transaction from django_logit import logit from django_response import response from ipaddr import client_ip from pywe_miniapp import get_phone_number from pywe_storage import RedisStorage from TimeConvert import TimeConvert as tc from account.models import UserInfo from coupon.models import CouponInfo, UserCouponInfo from integral.models import SaleclerkSubmitLogInfo from logs.models import AdministratorLoginLogInfo, MchInfoEncryptLogInfo from mch.models import (ActivityInfo, AdministratorInfo, BrandInfo, ConsumeInfoSubmitLogInfo, DistributorInfo, LatestAppInfo, LatestAppScreenInfo, ModelInfo, OperatorInfo) from statistic.models import ConsumeModelSaleStatisticInfo, ConsumeSaleStatisticInfo, ConsumeUserStatisticInfo from utils.error.errno_utils import (AdministratorStatusCode, OperatorStatusCode, ProductBrandStatusCode, ProductModelStatusCode, UserStatusCode) from utils.redis.connect import r from utils.redis.rkeys import MEMBER_SEND_COUPON_LIST, MEMBER_UPGRADE_INFO, MINI_PROGRAM_GIS_LIST WECHAT = settings.WECHAT @logit def optor_login_api(request): brand_id = request.POST.get('brand_id', settings.KODO_DEFAULT_BRAND_ID) if brand_id != settings.KODO_DEFAULT_BRAND_ID: return response(ProductBrandStatusCode.BRAND_NOT_MATCH) phone = request.POST.get('phone', '') password = request.POST.get('password', '') try: operator = OperatorInfo.objects.get(phone=phone, status=True) except OperatorInfo.DoesNotExist: return response(OperatorStatusCode.OPERATOR_NOT_FOUND) if operator.user_status == OperatorInfo.DISABLED: return response(OperatorStatusCode.OPERATOR_NOT_ACTIVATED) elif operator.user_status == OperatorInfo.DELETED: return response(OperatorStatusCode.OPERATOR_HAS_DELETED) if not check_password(password, operator.encryption): return response(OperatorStatusCode.OPERATOR_PASSWORD_ERROR) return response(200, 'Optor Login Success', u'操作员登录成功', data=operator.kododata) @logit def admin_login_api(request): brand_id = request.POST.get('brand_id', settings.KODO_DEFAULT_BRAND_ID) if brand_id != settings.KODO_DEFAULT_BRAND_ID: return response(ProductBrandStatusCode.BRAND_NOT_MATCH) phone = request.POST.get('phone', '') password = request.POST.get('password', '') try: administrator = AdministratorInfo.objects.get(phone=phone, status=True) except AdministratorInfo.DoesNotExist: return response(AdministratorStatusCode.ADMINISTRATOR_NOT_FOUND) if administrator.user_status == AdministratorInfo.DISABLED: return response(AdministratorStatusCode.ADMINISTRATOR_NOT_ACTIVATED) elif administrator.user_status == AdministratorInfo.DELETED: return response(AdministratorStatusCode.ADMINISTRATOR_HAS_DELETED) if not check_password(password, administrator.encryption): return response(AdministratorStatusCode.ADMINISTRATOR_PASSWORD_ERROR) AdministratorLoginLogInfo.objects.create( admin_id=administrator.admin_id, admin_name=administrator.name, login_ip=client_ip(request), login_at=tc.utc_datetime(), ) request.session['admin_id'] = administrator.admin_id return response(200, 'Admin Login Success', u'管理员登录成功', data={ 'admin_id': administrator.admin_id, 'admin_type': administrator.admin_type, 'admin_name': administrator.name, 'qrurl': settings.KODO_CLERK_AUTH_URL.format(administrator.brand_id), }) @logit def bmd_infos(request): optor_id = request.POST.get('optor_id', '') try: operator = OperatorInfo.objects.get(operator_id=optor_id, status=True) except OperatorInfo.DoesNotExist: return response(OperatorStatusCode.OPERATOR_NOT_FOUND) if operator.user_status == OperatorInfo.DISABLED: return response(OperatorStatusCode.OPERATOR_NOT_ACTIVATED) brands = BrandInfo.objects.filter(brand_id=operator.brand_id, status=True).order_by('position') brands = [brand.data for brand in brands] tmpmodels = ModelInfo.objects.filter(brand_id=operator.brand_id, display=True, status=True).order_by('position') models = [model.data for model in tmpmodels] # jancodes = {model.jancode: model.data for model in tmpmodels} distributors = DistributorInfo.objects.filter(brand_id=operator.brand_id, status=True).order_by('position') distributors = [distributor.data for distributor in distributors] return response(200, data={ 'optor_id': operator.operator_id, 'brands': brands, 'models': models, # 'jancodes': jancodes, 'distributors': distributors, }) @logit def brands_list(request): brands = BrandInfo.objects.filter(status=True).order_by('position') brands = [brand.data for brand in brands] return response(200, data={ 'brands': brands, }) @logit def models_list(request): models = ModelInfo.objects.filter(status=True).order_by('position') models = [model.data for model in models] return response(200, data={ 'models': models, }) @logit def distributors_list(request): distributors = DistributorInfo.objects.filter(status=True).order_by('position') distributors = [distributor.data for distributor in distributors] return response(200, data={ 'distributors': distributors, }) @logit def upgrade_api(request): """ APP 升级 """ src = request.POST.get('src', '') if src == 'datascreen': latestappmodel = LatestAppScreenInfo else: latestappmodel = LatestAppInfo try: appinfo = latestappmodel.objects.filter(status=True)[0].adr except IndexError: appinfo = { 'latest_version_code': '', 'latest_version_name': '', 'latest_url': '', } return response(200, 'Get Latest App Success', u'获取最新版信息成功', { 'appinfo': appinfo, }) def getPhoneNumber(request): user_id = request.POST.get('user_id', '') wxcfg = WECHAT.get('MINIAPP', {}) appid = wxcfg.get('appID') # Just for compatible because of store session_key has changed session_key = None if user_id else RedisStorage(r).get('{0}:{1}:sessionKey'.format(appid, '')) wxcfg = WECHAT.get('MINIAPP', {}) appid = wxcfg.get('appID') secret = wxcfg.get('appsecret') iv = request.POST.get('iv', '') encryptedData = request.POST.get('encryptedData', '') # { # "phoneNumber": "13580006666", # "purePhoneNumber": "13580006666", # "countryCode": "86", # "watermark": # { # "appid": "APPID", # "timestamp": TIMESTAMP # } # } phone_number = get_phone_number(appid=appid, secret=secret, unid=user_id, session_key=session_key, encryptedData=encryptedData, iv=iv, storage=RedisStorage(r)) return phone_number.get('purePhoneNumber', '') @logit(res=True) def consumer_phone_api(request): return response(200, 'Get Consumer Phone Success', u'获取消费者手机号成功', { 'purePhoneNumber': getPhoneNumber(request), }) @logit(res=True) @transaction.atomic def consumer_info_api(request): user_id = request.POST.get('user_id', '') lat = request.POST.get('lat', .0) lon = request.POST.get('lon', .0) brandID = request.POST.get('brand_id', '') or request.POST.get('BrandID', '') modelID = request.POST.get('ModelID', '') distributorID = request.POST.get('DistributorID', '') serialNo = request.POST.get('SerialNo', '') verifyResult = request.POST.get('verifyResult', 0) code_version = request.POST.get('code_version', '') activities = json.loads(request.POST.get('activities', '[]')) if lat == 'undefined': lat = .0 if lon == 'undefined': lon = .0 # 校验用户是否存在 try: user = UserInfo.objects.select_for_update().get(user_id=user_id) except UserInfo.DoesNotExist: return response(UserStatusCode.USER_NOT_FOUND) try: brand = BrandInfo.objects.get(brand_id=brandID) except BrandInfo.DoesNotExist: brand = None if not brand: try: brand = BrandInfo.objects.get(pk=brandID) except BrandInfo.DoesNotExist: return response(ProductBrandStatusCode.BRAND_NOT_FOUND) except ValueError: return response(ProductBrandStatusCode.BRAND_NOT_FOUND) try: model = ModelInfo.objects.get(pk=modelID) except ModelInfo.DoesNotExist: return response(ProductModelStatusCode.MODEL_NOT_FOUND) except ValueError: return response(ProductModelStatusCode.MODEL_NOT_FOUND) # 是否是新二维码,即统览码2 if not code_version: code_version = 1 code = filter(lambda ch: ch in '0123456789', serialNo) encrypt_logs = MchInfoEncryptLogInfo.objects.filter(model_pk=model.pk, sn=code) if encrypt_logs: code_version = encrypt_logs[0].version user.code_version = code_version user.save() # try: # distributor = DistributorInfo.objects.get(pk=distributorID) # except DistributorInfo.DoesNotExist: # return response(ProductDistributorStatusCode.DISTRIBUTOR_NOT_FOUND) # except ValueError: # return response(ProductDistributorStatusCode.DISTRIBUTOR_NOT_FOUND) dupload = ConsumeInfoSubmitLogInfo.objects.filter( brand_id=brand.brand_id, model_id=model.model_id, # distributor_id=distributor.distributor_id, distributor_id='', serialNo=serialNo, verifyResult=1, test_user=False, status=True ).exists() if dupload: act = None during_activity = False else: during_activity = True if activities else False # 更新销售员提交的表 SaleclerkSubmitLogInfo.objects.filter(code=serialNo, model_pk=model.pk, status=True).update(has_scan=True) ymd = tc.local_string(format='%Y%m%d') # 记录用户信息提交记录 log = ConsumeInfoSubmitLogInfo.objects.create( user_id=user_id, phone=user.phone, lat=lat, lon=lon, brand_id=brand.brand_id, brand_name=brand.brand_name, model_id=model.model_id, model_name=model.model_name, model_uni_name=model.model_uni_name, # distributor_id=distributor.distributor_id, # distributor_name=distributor.distributor_name, distributor_id='', distributor_name='', serialNo=serialNo, verifyResult=verifyResult, dupload=dupload, test_user=user.test_user, code_version=code_version, ym=ymd[:6], ymd=ymd, province=user.province_name if lat == 0.0 and lon == 0.0 else '', submit_during_activity=during_activity ) if not dupload: for act in activities: try: coupon = CouponInfo.objects.get(coupon_id=act['coupon_id']) except CouponInfo.DoesNotExist: continue try: activity = ActivityInfo.objects.get(activity_id=act['activity_id']) except ActivityInfo.DoesNotExist: continue UserCouponInfo.objects.create( brand_id=coupon.brand_id, brand_name=coupon.brand_name, coupon_id=coupon.coupon_id, user_id=user_id, coupon_title=coupon.coupon_title, coupon_detail=coupon.coupon_detail, coupon_value=coupon.coupon_value, coupon_image=coupon.coupon_image, active_at=tc.utc_datetime(), expire_at=coupon.final_expire_at, is_coupon_admin_writeoff=coupon.is_coupon_admin_writeoff, coupon_valid_period=coupon.coupon_valid_period, coupon_limit_model_ids=coupon.coupon_limit_model_ids, coupon_from='PROMOTION', activity_id=activity.activity_id, activity_name=activity.activity_name, submit_pk=log.pk, ) # 更新注册时间 if not dupload: user.resgister_at = log.created_at user.save() if not user.test_user and not dupload: # TODO: Make statistic async cusi, _ = ConsumeUserStatisticInfo.objects.get_or_create( brand_id=brand.brand_id, ymd=ymd, ) cusi.users = list(set(cusi.users + [log.user_id])) cusi.num = len(cusi.users) cusi.save() cusi, _ = ConsumeUserStatisticInfo.objects.get_or_create( brand_id=brand.brand_id, ymd=ymd[:6], ) cusi.users = list(set(cusi.users + [log.user_id])) cusi.num = len(cusi.users) cusi.save() cusi, _ = ConsumeUserStatisticInfo.objects.get_or_create( brand_id=brand.brand_id, ymd=ymd[:4], ) cusi.users = list(set(cusi.users + [log.user_id])) cusi.num = len(cusi.users) cusi.save() # 日销量统计 cssi, _ = ConsumeSaleStatisticInfo.objects.select_for_update().get_or_create( brand_id=brand.brand_id, ymd=ymd, ) cssi.num += 1 cssi.save() # 月销量统计 cssi, _ = ConsumeSaleStatisticInfo.objects.select_for_update().get_or_create( brand_id=brand.brand_id, ymd=ymd[:6], ) cssi.num += 1 cssi.save() # 年销量统计 cssi, _ = ConsumeSaleStatisticInfo.objects.select_for_update().get_or_create( brand_id=brand.brand_id, ymd=ymd[:4], ) cssi.num += 1 cssi.save() # 日型号销量统计 cmssi, _ = ConsumeModelSaleStatisticInfo.objects.select_for_update().get_or_create( brand_id=brand.brand_id, model_name=model.model_uni_name, ymd=ymd, ) cmssi.users = list(set(cmssi.users + [user_id])) cmssi.num = len(cmssi.users) cmssi.save() # 月型号销量统计 cmssi, _ = ConsumeModelSaleStatisticInfo.objects.select_for_update().get_or_create( brand_id=brand.brand_id, model_name=model.model_uni_name, ymd=ymd[:6], ) cmssi.users = list(set(cmssi.users + [user_id])) cmssi.num = len(cmssi.users) cmssi.save() # 年型号销量统计 cmssi, _ = ConsumeModelSaleStatisticInfo.objects.select_for_update().get_or_create( brand_id=brand.brand_id, model_name=model.model_uni_name, ymd=ymd[:4], ) cmssi.users = list(set(cmssi.users + [user_id])) cmssi.num = len(cmssi.users) cmssi.save() r.rpushjson(MINI_PROGRAM_GIS_LIST, { 'brand_id': log.brand_id, 'user_id': log.user_id, 'lat': log.lat, 'lon': log.lon, 'phone': log.phone, 'ymd': ymd, 'serialNo': serialNo, 'model_id': model.model_id, 'pk': log.pk, }) if not dupload: log.integral = model.shot_member_integral log.save() user.shots_num += 1 user.integral += model.shot_member_integral # 配件不增加会员等级,只发放积分。 to_send_coupon = False if user.level < UserInfo.MEMBER_BLACK_GOLD and model.category != '调焦器' and model.category != '增倍镜': user.level += 1 to_send_coupon = True user.save() if to_send_coupon: # 发放会员权益 r.rpushjson(MEMBER_SEND_COUPON_LIST, { 'brand_id': brand.brand_id, 'user_id': user_id, }) # 会员升级提示 r.set(MEMBER_UPGRADE_INFO % (brand.brand_id, user_id), 1) return response(200, 'Submit Consumer Info Success', u'提交消费者信息成功') @logit(res=True) @transaction.atomic def consumer_snlist_api(request): user_id = request.POST.get('user_id', '') # 校验用户是否存在 try: user = UserInfo.objects.get(user_id=user_id) except UserInfo.DoesNotExist: return response(UserStatusCode.USER_NOT_FOUND) # 用户信息提交列表 logs = ConsumeInfoSubmitLogInfo.objects.filter(user_id=user_id, status=True).distinct() seen = set() seen_add = seen.add logs = [log.data for log in logs if not ((log.serialNo, log.model_name) in seen or seen_add((log.serialNo, log.model_name)))] return response(200, 'Get Consumer Submit List Success', u'获取消费者提交列表成功', { 'logs': logs, }) @logit(res=True) @transaction.atomic def consumer_model_list(request): user_id = request.POST.get('user_id', '') # 校验用户是否存在 try: user = UserInfo.objects.get(user_id=user_id) except UserInfo.DoesNotExist: return response(UserStatusCode.USER_NOT_FOUND) # 返回型号列表 models = ModelInfo.objects.filter(shot_type_id__isnull=False, status=True).order_by('-shot_member_name') models = [model.consumer_shot_data for model in models] return response(200, 'Get Model List Success', u'获取型号列表成功', { 'models': models, })