def delReply(uid, rid): """ 刪除一個評論 :param uid: :param rid: :return: """ recode = None try: recode = dbsession.query(Reply).filter( and_(Reply.id == rid, Reply.u_id == uid)).one() except NoResultFound as e: raise e except Exception as e: dbsession.rollback() raise e if recode: try: recode.r_status = 1 dbsession.merge(recode) dbsession.commit() ### 這個回復是回復的話題, 所有在此回復上的回復消息 都應該刪除 if recode.r_reply_id == 0: dbsession.query(Reply).filter( Reply.r_reply_id == recode.id).update( {Reply.r_status: 1}) dbsession.commit() except Exception as e: dbsession.rollback() raise e
def update_user(user=None, **kwargs): """ :param kwargs: :return: """ user_obj = {} if isinstance(user, User): user_obj = user logging.debug("user is User instance.") print("user is User instance.") else: if 'id' in kwargs: user_obj = dbsession.query(User).filter_by( id=kwargs['id']).one() for k, v in kwargs.items(): if k == 'id': continue if v is not None: setattr(user_obj, k, v) try: logging.debug(user_obj) print(user_obj) dbsession.merge(user_obj) dbsession.commit() except Exception as e: logging.error(e) dbsession.rollback() raise e
def delArticle(uid, id): """ 刪除一個話題, 邏輯刪除 :param uid: :param id: :return: None, throw exception if error """ article = None try: article = dbsession.query(Article).filter( and_(Article.id == id, Article.u_id == uid)).one() except NoResultFound as e: return "話題找不到了。。。" except Exception as e: dbsession.rollback() raise e if not article: return "話題找不到了。。。" article.a_status = 2 # 關閉(邏輯刪除) try: dbsession.merge(article) dbsession.commit() except Exception as e: dbsession.rollback() raise e
def quite_contest(uid, id): """ 用戶退出比賽 :param uid: :param id: :return: """ contest_detail = None try: contest_detail = dbsession.query(ContestDetail).filter( and_(ContestDetail.c_id == id, ContestDetail.u_id == uid)).one() except NoResultFound as e: return except Exception as e: dbsession.rollback() raise e contest_detail.c_status = 1 try: dbsession.merge(contest_detail) dbsession.commit() except Exception as e: dbsession.rollback() raise e
def add_contest(uid, title, desc, stime, etime, money, logo): """ 創建一個比賽: :param uid: :param title: 比賽標題 :param desc: 描述 :param stime: 開始時間:不能是當天或以前 :param etime: 結束時間,不能小於開始時間 :param money: 初始資金 :param logo: logo 圖片地址 :return: """ contest = Contest() contest.u_id = uid contest.c_title = title contest.c_explain = desc contest.c_start_date = stime contest.c_end_date = etime contest.c_logo_url = logo contest.c_default_capital = money * 10000 try: dbsession.add(contest) dbsession.commit() except Exception as e: dbsession.rollback() raise e return contest
def add_stock(uid, stock_code, stock_name): if uid == None or uid == '': logging.info("uid is None..") return if len(stock_code) == 0 or len(stock_name) == 0: logging.info("stock_code, stock_name 不合法..") return try: stock = dbsession.query(UserFavoriteStocks).filter_by( u_id=uid).filter_by(s_stock_code=stock_code).one() except NoResultFound as e: stock = None if stock is not None: return "exist" stock = UserFavoriteStocks() stock.u_id = uid stock.s_stock_code = stock_code stock.s_stock_name = stock_name dbsession.add(stock) dbsession.commit()
def add_user(user=None, **kwargs): if user is None: user = {} user.update(kwargs) dbsession.add(user) dbsession.commit()
def sale_stock(uid, stock_code, stock_name, stock_count): """ 賣出 :param uid: :param stock_code: :param stock_name: :param stock_count: :return: if success return True,"" ortherwise return False, "errmsg" or raise the exceptions """ if not all([uid, stock_code, stock_name, stock_count]): logging.error("參數錯誤:", uid, stock_code, stock_name, stock_count) raise Exception("參數錯誤!") if not all( [isinstance(uid, str), isinstance(stock_code, str), isinstance(stock_name, str), isinstance(stock_count, int)]): logging.error("參數錯誤:", uid, stock_code, stock_name, stock_count) raise Exception("參數錯誤!") # 查詢是否已經購買此股 stock = None try: stock = dbsession.query(UserStock).filter_by(u_id=uid).filter_by(s_stock_code=stock_code).one() except NoResultFound as e: dbsession.rollback() logging.error(e) if stock == None: logging.info("用戶沒有持有持有該股票:", uid, stock_code) return False, "沒有持有持有該股票" ### 剛好清倉 if stock.s_stock_count == stock_count: try: dbsession.delete(stock) dbsession.commit() except Exception as e: logging.error(e) dbsession.rollback() raise e ## 數據有錯誤 elif stock.s_stock_count < stock_count: logging.info("用戶未持有這麽多股份:", uid, stock_code, stock_count) return False, "未持有這麽多股份" #正常買出 else: stock.s_stock_count -= stock_count try: dbsession.merge(stock) dbsession.commit() except Exception as e: logging.error(e) dbsession.rollback() raise e return True, ""
def add_stock(uid, stock_code, stock_name, stock_count, stock_price): """ no return val raise 參數錯誤異常 :param uid: :param stock_code: :param stock_name: :param stock_count: :param stock_price: 成本價 :return: """ if not all([uid, stock_code, stock_name, stock_count, stock_price]): logging.error("參數錯誤:", uid, stock_code, stock_name, stock_count, stock_price) raise Exception("參數錯誤!") ### 查詢是否已經買過該股票,是:添加持股數,否添加紀錄 stock = None try: stock = dbsession.query(UserStock).filter_by(u_id=uid).filter_by(s_stock_code=stock_code).one() except NoResultFound as e: dbsession.rollback() logging.error(e) # 沒記錄,沒買過 if stock is None: stock = UserStock() stock.u_id = uid stock.s_stock_price = stock_price stock.s_stock_code = stock_code stock.s_stock_name = stock_name stock.s_stock_count = stock_count try: dbsession.add(stock) dbsession.commit() except Exception as e: dbsession.rollback() logging.error(e) raise e else: price = ((float)(stock.s_stock_price) * stock.s_stock_count + stock_price*stock_count) / (stock.s_stock_count+stock_count) stock.s_stock_count += stock_count stock.s_stock_price = price try: dbsession.merge(stock) dbsession.commit() except Exception as e: dbsession.rollback() logging.error(e) raise e
def get_stock_list(uid, cid, page=1, lmt=100): """ 列出用戶的持股信息,默認100條 return: a list, :param uid: :param cid: :param page: :param lmt: """ if not all((uid, cid)): logging.error("uid err", uid) raise Exception("parameter err") sql = "select * from tb_user_contest_positions where user_id = %s and stock_count > 0 and contest_id=%d" \ " order by updated_at desc" \ " limit %d, %d" % (uid, cid, (page-1)*lmt, lmt) result = [] try: query_res = dbsession.execute(sql) dbsession.commit() query_res = query_res.fetchall() except Exception as e: dbsession.rollback() logging.error(e) raise # table column headers = ("id", "created_at", "updated_at", "deleted_at", "uid", "name", "code", "count", "price", "freeze", "cid") for item in query_res: dct = dict(zip(headers, item)) tm = dct['created_at'] dct['created_at'] = tm.strftime( "%Y-%m-%d %H:%M:%S") if tm else None tm = dct['updated_at'] dct['updated_at'] = tm.strftime( "%Y-%m-%d %H:%M:%S") if tm else None tm = dct['deleted_at'] dct['deleted_at'] = tm.strftime( "%Y-%m-%d %H:%M:%S") if tm else None dct['price'] = float(dct['price']) dct['freeze'] = float(dct['freeze']) result.append(dct) return result
def delete_user(arg): user = None try: if isinstance(arg, int): user = dbsession.query(User).filter(User.id == arg).one() if user is not None: dbsession.delete(user) dbsession.commit() else: logging.error("delete_user:user obj is not a User instance.") except Exception as e: logging.error(e) dbsession.rollback() raise e
def upcountArticleOnly(aid, uid): """ 給文章點贊:只點贊,不存在重複點贊 :param aid: :param uid: :return: success:return true,"" fail: return false,"失敗原因" :exception: exception returned if sql err """ recode = None try: recode = dbsession.query(ArticleUpcounts).filter( and_(ArticleUpcounts.a_id == aid, ArticleUpcounts.u_id == uid)).one() except NoResultFound as e: pass except Exception as e: dbsession.rollback() raise e if not recode: recode = ArticleUpcounts() recode.u_id = uid recode.a_id = aid try: dbsession.add(recode) dbsession.commit() except Exception as e: dbsession.rollback() raise e try: dbsession.query(Article).filter(Article.id == aid).update( {Article.a_upcounts: Article.a_upcounts + 1}) dbsession.commit() except Exception as e: dbsession.rollback() raise e return True, "" else: return False, "你已經點過贊了"
def addReplyReply(uid, aid, rid, content): """ 回復別人的回復消息 :param uid: :param aid: :param rid: :return: """ reply = Reply() reply.r_reply_id = rid reply.u_id = uid reply.a_id = aid reply.r_content = content try: dbsession.add(reply) dbsession.commit() except Exception as e: dbsession.rollback() raise e
def join_contest(uid, id): """ 用戶參加比賽:根據id獲取比賽的相關信息,例如初始資金,將數據填入tb_contest_detail中 :param uid: :param id: :return: """ test = None user_contest_detail = None try: test = dbsession.query(Contest).filter_by(id=id).one() except Exception as e: dbsession.rollback() raise e try: user_contest_detail = dbsession.query(ContestDetail).filter( and_(ContestDetail.u_id == uid, ContestDetail.c_id == test.id)).one() except NoResultFound as e: pass except Exception as e: dbsession.rollback() raise e # 已經存在數據,説明已經加入比賽 if user_contest_detail: raise Exception("已經加入該比賽!") user_contest_detail = ContestDetail() user_contest_detail.c_join_time = datetime.now() user_contest_detail.c_money = test.c_default_capital # 初始資金 user_contest_detail.c_id = test.id user_contest_detail.u_id = uid try: dbsession.add(user_contest_detail) dbsession.commit() except Exception as e: dbsession.rollback() raise e
def close_contest(id): """ 關閉比賽, 結束比薩不在這裏處理,在每天的收盤后會有定時任務處理! :param id: :return: """ test = None try: test = dbsession.query(Contest).filter( and_(Contest.id == id, Contest.c_status != 3, Contest.c_status != 2)).one() if test: test.c_status = 3 # 關閉 dbsession.merge(test) dbsession.commit() except Exception as e: dbsession.rollback() raise e
def addReply(uid, aid, content): """ 添加一個回復 :param uid: :param aid: :return: """ reply = Reply() reply.u_id = uid reply.a_id = aid reply.r_content = content try: dbsession.add(reply) dbsession.commit() except Exception as e: dbsession.rollback() raise e return reply.id
def del_stock(uid, stock_code): if uid is None or uid == '': logging.error("uid 不合法:", uid) raise Exception("Parameter error.") if stock_code is None or stock_code == '': logging.error("stock_code 不合法:", stock_code) raise Exception("Parameter error.") try: stock = dbsession.query(UserFavoriteStocks).filter_by( u_id=uid).filter_by(s_stock_code=stock_code).one() # 找不到數據會抛出NoResultFound異常,補貨,不做處理,正常執行下面流程 except NoResultFound as e: stock = None if (stock is not None): dbsession.delete(stock) dbsession.commit() else: logging.error("stock:%s不存在" % (stock_code))
def addArticle(uid, title, content): """ 添加一個話題 :param uid: :param title: :param content: :return: """ article = Article() article.u_id = uid article.a_title = title article.a_content = content try: dbsession.add(article) dbsession.commit() except Exception as e: dbsession.rollback() raise e return article.id
def upcountArticle(aid, uid): """ 給文章點贊, 如果電讚了得 就取消點讚 :param id: :param uid: :return: """ recode = None try: recode = dbsession.query(ArticleUpcounts).filter( and_(ArticleUpcounts.a_id == aid, ArticleUpcounts.u_id == uid)).one() except NoResultFound as e: pass except Exception as e: dbsession.rollback() raise e if not recode: recode = ArticleUpcounts() recode.u_id = uid recode.a_id = aid try: dbsession.add(recode) dbsession.commit() except Exception as e: dbsession.rollback() raise e try: dbsession.query(Article).filter(Article.id == aid).update( {Article.a_upcounts: Article.a_upcounts + 1}) dbsession.commit() except Exception as e: dbsession.rollback() raise e else: try: dbsession.delete(recode) dbsession.commit() dbsession.query(Article).filter(Article.id == aid).update( {Article.a_upcounts: Article.a_upcounts - 1}) dbsession.commit() except Exception as e: dbsession.rollback()
def upcountReply(uid, rid): """ 給評論點贊, 如果電讚了得 就取消點讚 :param id: :param uid: :return: """ recode = None try: recode = dbsession.query(ReplyUpcounts).filter( and_(ReplyUpcounts.r_id == rid, ReplyUpcounts.u_id == uid)).one() except NoResultFound as e: pass except Exception as e: dbsession.rollback() raise e if not recode: recode = ReplyUpcounts() recode.u_id = uid recode.r_id = rid try: dbsession.add(recode) dbsession.commit() except Exception as e: dbsession.rollback() raise e try: dbsession.query(Reply).filter(Reply.id == rid).update( {Reply.r_upcounts: Reply.r_upcounts + 1}) dbsession.commit() except Exception as e: dbsession.rollback() raise e else: try: dbsession.delete(recode) dbsession.commit() dbsession.query(Reply).filter(Reply.id == rid).update( {Reply.r_upcounts: Reply.r_upcounts - 1}) dbsession.commit() except Exception as e: dbsession.rollback()
def add_user(**kwargs): user = User() user.u_name = kwargs.get('u_name') user.u_passwd = kwargs.get('u_passwd') user.u_email = kwargs.get('u_email') user.u_sex = kwargs.get('u_sex') user.u_mobilephone = kwargs.get('u_mobilephone') dbsession.add(user) dbsession.commit() logging.debug('SVC_userinfo 注册用户:%s', user) # 处理用户资产信息 user_money = user.u_money user_mv = 0 uid = user.id sql = 'insert into tb_user_assets ' \ 'set user_id=%s, user_money=%.2f, user_mv=%.2f' \ % (uid, user_money, user_mv) dbsession.execute(sql) dbsession.commit() return user
def list_orders(uid, cid, type=None, page=1, count=40, finished=None): """ 获取订单列表. :param uid: 用户id :param cid: 比赛id (0为非比赛委托单) :param page: :param count: :param type: 交易类型 TRADE_TYPE_NONE = iota TRADE_TYPE_BUY # 买入 TRADE_TYPE_SALE # 卖出 :return: """ uid = (int)(uid) cid = (int)(cid) page = (int)(page) count = (int)(count) sql = 'select * from tb_orders where ' where_cond = [ 'user_id=%d' % uid, 'contest_id=%d' % cid, ] order_by = ' order by updated_at desc ' limit_sql = ' limit %d, %d ' % ((page - 1) * count, count) if type is not None: # 交易类型过滤 where_cond.append('trade_type=%d' % type) if finished == 'finished': where_cond.append('order_status!=0') elif finished == 'unfinished': where_cond.append('order_status=0') # 执行sql sql = sql + ' and '.join(where_cond) + \ order_by + limit_sql logging.debug('sql: %s' % sql) raws = dbsession.execute(sql).fetchall() dbsession.commit() if not raws: dbsession.rollback() return [] # table colume colums = ('id', 'submit_time', 'updated_at', 'deleted_at', 'uid', 'name', 'code', 'price', 'amount', 'transfer_fee', 'brokerage', 'volume', 'trade_type', 'type', 'status', 'cid') result = [] for item in raws: dct = dict(zip(colums, item)) tm = dct['submit_time'] dct['submit_time'] = tm.strftime( "%Y-%m-%d %H:%M:%S") if tm else None tm = dct['updated_at'] dct['updated_at'] = tm.strftime( "%Y-%m-%d %H:%M:%S") if tm else None tm = dct['deleted_at'] dct['deleted_at'] = tm.strftime( "%Y-%m-%d %H:%M:%S") if tm else None dct['price'] = float(dct['price']) dct['brokerage'] = float(dct['brokerage']) dct['transfer_fee'] = float(dct['transfer_fee']) dct['volume'] = float(dct['volume']) result.append(dct) return result
def revoke_order(uid, order_id, contest_id=0): """ 撤銷一個訂單: :param uid: 用戶id :param order_id: 訂單id號 :param contest_id: 比赛id, 0表示非比赛(代码耦合了) :return: """ if not isinstance(order_id, int): logging.error("id not a int object %s", id) raise Exception("參數錯誤") # recode = None # try: # recode = dbsession.query(TradeRecode).filter_by(id=id).filter_by(u_id=uid).one() # except NoResultFound as e: # logging.warning(e) # dbsession.rollback() # raise e # # except Exception as e: # logging.error(e) # dbsession.rollback() # raise e # # ## 判斷用記錄的狀態是否對 # if recode.t_status != 0: # logging.error("記錄的狀態不對, 不能撤銷該訂單: %s" %(recode.to_json()) ) # raise Exception("記錄的狀態不對, 不能撤銷該訂單") # # user = None # ### 取出用戶的數據,檢測是否餘額是否足夠 # try: # user = dbsession.query(User).filter_by(id=uid).one() # except NoResultFound as e: # 包括了NoResultFound異常, 用戶的數據都找不到了,還處理個毛綫 # logging.error(e) # raise e # except Exception as e: # dbsession.rollback() # logging.error(e) # raise e # # if recode.t_type == 1: # 買入 # user.u_money = (float)(user.u_money) + (float)(recode.t_volume) + (float)(recode.t_charge) # 用戶的錢返還回去 # elif recode.t_type == 2: # 賣出 退還凍結的手續費 # user.u_money = (float)(user.u_money) + (float)(recode.t_charge) # # recode.t_status = 2 # 記錄狀態設置為撤單 # try: # dbsession.merge(recode) # dbsession.merge(user) # dbsession.commit() # except Exception as e: # dbsession.rollback() # logging.error(e) # raise e # 检测订单数据 sql = 'select * from tb_orders where user_id=%d and id=%d ' % ( uid, order_id) try: result = dbsession.execute(sql).fetchall() dbsession.commit() if not result: raise Exception("订单数据不存在. order_id: %d, user_id: %d" % (order_id, uid)) except Exception as e: dbsession.rollback() logging.error("数据库错误:%s", e) raise # 拼接数据 colums = ("id", "created_at", "updated_at", "deleted_at", "uid", "name", "code", "price", "count", "transfer_fee", "brokerage", "freeze_amount", "trade_type", "type", "status", "contest_id") record = dict(zip(colums, result[0])) # 检查订单状态 # enum: # ORDER_STATUS_TBD = iota # ORDER_STATUS_FINISH # ORDER_STATUS_REVOKE if record['status'] != 0: raise Exception("撤销订单失败,订单状态不对.") # 构造请求,发送到交易服务器 now = str(time.time()) sign = ''.join(sorted(str(uid) + now + config.RPC_REQUEST_SALT)) md5 = hashlib.md5() md5.update(sign.encode()) sign = md5.hexdigest() request_body = { "method": "orderService.RevokeOrder", "params": [{ "user_id": uid, "sign": sign, "order_id": order_id, "req_time": now, "contest_id": contest_id, }] } try: resp = requests.post(config.RPC_SERVICE_URL, json=request_body, headers={'Content-Type': 'application/json'}) except Exception as e: raise if not resp.ok: raise Exception("请求失败, 请稍后再试!") content = resp.content.decode() content = json.loads(content)['result'] if content['ret_code'] != 0: raise Exception(content['err_msg']) # 添加用户动态. data = { 'uid': record['uid'], 'order_id': record['id'], 'code': record['code'], 'name': record['name'], 'contest_id': record['contest_id'], 'type': record['type'], } try: SVC_Dongtai.add_dongtai_revoke(uid, json.dumps(data)) except Exception as e: logging.error(e) raise e