def bind_ok(openid, is_first_bind): weixin_user = WeixinUser.objects.get(openid=openid) now_str = datetime.datetime.now().strftime('%Y年%m月%d日') user = weixin_user.user if is_first_bind: from wanglibao_activity.tasks import check_activity_task check_activity_task.apply_async(kwargs={ "user_id": user.id, "trigger_node": 'first_bind_weixin', "device_type": 'weixin', "is_first_bind": is_first_bind, }, queue='celery02') # check_activity(user, 'first_bind_weixin', "weixin", is_first_bind=is_first_bind) else: sentTemplate.apply_async(kwargs={ "kwargs": json.dumps({ "openid": weixin_user.openid, "template_id": BIND_SUCCESS_TEMPLATE_ID, "name1": "", "name2": user.wanglibaouserprofile.phone, "time": now_str, }) }, queue='celery02')
def post(self, request, **kwargs): pk = kwargs['id'] p2p = P2PProduct.objects.select_related('activity__rule').get(pk=pk) ProductKeeper(p2p).audit(request.user) if p2p.activity: send_task("wanglibao_p2p.tasks.build_earning", kwargs={ "product_id": pk }) send_task("marketing.tools.calc_broker_commission", kwargs={ "product_id": pk }) # 满标审核时检测活动规则 # activity_backends.check_activity(request.user, 'p2p_audit', 'all', 0, pk) check_activity_task.apply_async(kwargs={ "user_id": request.user.id, "trigger_node": 'p2p_audit', "device_type": 'all', "product_id": pk, }, queue='celery02') return HttpResponseRedirect('/' + settings.ADMIN_ADDRESS + '/wanglibao_p2p/p2pproduct/')
def decide_first(user_id, amount, device, order_id, product_id=0, is_full=False, product_balance_after=0, ylb_period=0): # fix@chenweibi, add order_id user = User.objects.filter(id=user_id).first() amount = long(amount) device_type = device['device_type'] introduced_by = IntroducedBy.objects.filter(user=user).first() if introduced_by and introduced_by.bought_at is None: introduced_by.bought_at = timezone.now() introduced_by.save() # 活动检测 # activity_backends.check_activity(user, 'invest', device_type, amount, product_id, order_id, is_full) check_activity_task.apply_async(kwargs={ "user_id": user.id, "trigger_node": 'invest', "device_type": device_type, "amount": amount, "product_id": product_id, "order_id": order_id, "is_full": is_full, "ylb_period": ylb_period }, queue='celery02') # fix@chenweibi, add order_id try: utils.log_clientinfo(device, "buy", user_id, order_id, amount) except Exception: pass # 发送红包 # send_lottery.apply_async((user_id,)) #processMarchAwardAfterP2pBuy() #八月照相馆活动 try: processAugustAwardZhaoXiangGuan(user, product_id, order_id, amount) except Exception: logger.error('影像投资节优惠码发送失败') pass # 往数据中心发送投资信息数据 if settings.SEND_PHP_ON_OR_OFF: send_investment_data.apply_async(kwargs={ "user_id": user_id, "amount": amount, "device_type": device_type, "order_id": order_id, "product_id": product_id, }, queue='celery02') try: checkUpdateHmdRanks(product_id) except Exception, e: logger.error(traceback.format_exc())
def deposit_ok(user_id, amount, device, order_id): # fix@chenweibi, add order_id try: try: # 支持通过字典传递完整的device信息或是通过str直接传device_type if isinstance(device, dict): device_type = device['device_type'] elif isinstance(device, str) or isinstance(device, unicode): assert device in ['pc', 'ios', 'android'] device_type = device else: raise except: device_type = u'pc' logger.exception("=deposit_ok= Failed to get device_type") title, content = messages.msg_pay_ok(amount) inside_message.send_one.apply_async(kwargs={ "user_id": user_id, "title": title, "content": content, "mtype": "pay" }) user = User.objects.get(id=user_id) user_profile = user.wanglibaouserprofile # activity_backends.check_activity(user, 'recharge', device_type, # amount, **{'order_id': order_id}) check_activity_task.apply_async(kwargs={ "user_id": user.id, "trigger_node": 'recharge', "device_type": device_type, "amount": amount, "order_id": order_id, }, queue='celery02') try: # Add by hb on 2015-12-18 : add return value flag = utils.log_clientinfo(device, "deposit", user_id, order_id, amount) if not flag: raise Exception("Failed to log_clientinfo") except Exception, ex: logger.exception("=20151218= [%s] [%s] [%s] [%s] [%s]" % (ex, device, user_id, order_id, amount)) pass send_messages.apply_async( kwargs={ 'phones': [user_profile.phone], 'messages': [messages.deposit_succeed(user_profile.name, amount)] }) weixin_user = WeixinUser.objects.filter(user=user).first() # 亲爱的满先生,您的充值已成功 # {{first.DATA}} 充值时间:{{keyword1.DATA}} 充值金额:{{keyword2.DATA}} 可用余额:{{keyword3.DATA}} {{remark.DATA}} if weixin_user: deposit_ok_time = datetime.datetime.now().strftime( '%Y年%m月%d日 %H:%M:%S') margin = Margin.objects.filter(user=user).first() sentTemplate.apply_async(kwargs={ "kwargs": json.dumps({ "openid": weixin_user.openid, "template_id": DEPOSIT_SUCCESS_TEMPLATE_ID, "first": u"亲爱的%s,您的充值已成功" % user_profile.name, "keyword1": deposit_ok_time, "keyword2": "%s 元" % str(amount), "keyword3": "%s 元" % str(margin.margin), }) }, queue='celery02') logger.info('=deposit_ok= Success: [%s], [%s], [%s]' % (user_profile.phone, order_id, amount))
except Exception, reason: print reason pass title, content = messages.msg_register() inside_message.send_one.apply_async( kwargs={ "user_id": user_id, "title": title, "content": content, "mtype": "activityintro" }) # 活动检测 # activity_backends.check_activity(user, 'register', device_type) check_activity_task.apply_async(kwargs={ "user_id": user.id, "trigger_node": 'register', "device_type": device_type, }, queue='celery02') try: utils.log_clientinfo(device, "register", user_id) except Exception: pass # 往数据中心发送注册信息数据 if settings.SEND_PHP_ON_OR_OFF: send_register_data.apply_async(kwargs={ "user_id": user_id, "device_type": device_type, }, queue='celery02')
def amortize(self, amortization, savepoint=True): with transaction.atomic(savepoint=savepoint): if amortization.settled: raise P2PException('amortization %s already settled.' % amortization) sub_amortizations = amortization.subs.all() description = unicode(amortization) catalog = u'分期还款' product = amortization.product matches = re.search(u'日计息', product.pay_method) if matches and matches.group(): pname = u"%s,期限%s天" % (product.name, product.period) else: pname = u"%s,期限%s个月" % (product.name, product.period) phone_list = list() message_list = list() settled_sub_amos = list() for sub_amo in sub_amortizations: user_margin_keeper = MarginKeeper(sub_amo.user) user_margin_keeper.amortize(sub_amo.principal, sub_amo.interest, sub_amo.penal_interest, sub_amo.coupon_interest, savepoint=False, description=description) sub_amo.settled = True sub_amo.settlement_time = timezone.now() sub_amo.save() amo_amount = sub_amo.principal + sub_amo.interest + sub_amo.penal_interest + sub_amo.coupon_interest # 加入重复回款的用户还需要扣回的金额及扣款操作 try: repeat_user = RepeatPaymentUser.objects.select_for_update()\ .filter(user_id=sub_amo.user.id, amount__gt=0).first() if repeat_user: repeat_amount = repeat_user.amount # if repeat_amount > 0: # 判断是否每天从回款中扣款 is_every_day = True if not repeat_user.is_every_day: product_ids = repeat_user.product_ids.split(',') product_ids = [ int(p_id) for p_id in product_ids if p_id.strip() != '' ] # 判断当期还款的产品id是否在用户新购标的id中, 不在说明该标不用扣款 if product.id not in product_ids: is_every_day = False if is_every_day: # 判断剩余应扣金额是否大于等于本期回款本息之合, 大于等于,则扣本息,否则扣剩余应扣金额 if repeat_amount >= amo_amount: reduce_amount = amo_amount reduce_amount_current = repeat_amount - amo_amount # 剩余应扣金额-本次扣除的本息之合 else: reduce_amount = repeat_amount reduce_amount_current = 0 print( "repeat_amount: %s, amo_amount: %s, type1:%s, type2:%s" % (repeat_amount, amo_amount, type(repeat_amount), type(amo_amount))) # 减账户余额 user_margin_keeper.reduce_margin( reduce_amount, u'系统重复回款扣回%s元' % reduce_amount) # 更新剩余应扣金额 repeat_user.amount = reduce_amount_current repeat_user.save() # 记录扣款流水 repeat_record = RepeatPaymentUserRecords( user_id=sub_amo.user.id, name=sub_amo.user.wanglibaouserprofile.name, phone=sub_amo.user.wanglibaouserprofile.phone, amount=reduce_amount, amount_current=reduce_amount_current, description=description) repeat_record.save() except Exception: logger.exception('err') logger.error("用户扣款失败,用户id:[%s], 回款本息合计:[%s]" % (sub_amo.user, amo_amount)) pass try: phone_list.append(sub_amo.user.wanglibaouserprofile.phone) message_list.append( messages.product_amortize( sub_amo.user.wanglibaouserprofile.name, amortization.product, # sub_amo.settlement_time, amo_amount)) title, content = messages.msg_bid_amortize( pname, timezone.now(), amo_amount) inside_message.send_one.apply_async( kwargs={ "user_id": sub_amo.user.id, "title": title, "content": content, "mtype": "amortize" }) except: logger.debug("") self.__tracer(catalog, sub_amo.user, sub_amo.principal, sub_amo.interest, sub_amo.penal_interest, amortization, description, sub_amo.coupon_interest) # 标的每一期还款完成后,检测该用户还款的本金是否有符合活动的规则,有的话触发活动规则 try: if sub_amo.principal > 0: # activity_backends.check_activity(sub_amo.user, 'repaid', 'pc', sub_amo.principal, product.id) check_activity_task.apply_async(kwargs={ "user_id": sub_amo.user.id, "trigger_node": 'repaid', "device_type": 'pc', "amount": sub_amo.principal, "product_id": product.id, }, queue='celery02') except Exception: logger.debug( "check activity on repaid, user: {}, principal: {}, product_id: {}" .format(sub_amo.user.id, sub_amo.principal, product.id)) try: weixin_user = WeixinUser.objects.filter( user=sub_amo.user).first() if weixin_user and weixin_user.subscribe: now = datetime.now().strftime('%Y年%m月%d日 %H:%M:%S') sentTemplate.apply_async(kwargs={ "kwargs": json.dumps({ "openid": weixin_user.openid, "template_id": PRODUCT_AMORTIZATION_TEMPLATE_ID, "keyword1": product.name, "keyword2": "%s 元" % str(amo_amount), "keyword3": now, }) }, queue='celery02') except Exception, e: logger.debug( ">>>> weixin msg send err, user_id:[%s], [%s] " % sub_amo.user.id, e) pass # 添加还款用户到渠道通知列表 @chenwb try: settled_sub_amos.append({ 'id': sub_amo.id, 'user': sub_amo.user.id, 'product': product.id, 'term': sub_amo.term, 'settled': sub_amo.settled, 'term_date': sub_amo.term_date.strftime('%Y-%m-%d %H:%M:%S'), 'settlement_time': sub_amo.settlement_time.strftime('%Y-%m-%d %H:%M:%S'), 'principal': float(sub_amo.principal), 'interest': float(sub_amo.interest), 'penal_interest': float(sub_amo.penal_interest), 'coupon_interest': float(sub_amo.coupon_interest), 'description': sub_amo.description, }) except: pass amortization.settled = True amortization.save() catalog = u'还款入账' send_messages.apply_async(kwargs={ "phones": phone_list, "messages": message_list }) self.__tracer(catalog, None, amortization.principal, amortization.interest, amortization.penal_interest, amortization) # 向渠道中心发送还款用户列表通知 @chenwb # Comment by hb on 2016-05-13 try: if settled_sub_amos: from .tasks import coop_amortizations_push coop_amortizations_push.apply_async(kwargs={ 'amortizations': settled_sub_amos, 'product_id': product.id, 'amo_act': 'amortize' }, queue='celery02') except: pass
def prepayment(self, penal_interest, repayment_type, payment_date, savepoint=True): """ #1. 拿到当期未还款计划 #1.11 如果是按期提前还款 #1.12 利息 = 当期利息 #1.21 如果是按日提前还款 #1.22 利息 = 年利率/360*计息天数*本金 #2. 拿到此标的年华收益 #3. 计算日收益 #4. 计算当期未计息天数 """ pname = '' amortization_records_tmp = list() phone_list = list() message_list = list() with transaction.atomic(savepoint=savepoint): amortization = ProductAmortization.objects.select_for_update().get(id=self.amortization.id) if amortization.settled: raise PrepaymentException() # 1.生成产品提前还款记录 # amortization = self.amortization product_record = self.get_product_repayment(penal_interest, repayment_type, payment_date) order_id = OrderHelper.place_order(None, order_type=self.catalog, product_id=self.product.id, status=u'新建').id product_record.order_id = order_id amortization_records = list() # 用户还款计划 user_amortizations = amortization.subs.all().select_related('user__wanglibaouserprofile') product = amortization.product import re matches = re.search(u'日计息', product.pay_method) if matches and matches.group(): pname = u"%s,期限%s天" % (product.name, product.period) else: pname = u"%s,期限%s个月" % (product.name, product.period) for user_amortization in user_amortizations: logger.error("提前还款用户: [%s], [%s]" % (user_amortization.user.id, user_amortization.user.wanglibaouserprofile.phone)) # 计算最终计算提前还款的本金, 利息, 罚息, 加息 user_record = self.get_user_repayment(user_amortization, penal_interest, repayment_type, payment_date) logger.error("新的本金: [%s], 利息:[%s], 加息:[%s], repayment_type:[%s], payment_date:[%s]" % ( user_record.principal, user_record.interest, user_record.coupon_interest, repayment_type, payment_date)) user_margin_keeper = MarginKeeper(user_record.user) # 提前还款需要将加息金额还给用户(重新计算后的该用户所用加息券的加息金额) user_margin_keeper.amortize(user_record.principal, user_record.interest, user_record.penal_interest, user_record.coupon_interest, savepoint=False, description=self.description) order_id = OrderHelper.place_order(user_record.user, order_type=self.catalog, product_id=self.product.id, status=u'新建').id user_record.order_id = order_id user_record.amortization = amortization amortization_records.append(user_record) amortization_records_tmp.append(user_record) # 发消息临时list变量(不包含product_record) logger.error("order_id: %s" % order_id) amortization_records.append(product_record) AmortizationRecord.objects.bulk_create(amortization_records) ProductAmortization.objects.filter(product=self.product, settled=False)\ .update(settled=True, settlement_time=timezone.now()) UserAmortization.objects.filter(product_amortization__product=self.product, settled=False)\ .update(settled=True, settlement_time=timezone.now()) ProductKeeper(self.product).finish(None) # 将提前还款的消息发送放到事务外边 for user_record in amortization_records_tmp: try: # 提前还款短信 # 提前还款金额 = 本金 + 利息 + 罚息 + 加息 amo_amount = user_record.principal + user_record.interest + \ user_record.penal_interest + user_record.coupon_interest user = user_record.user user_profile = user.wanglibaouserprofile phone_list.append(user_profile.phone) message_list.append(messages.product_prepayment(user_profile.name, amortization.product, amo_amount)) # 标的每一期还款完成后,检测该用户还款的本金是否有符合活动的规则,有的话触发活动规则 try: if user_record.principal > 0: # activity_backends.check_activity(user, 'repaid', 'pc', user_record.principal, product.id) check_activity_task.apply_async(kwargs={ "user_id": user.id, "trigger_node": 'repaid', "device_type": 'pc', "amount": user_record.principal, "product_id": product.id }, queue='celery02') except Exception: logger.exception("==提前还款==活动检测==") logger.debug("提前还款, user: {}, principal: {}, product_id: {}".format( user, user_record.principal, product.id )) try: # 提前还款站内信 title, content = messages.msg_bid_prepayment(pname, timezone.now(), amo_amount) inside_message.send_one.apply_async(kwargs={ "user_id": user.id, "title": title, "content": content, "mtype": "amortize" }) except Exception, e: logger.exception("==提前还款==站内信==") logger.debug(("user:%s====提前还款==站内信==" % user.id) + traceback.format_exc()) try: weixin_user = WeixinUser.objects.filter(user=user).first() if weixin_user and weixin_user.subscribe: now = datetime.now().strftime('%Y年%m月%d日 %H:%M:%S') sentTemplate.apply_async(kwargs={ "kwargs": json.dumps({ "openid": weixin_user.openid, "template_id": PRODUCT_AMORTIZATION_TEMPLATE_ID, "keyword1": product.name, "keyword2": "%s 元" % str(amo_amount), "keyword3": now, }) }, queue='celery02') except Exception, e: logger.exception("==提前还款==微信模板==") logger.debug(("user:%s====提前还款==微信模板==" % user.id) + traceback.format_exc())