Ejemplo n.º 1
0
    def login(self, account, password):
        """登录"""
        self.errmsg = {}
        if not account:
            self.errmsg['account'] = _(u'手机号码/帐号不能为空')
        if not password:
            self.errmsg['password'] = _(u'密码不能为空')
        if password and len(password) < 6 and len(password) > 20:
            self.errmsg['password'] = _(u'密码长度错误')

        if not self.errmsg:
            self.admin_user = AdminUsers.query.filter(
                AdminUsers.mobile == account).first()
            if not self.admin_user:
                self.admin_user = AdminUsers.query.filter(
                    AdminUsers.username == account).first()

            if not self.admin_user:
                self.errmsg['account'] = _(u'手机号码/帐号不存在')
            else:
                password = sha256(password.encode('utf8')).hexdigest()
                password_salt = password + self.admin_user.salt
                sha_password = sha256(password_salt.encode('utf8')).hexdigest()
                if sha_password != self.admin_user.password:
                    log_info('sha_password:%s, admin_user.password:%s' %
                             (sha_password, self.admin_user.password))
                    self.errmsg['password'] = _(u'密码错误')

        ret = (False if self.errmsg else True)
        log_info(
            u'[AuthLoginService] [login] mobile/username:%s, return:%s, errmsg:%s, admin_user:%s'
            % (account, ret, self.errmsg, self.admin_user))

        return ret
Ejemplo n.º 2
0
def image_xiao():
    "小程序上传图片"
    resjson.action_code = 11

    if not check_login():
        return resjson.print_json(resjson.NOT_LOGIN)

    #获取post过来的文件名称,从name=file参数中获取
    imageFile = request.files['file']
    prefix = request.form['prefix']

    if not prefix:
        return resjson.print_json(11, _(u'缺少前缀'))
    #判断文件类型
    fileName = imageFile.filename
    if '.' not in fileName or fileName.rsplit(
            '.', 1)[1] not in ['png', 'jpg', 'JPG', 'PNG']:
        return resjson.print_json(12, _(u'只允许上传图片'))

    #文件上传
    try:
        fus = FileUploadService()
        image = fus.save_storage(imageFile, prefix)
    except Exception as e:
        log_info(e)
        return resjson.print_json(13, _(u'上传失败,请检查云存储配置'))

    return resjson.print_json(0, u'ok', {'image': image})
Ejemplo n.º 3
0
def sms_code():
    """获取短信验证码"""
    resjson.action_code = 10

    mobile = request.form.get('mobile', '').strip()
    log_info(mobile)
    if not mobile:
        return resjson.print_json(11, _(u'请输入手机号'))

    if len(mobile) != 11:
        return resjson.print_json(12, _(u'请输入正确的手机号'))

    # 随机生成4位验证码,并session保存
    code = randomstr(4, 1)
    expire_time = current_timestamp() + 300
    sms = SmsServiceFactory.get_smsservice()
    try:
        sms.send_sms_code(mobile, code)
        # 本地缓存
        session['code_expire_time'] = expire_time
        session['code'] = code
        session['code_mobile'] = mobile
    except SmsException as e:
        log_info(e.msg)
        return resjson.print_json(12, _(u'获取验证码失败'))

    return resjson.print_json(0, u'ok')
Ejemplo n.º 4
0
def sms_template():
    """短信模版"""
    g.page_title = _(u'短信模版')

    form = SmsTemplateForm(CombinedMultiDict((request.files, request.form)))
    ss = SysSetting.query.\
        filter(SysSetting.key == 'config_sms_template').first()

    data = {}
    try:
        data = json.loads(ss.value)
    except Exception as e:
        log_info("[view.admin.config] [sms_template]:%s" % e.__str__())

    if request.method == 'GET':
        form.fill_form(data=data)
        return render_template('admin/config/sms_template.html.j2', form=form)

    if not form.validate_on_submit():
        return render_template('admin/config/sms_template.html.j2', form=form)

    data = {
        'code_tpl': form.code_tpl.data,
        'order_shipping_tpl': form.order_shipping_tpl.data
    }
    # 配置表中没该key,先添加该key
    if ss is None:
        ss = SysSetting()
        ss.key = 'config_sms_template'
        db.session.add(ss)

    ss.value = json.dumps(data)
    db.session.commit()
    return redirect(url_for('admin.index.success', title=_(u'设置短信模版配置成功')))
Ejemplo n.º 5
0
def create():
    """创建订单"""
    resjson.action_code = 12

    if not check_login():
        return resjson.print_json(resjson.NOT_LOGIN)
    uid = get_uid()

    form = request.form
    carts_id = form.get('carts_id', '[]').strip()
    ua_id = toint(form.get('ua_id', '0'))
    shipping_id = toint(form.get('shipping_id', '0'))
    coupon_id = toint(form.get('coupon_id', '0'))
    log_info(form)

    try:
        carts_id = json.loads(carts_id)
    except Exception as e:
        return resjson.print_json(resjson.PARAM_ERROR)

    try:
        order_service = OrderService(
            uid,
            1,
            user_address_id=ua_id,
            cart_id_list=carts_id,
            coupon_id=coupon_id,
            shipping_id=shipping_id)
        orderinfo = order_service.create()
    except TheonestoreException as e:
        resjson.print_json(30, e.msg)
    return resjson.print_json(0, u'ok', {'order_id': orderinfo.order_id})
Ejemplo n.º 6
0
def sms_alisms():
    """配置阿里短信"""
    g.page_title = _(u'阿里短信')

    form = SmsAlismsForm()
    alisms = SysSetting.query.\
        filter(SysSetting.key == 'config_sms_alisms').first()
    vendor = SysSetting.query.\
        filter(SysSetting.key == 'sms_vendor').first()

    data = {}
    try:
        data = json.loads(alisms.value)
    except Exception as e:
        log_info("[view.admin.config][sms_alisms]: %s " % e.__str__())

    if request.method == "GET":
        if vendor is not None:
            data['is_use'] = 1 if vendor.value == 'AliSmsService' else 0

        form.fill_form(data=data)
        return render_template('admin/config/sms_alisms.html.j2',
                               form=form,
                               data=data)

    if not form.validate_on_submit():
        return render_template('admin/config/sms_alisms.html.j2',
                               form=form,
                               data=data)

    data_ali = {
        'access_key_id': form.access_key_id.data,
        'access_key_secret': form.access_key_secret.data,
        'app_name': form.app_name.data
    }
    if alisms is None:
        alisms = SysSetting()
        alisms.key = 'config_sms_alisms'
        db.session.add(alisms)
    alisms.value = json.dumps(data_ali)

    if vendor is None:
        vendor = SysSetting()
        vendor.key = 'sms_vendor'
        db.session.add(vendor)

    if form.is_use.data:
        vendor.value = 'AliSmsService'
    elif vendor.value == 'AliSmsService':
        vendor.value = ""

    db.session.commit()
    return redirect(url_for('admin.config.sms_alisms'))
Ejemplo n.º 7
0
def storage_alioss():
    """配置阿里存储"""
    g.page_title = _(u'阿里云OSS存储')

    form = StorageAliossForm()
    aliyun = SysSetting.query.filter(
        SysSetting.key == 'config_storage_alioss').first()
    vendor = SysSetting.query.filter(
        SysSetting.key == 'storage_vendor').first()

    data = {}
    try:
        data = json.loads(aliyun.value)
    except Exception as e:
        log_info("[view.admin.config] [storage_alioss]:%s" % e.__str__())
    if request.method == "GET":
        if vendor is not None:
            data['is_use'] = 1 if vendor.value == 'aliyunoss' else 0

        form.fill_form(data=data)
        return render_template('admin/config/storage_alioss.html.j2',
                               form=form,
                               data=data)

    if not form.validate_on_submit():
        return render_template('admin/config/storage_alioss.html.j2',
                               form=form,
                               data=data)

    data = {
        'access_key_id': form.access_key_id.data,
        'access_key_secret': form.access_key_secret.data,
        'bucket_name': form.bucket_name.data,
        'endpoint': form.endpoint.data,
        'cname': form.cname.data
    }

    if aliyun is None:
        aliyun = SysSetting()
        aliyun.key = 'config_storage_alioss'
        db.session.add(aliyun)
    aliyun.value = json.dumps(data)

    data_vendor = 'aliyunoss' if form.is_use.data else ''
    if vendor is None:
        vendor = SysSetting()
        vendor.key = 'storage_vendor'
        db.session.add(vendor)
    vendor.value = data_vendor

    db.session.commit()
    return redirect(url_for('admin.config.storage_alioss'))
Ejemplo n.º 8
0
def storage_qiniu():
    """配置七牛存储"""
    g.page_title = _(u'七牛云存储')

    form = StorageQiniuForm()
    qiniu = SysSetting.query.filter(
        SysSetting.key == 'config_storage_qiniu').first()
    vendor = SysSetting.query.filter(
        SysSetting.key == 'storage_vendor').first()

    data = {}
    try:
        data = json.loads(qiniu.value)
    except Exception as e:
        log_info("[view.admin.config] [storage_qiniu]:%s" % e.__str__())
    if request.method == "GET":
        if vendor is not None:
            data['is_use'] = 1 if vendor.value == 'qiniu' else 0

        form.fill_form(data=data)
        return render_template('admin/config/storage_qiniu.html.j2',
                               form=form,
                               data=data)

    if not form.validate_on_submit():
        return render_template('admin/config/storage_qiniu.html.j2',
                               form=form,
                               data=data)

    data = {
        'access_key': form.access_key.data,
        'secret_key': form.secret_key.data,
        'bucket_name': form.bucket_name.data,
        'cname': form.cname.data
    }

    if qiniu is None:
        qiniu = SysSetting()
        qiniu.key = 'config_storage_qiniu'
        db.session.add(qiniu)
    qiniu.value = json.dumps(data)

    data_vendor = 'qiniu' if form.is_use.data else ''
    if vendor is None:
        vendor = SysSetting()
        vendor.key = 'storage_vendor'
        db.session.add(vendor)
    vendor.value = data_vendor
    db.session.commit()

    return redirect(url_for('admin.config.storage_qiniu'))
Ejemplo n.º 9
0
def shipping_100():
    """快递100"""
    g.page_title = _(u'快递100')

    form = ShippingServiceForm()
    shipping = SysSetting.query.\
        filter(SysSetting.key == 'config_shipping').first()

    vendor = SysSetting.query.\
        filter(SysSetting.key == 'shipping_vendor').first()

    data = {}
    try:
        data = json.loads(shipping.value)
    except Exception as e:
        log_info("[view.admin.config] [shipping_100]:%s" % e.__str__())

    if request.method == "GET":
        if vendor is not None:
            data[
                'is_use'] = 1 if vendor.value == 'Shipping100TrackService' else 0

        form.fill_form(data=data)
        return render_template('admin/config/shipping_100.html.j2',
                               form=form,
                               data=data)

    if not form.validate_on_submit():
        return render_template('admin/config/shipping_100.html.j2',
                               form=form,
                               data=data)

    data = {'customer': form.customer.data, 'key': form.key.data}
    if shipping is None:
        shipping = SysSetting()
        shipping.key = 'config_shipping'
        db.session.add(shipping)
    shipping.value = json.dumps(data)

    if vendor is None:
        vendor = SysSetting()
        vendor.key = 'shipping_vendor'
        db.session.add(vendor)

    if form.is_use.data:
        vendor.value = 'Shipping100TrackService'
    elif vendor.value == 'Shipping100TrackService':
        vendor.value = ""

    db.session.commit()
    return redirect(url_for('admin.config.shipping_100'))
Ejemplo n.º 10
0
def sms_yunpian():
    """配置云片短信"""
    g.page_title = _(u'云片短信')

    form = SmsYunpianForm()
    yunpian = SysSetting.query.filter(
        SysSetting.key == 'config_sms_yunpian').first()
    vendor = SysSetting.query.filter(SysSetting.key == 'sms_vendor').first()

    data = {}
    try:
        data = json.loads(yunpian.value)
    except Exception as e:
        log_info("[view.admin.config][sms_yunpian]: %s " % e.__str__())
    if request.method == "GET":
        if vendor is not None:
            data['is_use'] = 1 if vendor.value == 'YunPianSmsService' else 0

        form.fill_form(data=data)
        return render_template('admin/config/sms_yunpian.html.j2',
                               form=form,
                               data=data)

    if not form.validate_on_submit():
        return render_template('admin/config/sms_yunpian.html.j2',
                               form=form,
                               data=data)
    # 设置云片信息
    data_yunpian = {'ak': form.ak.data, 'app_name': form.app_name.data}
    if yunpian is None:
        yunpian = SysSetting()
        yunpian.key = 'config_sms_yunpian'
        db.session.add(yunpian)
    yunpian.value = json.dumps(data_yunpian)

    # 设置短信当前启用方式(云片或阿里)
    if vendor is None:
        vendor = SysSetting()
        vendor.key = 'sms_vendor'
        db.session.add(vendor)

    if form.is_use.data:
        vendor.value = 'YunPianSmsService'
    elif vendor.value == 'YunPianSmsService':
        vendor.value = ""

    db.session.commit()
    return redirect(url_for('admin.config.sms_yunpian'))
Ejemplo n.º 11
0
    def track(self, shipping_id, shipping_sn, receive_phone=''):
        """ 查询 """
        self.shipping_id = shipping_id
        self.shipping_sn = shipping_sn
        try:
            res = self._get_track_response()
        except ShippingException as e:
            log_info(u'[Shipping100TrackService] [Error]  shipping_code:%s, shipping_sn:%s, ShippingException:%s' % (self.shipping.shipping_code, self.shipping_sn, e))
            raise e

        resjson = res.json()
        if resjson['message'] != 'ok':
            log_info(u'[Shipping100TrackService] [Error]  shipping_code:%s, shipping_sn:%s, response message:%s' % (self.shipping.shipping_code, self.shipping_sn, resjson['message']))
            raise ShippingException(_(u'查询失败'))

        return resjson['data']
Ejemplo n.º 12
0
def info_base():
    """基本信息"""
    g.page_title = _(u'基本信息')

    form = InfoBaseForm(CombinedMultiDict((request.files, request.form)))
    ss = SysSetting.query.filter(SysSetting.key == 'config_info_base').first()

    data = {}
    try:
        data = json.loads(ss.value)
    except Exception as e:
        log_info("[view.admin.config] [info_base]:%s" % e.__str__())

    if request.method == 'GET':
        form.fill_form(data=data)
        return render_template('admin/config/info_base.html.j2', form=form)

    if not form.validate_on_submit():
        return render_template('admin/config/info_base.html.j2', form=form)

    # 校验图片上传
    app_logo = ''
    if form.app_logo.data:
        fus = FileUploadService()
        try:
            app_logo = fus.save_storage(form.app_logo.data, 'applogo')
        except Exception as e:
            form.app_logo.errors = (_(u'上传失败,请检查云存储配置'))
            return render_template('admin/config/info_base.html.j2', form=form)
    app_logo = app_logo if app_logo else data.get('app_logo', '')
    data = {
        'app_name': form.app_name.data,
        'app_logo': app_logo,
        'app_recommend': form.app_recommend.data
    }
    # 配置表中没该key,先添加该key
    if ss is None:
        ss = SysSetting()
        ss.key = 'config_info_base'
        db.session.add(ss)

    ss.value = json.dumps(data)
    db.session.commit()
    return redirect(url_for('admin.index.success', title=_(u'设置基本信息成功')))
Ejemplo n.º 13
0
    def _get_req_params(self):
        # 顺丰需要发件人或收件人手机号后4位
        receiverPhone = ''
        if self.shipping.aggreate_code == 'sf':
            if self.receive_phone is None:
                raise ShippingException(_(u'查询失败,缺少收件人手机号'))

            if len(self.receive_phone) < 11:
                raise ShippingException(_(u'查询失败,收件人手机号错误'))

            receiverPhone = self.receive_phone[-4:]
            log_info(u'[ShippingAggreateTrackService] [info] receiverPhone: %s' % receiverPhone)

        return {
            'com': self.shipping.aggreate_code,
            'no': self.shipping_sn,
            'key': self.shipping_config['key'],
            'dtype': 'json',
            'receiverPhone': receiverPhone,
        }
Ejemplo n.º 14
0
def index():
    """购物车"""
    resjson.action_code = 10

    uid = get_uid()
    session_id = session.sid
    is_login = 1 if uid else 0

    cs = CartService(uid, session_id)
    cs.check()
    log_info(cs)
    data = {
        'is_login': is_login,
        'carts': cs.carts,
        'cart_total': cs.cart_total,
        'cart_amount': cs.cart_amount,
        'items_amount': cs.items_amount,
        'items_quantity': cs.items_quantity
    }
    return resjson.print_json(0, u'ok', data)
Ejemplo n.º 15
0
    def _get_track_response(self):
        """获取跟踪数据"""
        try:
            self._init_()
            self._check_req_params()
            data = self._get_req_params()

        except ShippingException as e:
            raise e

        try:
            res = requests.post(self.apiurl, data, timeout=10)
        except Exception as e:
            log_info('[TrackService] [Error] NetWorkException. %s, %s' % (self.apiurl, data))
            raise ShippingException(_(u'查询失败,网络异常!'))

        res.encoding = 'utf-8'
        if res.status_code != 200:
            raise ShippingException(u'查询失败,网络状态为%d' % res.status_code)
        return res
Ejemplo n.º 16
0
    def _do_sms_service(self):
        """发送短信"""

        request_params = self._get_send_params()
        request = CommonRequest()
        request.set_accept_format('json')
        request.set_domain('dysmsapi.aliyuncs.com')
        request.set_method('POST')
        request.set_protocol_type('https')  # https | http
        request.set_version('2017-05-25')
        request.add_query_param('TemplateCode', self.template_id)
        if self.send_type != self.type_list[2]:
            request.set_action_name('SendSms')
            request.add_query_param('PhoneNumbers',
                                    request_params['PhoneNumbers'])
            request.add_query_param('SignName', request_params['SignName'])
            request.add_query_param('TemplateParam',
                                    request_params['TemplateParam'])
        else:
            request.set_action_name('SendBatchSms')
            request.add_query_param('PhoneNumberJson',
                                    request_params['PhoneNumberJson'])
            request.add_query_param('SignNameJson',
                                    request_params['SignNameJson'])
            request.add_query_param('TemplateParamJson',
                                    request_params['TemplateParamJson'])

        res = self.client.do_action(request)
        try:
            data = json.loads(res)
        except Exception as e:
            raise SmsException(_(u"发送失败"))

        if not data or data['Code'] != 'OK':
            log_info(
                '[AliSmsService]send_type:%s,code:%s,msg:%s,data:%s,prefix:%s'
                % (self.send_type, data['Code'], data['Message'], data,
                   self.sms_prefix))
            raise SmsException(_(u"发送失败"))
Ejemplo n.º 17
0
    def _do_sms_service(self):
        """发送短信"""

        reqest_param = self._get_send_params()
        log_info(reqest_param)
        if self.send_type == self.type_list[0]:
            res = self.client.sms().tpl_single_send(reqest_param)

        if self.send_type == self.type_list[1]:
            res = self.client.sms().tpl_batch_send(reqest_param)

        if self.send_type == self.type_list[2]:
            res = self.client.sms().multi_send(reqest_param)

        if res is None:
            raise SmsException(_(u'发送失败'))
        if res.code() != 0:
            log_info(
                '[YunPianSmsService]send_type:%s,code:%s,msg:%s,data:%s,prefix:%s'
                % (self.send_type, str(res.code()), res.msg(),
                   (res.data() if res.data() else u'[]'), self.sms_prefix))
            raise SmsException(_(u'发送失败'))
Ejemplo n.º 18
0
    def unifiedorder(self):
        """统一下单"""

        # 检查
        if not self.__check():
            return False

        # 设置创建签名参数
        self.__set_sign_params()

        # 请求下单
        url = 'https://api.mch.weixin.qq.com/pay/unifiedorder'
        xml = self.__get_prepay_xml()
        log_info(xml)
        xml = xml.encode('utf8')
        headers = {'Content-Type': 'application/xml; charset=utf-8'}
        respone = requests.post(url, data=xml, headers=headers)

        # 下单结果
        doc = ElementTree.fromstring(respone.content)
        return_code = doc.findtext('return_code')
        return_msg = doc.findtext('return_msg')
        result_code = doc.findtext('result_code')
        err_code = doc.findtext('err_code')
        err_code_des = doc.findtext('err_code_des')
        self.prepay_id = doc.findtext('prepay_id')
        self.code_url = doc.findtext('code_url')

        # 下单结果
        if return_code != 'SUCCESS':
            self.msg = return_msg
            return False

        # 下单结果
        if result_code != 'SUCCESS':
            self.msg = _(u'错误代码:%s  错误代码描述:%s' % (err_code, err_code_des))
            return False

        return True
Ejemplo n.º 19
0
def index():
    """ 我的钱包 """

    resjson.action_code = 10

    if not check_login():
        return resjson.print_json(resjson.NOT_LOGIN)
    uid = get_uid()

    args = request.args
    p = toint(args.get('p', '1'))
    ps = toint(args.get('ps', '10'))

    if p <= 0 or ps <= 0:
        return resjson.print_json(resjson.PARAM_ERROR)

    funds = Funds.query.filter(Funds.uid == uid).first()
    _data = FundsStaticMethodsService.details(uid, request.args.to_dict())

    data = {'funds': funds, 'details': _data['details']}
    log_info(data)
    return resjson.print_json(0, _(u'ok'), data)
Ejemplo n.º 20
0
def ueditor():
    """ueditor上传"""
    res = current_app.response_class(mimetype='application/json')
    # res = make_response(mimetype='application/json')
    action = request.args.get('action')

    if action == 'config':
        # 解析JSON格式的配置文件
        # 这里使用PHP版本自带的config.json文件
        config_filename = os.path.join(current_app.static_folder, 'default',
                                       'admin', 'plugins', 'ue', 'config.json')
        with open(config_filename) as fp:
            data = fp.read()
            CONFIG = json.loads(re.sub(r'\/\*.*\*\/', '', data))
            # log_info('##########:%s' % CONFIG)
            res.data = json.dumps(CONFIG)

        log_info('-----------------')
        return res

    # 获取上传文件
    upfile = request.files['upfile']

    try:
        fus = FileUploadService()
        image = fus.save_storage(upfile, 'ueditor')
    except Exception as e:
        return json.dumps({'state': 'FAIL'})

    data = {
        'state': 'SUCCESS',
        'source': image,
        'url': image,
        'title': image,
        'original': image
    }
    res.data = json.dumps(data)
    return res
Ejemplo n.º 21
0
def reset_password():
    """重置密码"""

    resjson.action_code = 11

    mobile = session.get('code_mobile', '')
    expire_time = session.get('code_expire_time', 0)
    key_code = session.get('code', '')

    form = request.form
    new_password = form.get('new_password', '').strip()
    again_password = form.get('again_password', '').strip()
    code = form.get('code', '').strip()

    admin_user = AdminUsers.query.filter(AdminUsers.mobile == mobile).first()
    try:
        if not admin_user:
            raise TheonestoreException(_(u'用户不存在'))
        if new_password != again_password:
            raise TheonestoreException(_(u'密码不一致'))
        if expire_time < current_timestamp():
            raise TheonestoreException(_(u'验证码已过期'))
        if key_code != code:
            raise TheonestoreException(_(u'验证码不正确'))
    except TheonestoreException as e:
        log_info(e.msg)
        return resjson.print_json(12, e.msg)

    sha256_password = sha256(new_password.encode('utf8')).hexdigest()
    admin_user.password = sha256((sha256_password+admin_user.salt).encode('utf8')).hexdigest()
    log_info(admin_user.password)
    db.session.commit()

    session['code_expire_time'] = None
    session['code'] = None
    session['code_mobile'] = None

    return resjson.print_json(0, u'ok')
Ejemplo n.º 22
0
def aftersales_service():
    """售后服务"""
    g.page_title = _(u'售后服务')

    form = AftersalesServiceForm()
    ss = SysSetting.query.filter(
        SysSetting.key == 'config_aftersales_service').first()

    data = {}
    try:
        data = json.loads(ss.value)
    except Exception as e:
        log_info("[view.admin.config] [aftersales_service]:%s" % e.__str__())

    if request.method == 'GET':
        form.fill_form(data=data)
        return render_template('admin/config/aftersales_service.html.j2',
                               form=form)

    if not form.validate_on_submit():
        return render_template('admin/config/aftersales_service.html.j2',
                               form=form)

    data = {
        'consignee_name': form.consignee_name.data,
        'consignee_mobile': form.consignee_mobile.data,
        'consignee_address': form.consignee_address.data
    }

    if ss is None:
        ss = SysSetting()
        ss.key = 'config_aftersales_service'
        db.session.add(ss)
    ss.value = json.dumps(data)

    db.session.commit()
    return redirect(url_for('admin.index.success', title=_(u'设置售后地址成功')))
Ejemplo n.º 23
0
    def track(self, shipping_id, shipping_sn, receive_phone=''):
        """查询"""
        self.shipping_id = shipping_id
        self.shipping_sn = shipping_sn
        self.receive_phone = receive_phone
        try:
            res = self._get_track_response()
        except ShippingException as e:
            log_info(u'[ShippingAggreateTrackService] [Error]  shipping_code:%s, shipping_sn:%s, ShippingException:%s' % (self.shipping.shipping_code, self.shipping_sn, e))
            raise e

        resjson = res.json()
        if resjson['error_code'] != 0 or not resjson['result']:
            log_info(u'[ShippingAggreateTrackService] [Error]  shipping_code:%s, shipping_sn:%s, response error_code:%s' % (self.shipping.shipping_code, self.shipping_sn, resjson['error_code']))
            raise ShippingException(_(u'查询失败'))

        _track_list = resjson['result']['list']
        track_list = [{
                'time': item['datetime'],
                'ftime': item['datetime'],
                'context': item['remark']
            } for item in _track_list]
        track_list.reverse()
        return track_list
Ejemplo n.º 24
0
    def paid(self):
        """已付款业务处理"""

        pay_tran_id = self.kwargs.get('pay_tran_id', '')
        pay_method = self.kwargs.get('pay_method', '')
        paid_time = self.kwargs.get('paid_time', self.current_time)
        paid_amount = Decimal(self.kwargs.get('paid_amount', '0.00'))

        log_info('[PaidService] tran_id:%s paid_amount:%.2f' % (
            self.tran_id, paid_amount))

        # 检查 - 交易
        tran = OrderTran.query.get(self.tran_id)
        if not tran:
            log_info(
                '[PaidService] not found tran: tran_id:%s' % self.tran_id)
            raise OrderException(_(u'找不到订单'))

        # 检查 - 订单
        order_id_list = json.loads(tran.order_id_list)
        order_list = Order.query.filter(
            Order.order_id.in_(order_id_list)).all()
        if not order_list:
            log_info(
              '[PaidService] not found order list: tran_id:%s' % self.tran_id)
            raise OrderException(_(u'找不到订单'))

        # 检查 - 是否已经处理过
        if tran.pay_status == 2:
            log_info('[PaidService] do already: tran_id:%s' % self.tran_id)
            return tran

        # 更新交易
        model_update(
            tran, {
                'pay_status': 2,
                'pay_method': pay_method,
                'paid_time': paid_time})

        # 更新交易 - 支付流水号
        if pay_tran_id:
            model_update(tran, {'pay_tran_id': pay_tran_id})

        # 提交交易事务
        db.session.commit()

        # 遍历更新订单及订单商品等
        for order in order_list:
            order_id = order.order_id

            # 更新订单
            data = {
                'tran_id': self.tran_id,
                'pay_method': tran.pay_method,
                'pay_status': 2,
                'pay_tran_id': tran.pay_tran_id,
                'paid_time': paid_time,
                'paid_amount': order.pay_amount,
                'update_time': paid_time}

            # 普通订单
            if order.order_type == 1:
                # 订单商品列表
                og_list = OrderGoods.query.filter(
                    OrderGoods.order_id == order_id).all()
                for og in og_list:
                    goods = Goods.query.get(og.goods_id)
                    if goods:
                        # 销量
                        sale_count = goods.sale_count + og.goods_quantity

                        # 库存
                        stock_quantity = goods.stock_quantity - og.goods_quantity

                        # 更新商品
                        model_update(
                            goods, {
                                'sale_count': sale_count,
                                'stock_quantity': stock_quantity})

                # 更新订单
                data['shipping_status'] = 1

            # 充值订单
            if order.order_type == 2:
                # 更新余额 - 充值 - 检查
                remark_user = _(u'充值成功')
                remark_sys = _(u'充值: 订单ID:%s 支付方式:%s 第三方支付流水号:%s' %
                               (order_id, tran.pay_method, tran.pay_tran_id))
                fs = FundsService(
                    order.uid,
                    order.goods_amount,
                    1,
                    1,
                    self.tran_id,
                    remark_user,
                    remark_sys,
                    paid_time)
                if not fs.check():
                    log_error(
                        '[FundsServiceError01]  remark_sys:%s' % remark_sys)
                    continue

                # 更新余额 - 充值
                fs.update()

            model_update(order, data)

            # 站内消息
            if order.order_type == 1:
                content = _(u'您的订单%s已支付,我们会尽快发货。' % order.order_sn)
                mcs = MessageCreateService(
                    1,
                    order.uid,
                    -1, content,
                    ttype=1,
                    tid=order_id,
                    current_time=self.current_time)
                if not mcs.check():
                    log_error('order_id:%s msg:%s' % (order_id, mcs.msg))
                else:
                    mcs.do()

            # 提交订单事务
            db.session.commit()

            # 微信消息
            if order.order_type == 2:
                WeixinMessageStaticMethodsService.recharge(order)
            else:
                WeixinMessageStaticMethodsService.paid(order)

        return True