Ejemplo n.º 1
0
def pay_market(yyyymmdd, fsid):
    '''支付指定日期指定营销人员的推广报酬'''
    m = web.listget(
        dbFrame.select("WX_MARKETDETAIL",
                       vars=locals(),
                       where="FS_ID=$fsid AND YYYYMMDD=$yyyymmdd").list(), 0,
        None)
    if not m:
        return {'error': '推广数据不存在!'}
    if m and m.STATUS > 0:
        return {'error': '该笔推广已经支付!'}
    amount = float(m.MONEY_D1) + float(m.MONEY_D2)
    if m and (amount <= 0):
        return {'error': '报酬为零!'}
    FSOBJ = mdb.get_fans_byfsid(fsid)
    t = dbFrame.transaction()
    try:
        dbFrame.update("WX_MARKETDETAIL",
                       vars=locals(),
                       where="YYYYMMDD=$yyyymmdd AND FS_ID=$fsid",
                       STATUS=1)
        dbFrame.insert("QN_REDCACHE",
                       CC_ID=utils.get_keyword(),
                       OPENID=FSOBJ.OPENID,
                       FS_ID=FSOBJ.FS_ID,
                       QN_ID=yyyymmdd,
                       AN_ID='',
                       CC_HONGBAO=amount,
                       SUMMARY='推广报酬')
    except Exception, e:
        t.rollback()
        traceback.print_exc()
        return {'error': str(e)}
Ejemplo n.º 2
0
def applyMarketing(fsid):
    '''指定用户申请成为营销人员'''
    global mutex
    #目前不限时
    # if datetime.datetime.now().strftime("%H:%M:%S")<'12:00:00':
    #     return '今日还未开始,请中午12:00后再来抢!'
    limit = web.config.app_configuration.get('sys:marketing', '1')
    if not str(limit).isdigit():
        limit = 1
    limit = int(limit)
    if len(web.config.today_apply) >= limit:
        return '今日名额已被抢光!请明天中午12:00再来!'
    retval = ''
    if mutex.acquire(1):
        web.config.today_apply.append(fsid)
        web.config.today_apply = list(set(web.config.today_apply))
        retval = mdb.set_saler(fsid)
        mdb.update_today_apply()
        mutex.release()
    if not retval:
        FSOBJ = mdb.get_fans_byfsid(fsid)
        if wxcode == 'test':
            pushTask(
                mforweixin.sendTextMessage,
                (FSOBJ.OPENID, 'cSpmz_6G_PBkj7hqA8EYpdAXzqi-wD19aL29_wPSPwQ'),
                1000)
        else:
            pushTask(
                mforweixin.sendMPNews,
                (FSOBJ.OPENID, 'cSpmz_6G_PBkj7hqA8EYpdAXzqi-wD19aL29_wPSPwQ'),
                1000)
        return '恭喜您,申请成功!您已成为我们的推广成员,请阅读推广计划文档了解细节。'
    else:
        return '系统繁忙!'
Ejemplo n.º 3
0
def dailyWork(fromuser='', today=None):
    '''每日结算(深交所收盘后):1统计每日数据;2为已结束的未抽奖的有奖问卷抽奖;3问卷归档;4营销推广统计;5同步static;6清除问卷发送缓存'''
    retval = ''
    if not today:
        today = datetime.datetime.today().strftime("%Y%m%d")
    #1保存日统计数据
    import madmin
    retdat = madmin.stat_daily(today)
    for key, val in retdat:
        retval += '\n%s: %s' % (key, val)
    #2抓取行情,处理需要抽奖的问卷
    retval += daily_draw(today)
    #3问卷归档:已结束的超过90天的问卷移到主归档表;主归档表中上一年度的问卷移到年度归档表
    retval += '\n本年问卷归档'
    bef90 = formatting.format_date(formatting.date_add(-90), '%Y%m%d')
    retdat = mdb.archive_qsnaire(bef90)
    if retdat.has_key('error'):
        retval += ':' + retdat['error']
    else:
        retval += ':' + retdat['success']
    retval += '\n往年问卷归档'
    curryear = datetime.datetime.now().year
    retdat = mdb.archive_year(str(curryear - 1))
    if retdat.has_key('error'):
        retval += ':' + retdat['error']
    else:
        retval += ':' + retdat['success']
    madmin.set_daily_summary(today, retval)
    #4营销推广统计
    retval += '\n营销推广统计:直接粉%d,间接粉%d' % madmin.stat_market(today)
    #5同步static到COS(这是为了能够上传白天正常操作时上传失败的文件)
    import mqcloud
    if mqcloud.cos_init(web.config.app_configuration.get('sys:cos_bucket',
                                                         '')):
        mqcloud.sync_upload_cos('static')  #同步static目录到COS
    #6清除问卷发送缓存
    cacher_naire_sent.cleanup()
    #发送结果
    if not fromuser:
        admin_fsids = madmin.get_administrators()
        FSOBJ = mdb.get_fans_byfsid(admin_fsids[-1:][0])
        fromuser = FSOBJ.OPENID if FSOBJ else ''
    if fromuser:
        delaySendMessage(fromuser, retval.strip(), 0)
    #
    web.config.today_apply = []
    mdb.update_today_apply()
    return retval.strip()
Ejemplo n.º 4
0
def set_winaward(QNOBJ, winno, cjje, enddate):
    '''为问卷设置:中奖号、成交金额、结束日期'''
    retdat = mdb.set_award(QNOBJ.QN_ID, winno, cjje)
    if retdat.has_key('success') and retdat['success']:
        FSWIN = retdat['success']
        if mdb.canSendServiceMessage(FSWIN):
            #向中奖用户发送中奖通知。用户可能无法收到客服消息,因其主动操作已超过48小时
            rtmsg = {
                "title":
                "中奖通知",
                "url":
                mforweixin.get_mp_authurl("%s/p13" % (HOST_NOS), QNOBJ.QN_ID),
                "description":
                '恭喜您!您参与的有奖问卷【%s】已中奖,奖品【%s】,请查阅中奖详情及领奖方法。' %
                (QNOBJ.QN_TITLE.encode('utf8'),
                 QNOBJ.PRIZE_TITLE.encode('utf8')),
                "picurl":
                QNOBJ['SHARE_PICURL']
            }
            delaySendMessage(FSWIN.OPENID, rtmsg)
        #向问卷发布人发送抽奖结果通知。问卷发布人是当天结束问卷的,他的主动操作在48小时内,是可以收到客服消息的
        FSOBJ = mdb.get_fans_byfsid(QNOBJ.FS_ID)
        if mdb.canSendServiceMessage(FSOBJ):
            rtmsg = {
                "title":
                "开奖通知",
                "url":
                mforweixin.get_mp_authurl("%s/p23" % (HOST_NOS)),
                "description":
                '您发布的有奖问卷【%s】已完成抽奖,请查阅开奖详情。' % (QNOBJ.QN_TITLE.encode('utf8')),
                "picurl":
                QNOBJ['SHARE_PICURL']
            }
            delaySendMessage(FSOBJ.OPENID, rtmsg)
        mdb.set_qsend(QNOBJ.QN_ID, enddate)
        return ''
    else:
        print 'ExceptionLottery:', QNOBJ.QN_ID, retdat['error']
        return retdat['error']
Ejemplo n.º 5
0
def set_weixinfan(openid,args={},fromchat=True):
    '''设置微信用户。args里面是要设置的字段及值。fromchat表示是否源自会话等活动(这些活动都是粉丝)。返回 tuple(FSID,用户是否公号粉丝),如果出错就返回(None,None)'''
    #微信网页授权有2种scope,都无需关注:1、以snsapi_base为scope发起的网页授权,是用来获取进入页面的用户的openid的。2、以snsapi_userinfo为scope发起的网页授权,是用来获取用户的基本信息的。
    global mutex
    import mdb
    FSOBJ = mdb.get_fans_byopenid(openid)
    # FSOBJ = web.listget(dbFrame.select("WX_FANS",vars=locals(),where="OPENID=$openid").list(), 0, None)
    t = dbFrame.transaction()
    try:
        #总是设置最近活跃时间
        args['UNSUBSCRIBETIME'] = utils.get_currdatetimestr(dbFrame.dbtype) #利用取消关注时间字段记录综合的最后活跃时间
        if fromchat:
            args['LASTACTIVETIME'] = utils.get_currdatetimestr(dbFrame.dbtype) #只记录来自会话的最后活跃时间,来自网页的不记录
        #如果显式设置关注为1,说明是关注动作,设置关注时间
        if args.get('SUBSCRIBE')==1: #关注
            args['SUBSCRIBETIME'] = utils.get_currdatetimestr(dbFrame.dbtype)
        #如果显式设置关注为0,说明是取消关注动作,设置取消关注时间
        if args.get('SUBSCRIBE')==0:
            args['UNSUBSCRIBETIME'] = utils.get_currdatetimestr(dbFrame.dbtype)
        else:
            #如果是会话/扫码等动作,并且不是取消关注动作,说明用户是粉丝,设置SUBSCRIBE以保证表中记录的关注状态是正确的。只有网页活动不知道是否粉丝
            if fromchat:
                args['SUBSCRIBE'] = 1
        isfan = args.get('SUBSCRIBE')==1
        #根据openid判断的如果存在就更新,不存在就添加
        if not FSOBJ:
            if mutex.acquire(1):
                fsid = utils.get_id_bytime()
                mutex.release()
            else:
                fsid = utils.get_id_bytime()
            while mdb.get_fans_byfsid(fsid):
                fsid = utils.get_id_bytime()
            if not args.has_key('IN_BY'):
                args['IN_BY'] = 10000
            if args.get('SUBSCRIBE')==1: #如果用户不存在,且SUBSCRIBE为1,设置关注赠送积分
                args['COIN_TOTAL'] = 100
                args['COIN_HOLD'] = 100
                dbFrame.insert("WX_COINDETAIL",CD_ID=utils.get_keyword(),FS_ID=fsid,INSERTTIME=utils.get_currdatetimestr(dbFrame.dbtype),CHG_AMOUNT=100,CHG_TYPE=11)
            dbFrame.update("WX_FANS",vars=locals(),where="FS_ID=$args['IN_BY']",GET_FANS=web.SQLLiteral('GET_FANS+1'))
            dbFrame.insert("WX_FANS",FS_ID=fsid,OPENID=openid,INSERTTIME=utils.get_currdatetimestr(dbFrame.dbtype), **args)
        else:
            fsid = FSOBJ.FS_ID
            if FSOBJ.SUBSCRIBE!=None:
                args.pop('IN_BY','') #在修改时如果SUBSCRIBE不是null说明用户关注中或曾经关注过,不修改IN_BY的值
            elif args.get('SUBSCRIBE')==1: #如果SUBSCRIBE是null说明用户从未关注过,第1次关注的话设置赠送积分
                pass
                # args['COIN_TOTAL'] = 100
                # args['COIN_HOLD'] = 100
                # dbFrame.insert("WX_COINDETAIL",CD_ID=utils.get_keyword(),FS_ID=fsid,INSERTTIME=utils.get_currdatetimestr(dbFrame.dbtype),CHG_AMOUNT=100,CHG_TYPE=11)
            if FSOBJ.SUBSCRIBE==args.get('SUBSCRIBE'): #如果现存值等于即将设置值就pop掉不再设置
                args.pop('SUBSCRIBE','')
            dbFrame.update("WX_FANS",vars=locals(),where='OPENID=$openid', **args)
            # if args.keys()!=['LASTACTIVETIME']:
            #     #如果只是设置最近活跃时间,不清除缓存
            #     cacher_fans_obj.delete(fsid)
            FSOBJ.update(args) #更新缓存
            cacher_fans_obj.set(fsid,FSOBJ)
    except Exception, e:
        t.rollback()
        traceback.print_exc()
        return None,None