diff --git a/planet/config/enums.py b/planet/config/enums.py index 2a1345e5..da9c9f09 100644 --- a/planet/config/enums.py +++ b/planet/config/enums.py @@ -808,7 +808,7 @@ class PlayPayType(Enum): class TemplateID(Enum): """小程序模板id""" - enter = 'enter', 'Q1x_k7hWf2bj4Wfn3aWzsmY3-ij-gtDgdcOjzBTjYtQ' + enter = 'enter', 's3OkZQ1Q28VGtqdehYWq46TVj7eTasc8uluJJDoxxKA' cancel = 'cancel', 's3OkZQ1Q28VGtqdehYWq46TVj7eTasc8uluJJDoxxKA' gather = 'gather', 's3OkZQ1Q28VGtqdehYWq46TVj7eTasc8uluJJDoxxKA' activity = 'activity', 's3OkZQ1Q28VGtqdehYWq46TVj7eTasc8uluJJDoxxKA' diff --git a/planet/control/CPlay.py b/planet/control/CPlay.py index 5a24eb2d..19808053 100644 --- a/planet/control/CPlay.py +++ b/planet/control/CPlay.py @@ -19,7 +19,7 @@ binded_phone from planet.config.enums import PlayStatus, EnterCostType, EnterLogStatus, PayType, Client, OrderFrom, SigninLogStatus, \ - CollectionType, CollectStatus, MiniUserGrade, ApplyStatus, MakeOverStatus, PlayPayType + CollectionType, CollectStatus, MiniUserGrade, ApplyStatus, MakeOverStatus, PlayPayType, TemplateID from planet.common.Inforsend import SendSMS @@ -33,7 +33,7 @@ from planet.extensions.weixin.pay import WeixinPayError from planet.models import Cost, Insurance, Play, PlayRequire, EnterLog, EnterCost, User, Gather, SignInSet, SignInLog, \ HelpRecord, UserCollectionLog, Notice, UserLocation, UserWallet, CancelApply, PlayDiscount, Agreement, MakeOver, \ - SuccessorSearchLog, PlayPay, SharingParameters, UserInvitation + SuccessorSearchLog, PlayPay, TemplateFormId, SharingParameters, UserInvitation class CPlay(): @@ -629,6 +629,7 @@ def get_params(self): def wechat_notify(self, **kwargs): """微信支付回调接口""" redirect = kwargs.get('redirect') + formid = kwargs.get('formid') with db.auto_commit(): if not redirect: data = self.wx_pay.to_dict(request.data) @@ -656,7 +657,7 @@ def wechat_notify(self, **kwargs): }) db.session.add(pp) if pp.PPpayType == PlayPayType.enterlog.value: - self._enter_log(pp) + self._enter_log(pp, formid=formid) elif pp.PPpayType == PlayPayType.undertake.value: current_app.logger.info('开始修改转让单') self._undertake(pp) @@ -1016,10 +1017,7 @@ def set_gather(self): @phone_required def join(self): data = parameter_required(('plid',)) - plid = data.get('plid') - elid = data.get('elid') - repay = data.get('repay') - + plid, elid, repay, formid = data.get('plid'), data.get('elid'), data.get('repay'), data.get('formid') opayno = self._opayno() play = Play.query.filter_by(PLid=plid, isdelete=False).first_('活动已删除') user = get_current_user() @@ -1107,7 +1105,7 @@ def join(self): redirect = False if mount_price == Decimal('0'): redirect = True - pay_args = self._add_pay_detail(opayno=opayno, redirect=redirect, + pay_args = self._add_pay_detail(opayno=opayno, redirect=redirect, formid=formid, body=body, PPpayMount=mount_price, openid=openid, PPcontent=elid, PPpayType=PlayPayType.enterlog.value) @@ -1438,9 +1436,6 @@ def payment(self): } return Success(data=response) - # def recreate(self): - # - """内部方法""" def _fill_user(self, model, usid, error_msg=None, realname=False): @@ -1885,8 +1880,10 @@ def _fill_location(self, location, isleader=False, realname=False): location.fill('isleader', isleader) def _add_pay_detail(self, **kwargs): + # tf = None with db.auto_commit(): mountprice = kwargs.get('PPpayMount') + fromid = kwargs.get('fromid') if Decimal(str(mountprice)) <= Decimal('0'): # mountprice = Decimal('0.01') mountprice = Decimal('0.00') @@ -1898,11 +1895,25 @@ def _add_pay_detail(self, **kwargs): 'PPpayMount': mountprice, }) db.session.add(pp) + TemplateFormId.query.filter_by(TFcontent=kwargs.get('ppcontent'), isdelete=False, + TFtype=kwargs.get('PPpayType')).delete_(synchronize_session=False) + + tf = TemplateFormId.create({ + 'TFid': str(uuid.uuid1()), + 'TFfromId': fromid, + 'TFtype': kwargs.get('PPpayType'), + 'TFcontent': kwargs.get('ppcontent') + }) + db.session.add(tf) if kwargs.get('redirect'): - self.wechat_notify(redirect=True, pp=pp) + self.wechat_notify(redirect=True, pp=pp, formid=fromid) return '' - + # pay_args = + # prepay_id = pay_args.get('package').split('prepay_id=')[-1] + # current_app.logger.info('当前支付需获取prepayid= {}'.format(prepay_id)) + # tf.TFformId = prepay_id + # db.session.add(tf) return self._pay_detail(kwargs.get('body'), float(mountprice), kwargs.get('opayno'), kwargs.get('openid')) @@ -2105,7 +2116,7 @@ def _opayno(self): return self._opayno() return opayno - def _enter_log(self, pp): + def _enter_log(self, pp, formid=None): # 修改当前用户参加状态 el = EnterLog.query.filter(EnterLog.ELpayNo == pp.PPpayno, EnterLog.isdelete == false()).first() @@ -2137,7 +2148,15 @@ def _enter_log(self, pp): return self._incount(guide, mount_price) - # self.temp.enter(el.PLid, prepay_id) + # 通知 + if not formid: + templateform = TemplateFormId.query.filter(TemplateFormId.TFtype == PlayPayType.enterlog.value, + TemplateFormId.TFcontent == el.ELid, + TemplateFormId.isdelete == false()).first() + if templateform: + formid = templateform.TFformId + + self.temp.enter(el, formid) # self.temp.enter.apply_async(args=[el.PLid, prepay_id], countdown=5 * 60, expires=1 * 60,) def _undertake(self, pp): diff --git a/planet/control/CTemplates.py b/planet/control/CTemplates.py index 1e5eebca..a7c7471b 100644 --- a/planet/control/CTemplates.py +++ b/planet/control/CTemplates.py @@ -1,4 +1,6 @@ # from enums import TemplateID +import time + from flask import current_app from sqlalchemy import false @@ -10,9 +12,16 @@ def log(fn): def inner(*args, **kwargs): + # try: + result = fn(*args, **kwargs) current_app.logger.info('get wx response = {}'.format(result)) + # except Exception as e: + # current_app.logger.info('error response = {}'.format(e.args)) + # time.sleep(10) + # return inner(*args, **kwargs) + return inner @@ -21,26 +30,61 @@ def __init__(self): self.mp_miniprogram = mp_miniprogram @log - def enter(self, elid, form_id): - # 用户报名参加,通知到领队 + def enter(self, el, form_id): + # 表单信息未获取,无法发送 + if not form_id: + return + # 用户报名参加,短信通知到领队 微信模板通知到个人 tempid = TemplateID.enter.zh_value # 获取领队信息 - leader = User.query.join(EnterLog, EnterLog.USid == User.USid).filter(EnterLog.ELid == elid).first() - # el = EnterLog.query.filter(EnterLog.ELid == elid, EnterLog.isdelete == false()).first() - # user = + user = User.query.join(EnterLog, EnterLog.USid == User.USid).filter(EnterLog.ELid == el.ELid).first() + + play = Play.query.filter(Play.PLid == el.PLid, Play.isdelete == false()).first() + if not play: + current_app.logger.info('没有活动或活动已删除 elid = {}'.format(el.ELid)) + return + leader = User.query.filter(User.USid == play.PLcreate, User.isdelete == false()).first() + if not user or not user.USopenid1: + current_app.logger.info('没有活动用户 elid = {}'.format(el.ELid)) + return if not leader or not leader.USopenid1: - current_app.logger.info('没有活动用户 elid = {}'.format(elid)) + current_app.logger.info('没有活动领队 elid = {}'.format(el.ELid)) return + data = { "keyword1": { - "value": "某个热心网友发来贺电" + "value": el.createtime }, "keyword2": { - "value": "就这个活动带他一起" + "value": leader.USname + }, + "keyword3": { + "value": "恭喜您已成功加入活动!" + }, + "keyword4": { + "value": play.PLname + }, + "keyword5": { + "value": play.PLstartTime + }, + "keyword6": { + "value": leader.UStelphone } } - return self.mp_miniprogram.template_send(tempid, leader.USopenid1, data, page='/pages/index/manageActivity', form_id=form_id) + # todo 短信通知领队 + for i in range(3): + try: + wxresponse = self.mp_miniprogram.template_send( + tempid, user.USopenid1, data, page='/pages/index/manageActivity', form_id=form_id) + except Exception as e: + current_app.logger.info('get error from wx {}'.format(e.args)) + time.sleep(10 + i * 10) + continue + return wxresponse + return self.mp_miniprogram.template_send( + tempid, user.USopenid1, data, page='/pages/index/manageActivity', form_id=form_id) + # return def cancel(self): pass diff --git a/planet/models/play.py b/planet/models/play.py index 3cda4edd..0553fa4c 100644 --- a/planet/models/play.py +++ b/planet/models/play.py @@ -134,3 +134,11 @@ class PlayPay(Base): PPpaysn = Column(String(64), comment='第三方支付流水') PPpayJson = Column(Text, comment='回调原文') PPpaymarks = Column(String(255), comment='备注') + + +class TemplateFormId(Base): + """小程序模板formid""" + TFid = Column(String(64), primary_key=True) + TFtype = Column(Integer, default=1, comment='模板类型') + TFformId = Column(String(64), nullable=False, comment='formid') + TFcontent = Column(String(64), comment='关联id')