コード例 #1
0
    def login_by_wx_ticket(self):
        """微信扫描二维码登录"""
        scene_id = self.args['scene_id']

        wx_userinfo = pf_redis.get('pf_scene_openid:%s' % scene_id)
        if not wx_userinfo:
            return self.send_success(done=False)
        wx_userinfo = json.loads(wx_userinfo.decode())

        if len(str(scene_id)) == 9:
            success, user_or_msg = AuthFunc.login_by_wx(
                self.session, wx_userinfo)
            if not success:
                return self.send_fail(user_or_msg)

            user = user_or_msg
            self.set_current_user(user)
        else:
            return self.send_fail("scene_id 无效")

        pf_redis.delete('pf_scene_openid:%s' % scene_id)

        # 更新微信信息
        AuthFunc.update_through_wx(self.session,
                                   wx_userinfo,
                                   user,
                                   action="bind")
        # 手机绑定状态
        phone_bind = bool(user.phone)
        return self.send_success(done=True, phone_bind=phone_bind)
コード例 #2
0
    def bind_phone(self):
        """绑定手机"""
        code = self.args["code"]
        phone = Emoji.filter_emoji(self.args["phone"].strip())

        if not self.current_user:
            return self.write_error(401)

        if len(phone) != 11:
            return self.send_fail("请填写正确的手机号")

        check_msg_res = check_msg_token(phone, code, use="bind")
        if not options.debug and not check_msg_res:
            return self.send_fail("验证码过期或者不正确")

        # 尝试合并账号
        success, errmsg = AuthFunc.merge_passport(
            self.session, self.current_user.passport_id, phone)
        if success:
            self.clear_current_user()
            return self.send_success()
        elif errmsg != "USE UPDATE":
            return self.send_fail(errmsg)

        # 尝试使用 UPDATE
        success, errmsg = AuthFunc.update_passportinfo(
            self.current_user.passport_id, "phone", phone)
        if not success:
            if errmsg == "NOT EXIST":
                return self.send_fail("账户不存在,请联系森果客服 400-027-0135")
            elif errmsg == "SAME VALUE":
                return self.send_fail("无需重复绑定")
            elif errmsg == "ALREADY BIND":
                return self.send_fail("该手机号已绑定,请更换手机号绑定或联系森果客服 400-027-0135")
            else:
                return self.send_fail("绑定失败,请联系森果客服 400-027-0135")

        self.current_user.phone = phone

        # 更新门店联系人 ID
        contacts = self.session.query(models.ShopContact) \
            .filter(models.ShopContact.phone == phone) \
            .all()
        if contacts:
            for contact in contacts:
                contact.account_id = self.current_user.id

        self.session.commit()
        self.clear_current_user()
        return self.send_success()
コード例 #3
0
    def post(self):
        """
            前端wx.getUserInfo方法返回的用户信息:
                {
                    user_info:用户信息对象,不包含 openid 等敏感信息
                    rawData:不包括敏感信息的原始数据字符串,用于计算签名
                    signature:使用 sha1( rawData + sessionkey ) 得到字符串,用于校验用户信息
                    encryptedData:包括敏感数据在内的完整用户信息的加密数据(包含unionid)
                    iv:加密算法的初始向量
                }

            source: 登录请求的来源 "purchase"-采购助手 "demand"-订货助手
        """
        if self.current_user:
            return self.send_fail("无需重复登录")

        from handlers.applet import ResolveData
        res_status, res_content = ResolveData().resolve(self.args)
        if not res_status:
            return self.send_fail(res_content)
        user_info = res_content

        success, user_or_msg = AuthFunc.login_by_wx(self.session, user_info)
        if not success:
            return self.send_fail(user_or_msg)
        AuthFunc.update_through_wx(self.session,
                                   user_info,
                                   user_or_msg,
                                   action="bind")

        user = user_or_msg
        self.set_current_user(user)

        # 设置当前中转站
        station = self.session.query(models.TransferStation) \
            .join(models.Staff, models.Staff.station_id == models.TransferStation.id) \
            .filter(models.TransferStation.status == 0,
                    models.Staff.status == 0,
                    models.Staff.account_id == user.id,
                    models.Staff.purchaser_status == 1) \
            .first()
        if station:
            self.set_current_station_cookie(station.id,
                                            domain=self._ARG_DEFAULT)

        # #缓存session_key
        # redis_name = "session_key:%s:%d"%(appid,customer_id)
        # redis_session.set(redis_name,session_key,7*24*60*60)
        phone_bind = bool(user.phone)
        return self.send_success(phone_bind=phone_bind)
コード例 #4
0
    def bind_wx(self):
        """绑定微信"""
        scene_id = self.args['scene_id']

        wx_userinfo = pf_redis.get('pf_scene_openid:%s' % scene_id)
        if not wx_userinfo:
            return self.send_success(done=False)
        wx_userinfo = json.loads(wx_userinfo.decode())
        wx_unionid = wx_userinfo["unionid"]

        # 绑定微信
        if len(str(scene_id)) == 8:
            bind_key = "ph_scene_bind_account:%s" % scene_id
            bind_user_id = redis.get(bind_key) or -1
            user = models.AccountInfo.get_by_id(self.session, bind_user_id)

            # scene_id 不对或者 Redis 的 key 过期了
            if not user or not user.passport_id:
                return self.send_fail("请刷新页面后重试")

            success, errmsg = AuthFunc.update_passportinfo(
                user.passport_id, "wx_unionid", wx_unionid)
            if not success:
                if errmsg == "NOT EXIST":
                    return self.send_fail("账户不存在,请联系森果客服 400-027-0135")
                elif errmsg == "SAME VALUE":
                    # 重复绑定是为了取微信信息
                    pass
                elif errmsg == "ALREADY BIND":
                    return self.send_fail("该微信已被其他账户绑定")
                else:
                    return self.send_fail("绑定失败,请联系森果客服 400-027-0135")

            redis.delete(bind_key)
        else:
            return self.send_fail("scene_id 无效")

        pf_redis.delete('pf_scene_openid:%s' % scene_id)
        redis.delete("ph_scene_bind_account:%s" % scene_id)

        # 更新微信信息
        AuthFunc.update_through_wx(self.session,
                                   wx_userinfo,
                                   user,
                                   action="bind")
        return self.send_success(done=True)
コード例 #5
0
    def confirm(self, order):
        api = GetPifaData(self.current_user.passport_id, AuthFunc.gen_token())
        ret_dict = api.confirm_pf_demand_order(self.current_user.phone,
                                               order.object_id, order.id)
        if not ret_dict["success"]:
            return self.send_fail(ret_dict.get("msg", ""))

        return self.send_success()
コード例 #6
0
    def post(self):
        code = self.args["code"]

        wx_userinfo = WxOauth2.get_userinfo(code, mode="")
        if not wx_userinfo:
            return self.send_error(401)

        success, user_or_msg = AuthFunc.login_by_wx(self.session, wx_userinfo)
        if not success:
            return self.send_error(403, error_msg=user_or_msg)
        user = user_or_msg

        self.set_current_user(user_or_msg)

        # 更新微信信息
        AuthFunc.update_through_wx(self.session,
                                   wx_userinfo,
                                   user,
                                   action="bind")
        # 手机绑定状态
        phone_bind = bool(user.phone)
        return self.send_success(phone_bind=phone_bind)
コード例 #7
0
    def login_by_phone_code(self):
        """
        手机号+验证码登录,已注册用户直接登录,未注册用户生成新账号并登录
            phone:手机号
            code:验证码
        """
        phone = self.args["phone"].strip()
        code = self.args["code"].strip()

        if len(phone) != 11:
            return self.send_fail("请填写正确的手机号")

        check_msg_res = check_msg_token(phone, code, use="login")
        if not options.debug and not check_msg_res:
            return self.send_fail("验证码错误或已失效")

        # 登录
        success, user_or_msg = AuthFunc.login_by_phone_code(
            self.session, phone)
        if not success:
            return self.send_fail(user_or_msg)

        # 设置cookie
        self.set_current_user(user_or_msg)

        # 返回微信绑定状态,三者缺一要求重新绑定
        if user_or_msg.wx_unionid and user_or_msg.nickname and user_or_msg.headimgurl:
            wx_bind = True
        else:
            wx_bind = False

        # 更新门店联系人 ID
        contacts = self.session.query(models.ShopContact) \
            .filter(models.ShopContact.phone == phone) \
            .all()
        if contacts:
            for contact in contacts:
                contact.account_id = user_or_msg.id
            self.session.commit()

        return self.send_success(wx_bind=wx_bind)
コード例 #8
0
    def get(self):
        api = GetPifaData(self.current_user.passport_id, AuthFunc.gen_token())

        ret_dict = api.get_pf_shops(self.current_user.phone)
        if not ret_dict["success"]:
            return self.send_fail(ret_dict.get("msg", ""))

        data_list = []
        for data in ret_dict["data_list"]:
            data_list.append({
                "shop_id":
                check_int(PfSimpleEncrypt.decrypt(data.get("shop_id", 0))),
                "shop_name":
                data.get("shop_name", ""),
                "purchase_times":
                data.get("purchase_times", 0),
                "latest_order_time":
                data.get("latest_order_time", ""),
                "is_online_order_open":
                data.get("is_online_order_open", 0),
            })

        return self.send_success(data_list=data_list)
コード例 #9
0
    def post(self):
        name = self.args["name"]
        city_code = self.args["city_code"]
        address = self.args["address"]
        phone = self.args["phone"]
        code = self.args["code"]

        province_code = ProvinceCityFunc.city_to_province(city_code)
        if not province_code:
            return self.send_fail("请填写正确的省份")

        if len(phone) != 11:
            return self.send_fail("请填写正确的手机号")

        check_msg_res = check_msg_token(phone, code, use="station_register")
        if not options.debug and not check_msg_res:
            return self.send_fail("验证码过期或者不正确")

        # 检查用于注册的手机号
        success, errmsg = AuthFunc.update_passportinfo(
            self.current_user.passport_id, "phone", phone)
        if not success:
            if errmsg == "NOT EXIST":
                return self.send_fail("请登录后重试")
            elif errmsg == "SAME VALUE":
                pass
            elif errmsg == "ALREADY BIND":
                return self.send_fail("该手机号已被注册")
        self.current_user.phone = phone

        existed_station = self.session.query(models.TransferStation) \
            .join(models.Staff, models.Staff.station_id == models.TransferStation.id) \
            .filter(models.Staff.super_admin_status == 1,
                    models.Staff.status == 0,
                    models.Staff.account_id == self.current_user.id) \
            .first()
        if existed_station:
            return self.send_fail("您已经是 {} 的超级管理员了".format(
                existed_station.name))

        # 添加新中转站
        new_station = models.TransferStation(
            name=name,
            province=province_code,
            city=city_code,
            address=address,
            creator_id=self.current_user.id,
        )
        self.session.add(new_station)
        self.session.flush()

        # 添加默认超管
        super_admin = models.Staff(
            station_id=new_station.id,
            account_id=self.current_user.id,
            super_admin_status=1,
            admin_status=1,
            purchaser_status=0,
            date_onboarding=datetime.date.today(),
        )
        super_admin.set_admin_permissions(None, grant_all=True)
        super_admin.set_purchaser_permissions(None, grant_all=True)
        self.session.add(super_admin)

        # 添加设置项
        config = models.Config(id=new_station.id)
        self.session.add(config)

        self.session.commit()
        self.clear_current_user()
        return self.send_success()
コード例 #10
0
    def post(self):
        pf_shop_id = self.args["pf_shop_id"]
        pf_shop_name = self.args["pf_shop_name"]
        demand_date = self.args["demand_date"]
        goods_list = self.args["goods_list"]

        valid, message = self.validate_goods_list(goods_list)
        if not valid:
            return self.send_fail(message)

        # 添加到本地数据库
        new_order = models.ExternalDemandOrder(
            creator_id=self.current_user.id,
            target=1,
            object_id=pf_shop_id,
            object_name=pf_shop_name,
            demand_date=demand_date,
        )
        self.session.add(new_order)
        self.session.flush()

        demand_list = []
        for goods_data in goods_list:
            goods_name = goods_data["goods_name"]
            demand_amount = check_float(goods_data["demand_amount"])
            demand_unit = check_int(goods_data["demand_unit"])
            remarks = goods_data.get("remarks", "")

            new_order_goods = models.ExternalDemandOrderGoods(
                creator_id=self.current_user.id,
                order_id=new_order.id,
                goods_name=goods_name,
                demand_amount=check_int(demand_amount * 100),
                demand_unit=demand_unit,
                remarks=remarks,
            )
            self.session.add(new_order_goods)
            self.session.flush()
            unit_map = {
                0: "斤",
                1: "件",
                2: "kg",
                3: "个",
                4: "份",
                5: "盒",
                6: "只",
                7: "包"
            }
            demand_list.append({
                "external_line_id": new_order_goods.id,
                "name": goods_name,
                "amount": demand_amount,
                "unit_text": unit_map.get(demand_unit, "斤"),
                "remark": remarks,
            })

        api = GetPifaData(self.current_user.passport_id, AuthFunc.gen_token())

        ret_dict = api.send_pf_demand_order(self.current_user.phone,
                                            pf_shop_id, new_order.id,
                                            demand_date, demand_list)
        if not ret_dict["success"]:
            return self.send_fail(ret_dict.get("msg", ""))

        self.session.commit()
        return self.send_success()
コード例 #11
0
    def get(self, order_id):
        order = self.session.query(models.ExternalDemandOrder) \
            .filter(models.ExternalDemandOrder.id == order_id,
                    models.ExternalDemandOrder.creator_id == self.current_user.id) \
            .first()
        if not order:
            return self.send_fail("没有找到该订货单")

        goods_list = order.goods_list.all()

        # 从批发获取订单详情
        api = GetPifaData(self.current_user.passport_id, AuthFunc.gen_token())
        ret_dict = api.get_pf_demand_order(self.current_user.phone,
                                           order.object_id, order.id)
        if not ret_dict["success"]:
            return self.send_fail(ret_dict.get("msg", ""))
        pf_order_data = ret_dict.get("data", {})
        pf_goods_dict = {
            goods_data.get("external_id"): goods_data
            for goods_data in pf_order_data.get("demand_lines", [])
        }

        demand_goods_list = []
        for goods in goods_list:
            # 同步批发订单信息
            pf_goods = pf_goods_dict.get(goods.id)
            if not goods.syncronized and pf_goods:
                sale_record_info = pf_goods.get("sale_record_info", {})
                goods.confirmed_amount = check_int(
                    sale_record_info.get("amount", 0) * 100)
                goods.confirmed_unit = check_int(
                    sale_record_info.get("unit", 0))
                goods.price = check_int(
                    sale_record_info.get("unit_price", 0) * 100)
                goods.total_money = check_int(
                    sale_record_info.get("sales_money", 0) * 100)
                # goods.syncronized = 1

            demand_goods_list.append({
                "id":
                goods.id,
                "goods_name":
                goods.goods_name,
                "demand_amount":
                check_float(goods.demand_amount / 100),
                "demand_unit":
                goods.demand_unit,
                "remarks":
                goods.remarks,
                "confirmed_amount":
                check_float(goods.confirmed_amount / 100),
                "confirmed_unit":
                goods.confirmed_unit,
                "price":
                check_float(goods.price / 100),
                "total_money":
                check_float(goods.total_money / 100),
            })

        data = {
            "shop_id": order.object_id,
            "shop_name": order.object_name,
            "demand_date": TimeFunc.time_to_str(order.demand_date, "date"),
            "create_time": TimeFunc.time_to_str(order.create_time),
            "status": order.status,
            "total_money":
            check_float(pf_order_data.get("order_money", 0) / 100),
            "goods_list": demand_goods_list,
        }

        self.session.commit()
        return self.send_success(data=data)