def user_cancle_fixer_order(self): """用户取消维修订单""" if is_tourist(): return TOKEN_ERROR(u'请先登录') if is_admin(): return TOKEN_ERROR(u'请使用普通用户登录') data = parameter_required(('uftid', )) uftid = data.get('uftid') usid = request.user.id order = self.strade.get_fixer_order_by_uftid(uftid) if not order: raise NOT_FOUND(u'没有该订单') if order.USid != usid: # 判断订单是否是该用户的 raise NOT_FOUND(u'他人订单') if order.UFTstatus == 0: # 如果订单状态是未付款 canceled = self.strade.update_fixerorder_detail_by_uftid( uftid, { 'UFTstatus': 5 # 交易关闭 }) msg = u'操作完成' if canceled else u'无此记录' elif order.UFTstatus == 1: # 订单状态是付款成功后的等待服务 apply_forrefund = self.strade.update_fixerorder_detail_by_uftid( uftid, { 'UFTstatus': 3 # 申请退款中 }) msg = u'操作完成' if apply_forrefund else u'无此记录' elif order.UFTstatus == 3: raise PARAMS_ERROR(u'正在申请退款中') elif order.UFTstatus == 4: raise PARAMS_ERROR(u'退款中') else: raise PARAMS_ERROR(u'服务已完成或已关闭') return Success(msg, {'uftid': uftid})
def add_room(self): """添加房源""" if not is_admin(): raise TOKEN_ERROR(u'请使用管理员登录') required = ('roname', 'roimage', 'roareanum', 'roface', 'roarea', 'roshowprice', 'roshowpriceunit', 'rorenttype', 'rodecorationstyle', 'rocitynum', 'roareanum', 'rosubwayaround', 'house', 'villegeid', 'medias', 'stfid') data = parameter_required(required, forbidden=( 'roid', 'hoid', )) house = data.pop('house', None) medias = data.pop('medias', []) tags = data.pop('tags', []) roomrequirment = data.pop('roomrequirment', None) # 是否存在小区 villege = self.sroom.get_villege_info_by_id(data.get('villegeid')) if not villege: raise NOT_FOUND(u'请添加小区信息') # 初始化添加参数 mod = {} roid = str(uuid.uuid4()) create_time = datetime.strftime(datetime.now(), format_for_db) house['hoid'] = data['hoid'] = data['roid'] = roid # 添加房源 data['ROcreatetime'] = create_time data['ROdistance'] = villege.subway_primary data['ROaroundequirment'] = villege.around data['ROsubwayposionname'] = villege.position mod['Room'] = data # 添加媒体 try: map(lambda x: x.setdefault('roid', roid), medias) map(lambda x: x.setdefault('reid', str(uuid.uuid4())), medias) mod['RoomMedia'] = medias except Exception as e: raise PARAMS_ERROR(u'medias参数有误') # 添加house houseinfo_required = ('hofloor', 'hototalfloor', 'hobedroomcount', 'hoparlorcount') parameter_required(houseinfo_required, datafrom=house) house['VIid'] = data.get('villegeid') mod['House'] = house # 添加tag try: map(lambda x: x.setdefault('roid', roid), tags) map(lambda x: x.setdefault('rtid', str(uuid.uuid4())), tags) mod['RoomTag'] = tags except Exception as e: raise PARAMS_ERROR(u'tags参数有误') # 添加设备: if roomrequirment: roomrequirment['roid'] = roid roomrequirment['reid'] = str(uuid.uuid4()) mod['RoomEquirment'] = roomrequirment self.sroom.add_models(mod) return Success(u'添加成功', {'roid': roid})
def _allow_starttime(str_time): try: startime = datetime.strptime(str_time, format_for_db) except Exception as e: raise PARAMS_ERROR(str(str_time) + u'时间格式不正确') time_on_road_seconds = (startime - datetime.now()).total_seconds() if MOVER_APPOINT_MIN_TIME_ON_ROAD < time_on_road_seconds < MOVER_APPOINT_MAX_TIME_ON_ROAD: return str_time raise PARAMS_ERROR(u'时间不合理')
def add_bedroom(self): """添加卧室, 以及卧室入住信息""" if not is_admin(): raise TOKEN_ERROR(u'请使用管理员登录') data = parameter_required(('roid', 'bbrnum'), forbidden=('bbrid', 'bbrstatus')) room = self.sroom.get_room_by_roid(data.get('roid')) mod = {} data['bbrid'] = str(uuid.uuid4()) mod['BedroomBehindRoom'] = data if not room: raise NOT_FOUND(u'不存在的房源id') if 'bbrshowprice' in data: # 卧室未租出 data['BBRstatus'] = 2 elif 'usgender' in data: # 已经租出 data['BBRstatus'] = 5 mod['UserBedroomBehindRoom'] = { 'UBBRid': str(uuid.uuid4()), 'BBRid': data['bbrid'], 'USgender': data.get('usgender') } else: raise PARAMS_ERROR(u'缺少必要的参数') self.sroom.add_models(mod) cache.delete('room_detail::{}'.format(data.get('roid'))) return Success(u'添加成功', {'bbrid': data['bbrid']})
def check_refund(self): """查询是否退款""" # if not is_admin(): # raise TOKEN_ERROR(u'请使用管理员登录') data = parameter_required() if 'umtid' in data: umtid = data.get('umtid') order = self.strade.get_mover_order_by_umtid(umtid) if not order or order.UMTstatus != 4: raise NOT_FOUND() pass elif 'uctid' in data: uctid = data.get('uctid') order = self.strade.get_clean_order_by_uctid(uctid) if not order or order.UCTstatus != 4: raise NOT_FOUND() elif 'uftid' in data: uftid = data.get('uftid') order = self.strade.get_fixer_order_by_uftid(uftid) if not order or order.UFTstatus != 4: raise NOT_FOUND() else: raise PARAMS_ERROR() sn = order.sn try: res = self.pay.refund_query(out_trade_no=sn) except WeixinPayError as e: raise SYSTEM_ERROR(e.message) return Success(data=res)
def parameter_required(required=None, others='allow', filter_none=True, forbidden=None, datafrom=None): """验证请求中必需的参数 others: 如果是allow, 则代表不会清除其他参数 filter_none: True表示会过滤到空值(空列表, 空字符串, None等除了0之外的False值) forbidden: 必需要清除的字段 """ if datafrom is None: data = request.json or request.args.to_dict() or {} else: data = datafrom if filter_none: data = {k: v for k, v in data.items() if v or v == 0} if required: missed = filter(lambda x: x not in data, required) if missed: raise PARAMS_ERROR(u'必要参数缺失或为空: ' + ', '.join(missed)) if others != 'allow': data = {k: v for k, v in data.items() if k in required} if forbidden: data = {k: v for k, v in data.items() if k.lower() not in forbidden} return data
def validate_arg(regex, arg, msg=None): if arg is None: return res = re.match(regex, str(arg)) if not res: raise PARAMS_ERROR(msg) return arg
def point_staff(self): """给订单指定工作人员""" if not is_admin(): raise TOKEN_ERROR(u'请使用管理员登录') data = parameter_required(('stfid', )) stfid = data.get('stfid') staff = self.suser.get_staff_by_stfid(stfid) if not staff: raise NOT_FOUND(u'不存在的工作人员') if staff.STFisblocked: raise NOT_FOUND(u'黑名单里的工作人员') response = {'stfid': stfid} # 如果是搬家服务 if 'umtid' in data: umtid = data.get('umtid') mover_order = self.strade.get_mover_order_by_umtid(umtid) if mover_order.UMTstatus != 1: # 只有等待服务的订单才可以制定 raise PARAMS_ERROR(u'当前订单状态为{}, 只可以指定等待服务中的订单'.format( SERVER_STATUS.get(mover_order.UMTstatus))) updated = self.strade.update_movertrade_detail_by_umtid( umtid, {'STFid': stfid}) response['type'] = 'mover' elif 'uftid' in data: # 如果是维修 uftid = data.get('uftid') fixer_order = self.strade.get_fixer_order_by_uftid(uftid) if fixer_order.UFTstatus != 1: raise PARAMS_ERROR(u'当前订单状态为{}, 只可以指定等待服务中的订单'.format( SERVER_STATUS.get(fixer_order.UMTstatus))) updated = self.strade.update_fixerorder_detail_by_uftid( uftid, {'STFid': stfid}) response['type'] = 'fixer' elif 'uctid' in data: # 如果是保洁 uctid = data.get('uctid') cleaner_order = self.strade.get_clean_order_by_uctid(uctid) if cleaner_order.UCTstatus != 1: raise PARAMS_ERROR(u'当前订单状态为{}, 只可以指定等待服务中的订单'.format( SERVER_STATUS.get(cleaner_order.UMTstatus))) updated = self.strade.update_cleanorder_detail_by_uctid( uctid, {'STFid': stfid}) response['type'] = 'cleaner' else: # 其他 参数有误 raise PARAMS_ERROR(u'订单参数有误') msg = u'更新成功' if updated else u'无此记录' return Success(msg, response)
def pay_for_service(self): data = parameter_required() if is_tourist(): raise TOKEN_ERROR() if is_admin(): raise AUTHORITY_ERROR(u'请使用普通用户登陆') usid = request.user.id user = self.suser.get_user_by_usid(usid) openid = user.WXopenid if 'umtid' in data: umtid = data.get('umtid') usermoverorder = self.strade.get_mover_order_by_umtid(umtid) if not usermoverorder or usermoverorder.UMTstatus != 0: raise NOT_FOUND() total_fee = usermoverorder.UMTpreviewprice out_trade_no = self.pay.nonce_str self.strade.update_movertrade_detail_by_umtid( umtid, {'sn': out_trade_no}) body = u'邻家搬家' attach = u'mover' elif 'uctid' in data: uctid = data.get('uctid') user_clean_order = self.strade.get_clean_order_by_uctid(uctid) if not user_clean_order or user_clean_order.UCTstatus != 0: raise NOT_FOUND() total_fee = user_clean_order.UCTprice out_trade_no = self.pay.nonce_str self.strade.update_cleanorder_detail_by_uctid( uctid, {'sn': out_trade_no}) body = u'cleaner' attach = u'cleaner' elif 'uftid' in data: uftid = data.get('uftid') user_fixer_order = self.strade.get_fixer_order_by_uftid(uftid) if not user_fixer_order or user_fixer_order.UFTstatus != 0: raise NOT_FOUND() total_fee = user_fixer_order.UFTprice out_trade_no = self.pay.nonce_str self.strade.update_fixerorder_detail_by_uftid( uftid, {'sn': out_trade_no}) body = u'fixer' attach = u'fixer' else: raise PARAMS_ERROR() try: total_fee *= 100 raw = self.pay.jsapi(trade_type="JSAPI", openid=openid, body=body, out_trade_no=out_trade_no, total_fee=int(total_fee), attach=attach, spbill_create_ip=request.remote_addr) res = dict(raw) res['paySign'] = res.get('sign') except WeixinPayError as e: return SYSTEM_ERROR(e.message) return Success(res)
def agree_cancle_fixer_order(self): """管理员同意执行退款""" if not is_admin(): return TOKEN_ERROR(u'请使用管理员登录') data = parameter_required(('uftid', )) agree = int(data.get('agree', 1)) uftid = data.get('uftid') order = self.strade.get_fixer_order_by_uftid(uftid) if not order: raise NOT_FOUND(u'不存在的订单') if order.UFTstatus != 3: raise PARAMS_ERROR(u'当前状态为{}'.format( SERVER_STATUS.get(order.UFTstatus, u'其他'))) if not order.sn or not order.paytime: raise NOT_FOUND(u'未付款的订单') # 拒绝退款: if agree == 0: status = 1 msg = u'已拒绝退款' # 同意退款 else: status = 4 msg = u'已同意退款' usid = order.USid user = self.suser.get_user_by_usid(usid) openid = user.WXopenid out_trade_no = order.sn total_fee = int(order.UFTprice * 100) # 调用退款 try: self.pay.refund(out_trade_no=out_trade_no, total_fee=total_fee, refund_fee=total_fee, op_user_id=openid, out_refund_no=out_trade_no, spbill_create_ip=request.remote_addr) except WeixinPayError as e: raise PARAMS_ERROR(u'签名错误') # 修改服务状态为退款中 updated = self.strade.update_fixerorder_detail_by_uftid( uftid, {'UFTstatus': status}) return Success(msg, {'uftid': uftid})
def add_room_opencity(self): if not is_admin(): raise TOKEN_ERROR(u'请使用管理员登录') data = parameter_required(('city_id', )) city_id = data.get('city_id') room_city = self.scity.is_room_open_city(city_id) if room_city: raise PARAMS_ERROR(u'重复添加') data['rcid'] = str(uuid.uuid4()) added = self.scity.add_model('RoomCity', data) return Success(u'添加房源开放城市成功', {'city_id': city_id})
def update_complaint(self): if not is_admin(): raise TOKEN_ERROR(u'请使用管理员登录') data = parameter_required(('usercomplaintid', 'status')) status = data.get('status') if str(status) not in ['1', '0']: raise PARAMS_ERROR(u'status参数不合法') comlain = self.strade.update_somplaint_by_complaintid( data.get('usercomplaintid'), {'UserComplaintstatus': status}) if not comlain: raise NOT_FOUND(u'修改失败') return Success(u'修改成功', {'status': COMPLAIN_STATUS[status]})
def update_cleanerorder_price(self): if not is_admin(): raise TOKEN_ERROR(u'请使用管理员登录') data = parameter_required(('uctid', 'price')) price = data.get('price') uctid = data.get('uctid') cleaner_order = self.strade.get_clean_order_by_uctid(uctid) if not cleaner_order: raise NOT_FOUND() if cleaner_order.UCTstatus != 0: raise PARAMS_ERROR(u'当前订单状态为{}, 只可以修改未付款的订单'.format( SERVER_STATUS.get(cleaner_order.UCTstatus))) updated = self.strade.update_cleanorder_detail_by_uctid( uctid, {"UCTprice": price}) return Success(u'修改成功', {'uctid': uctid})
def update_fixorder_price(self): """修改维修价格""" if not is_admin(): raise TOKEN_ERROR(u'请使用管理员登录') data = parameter_required(('uftid', 'price'), others='ignore') uftid = data.get('uftid') fix_order = self.strade.get_fixer_order_by_uftid(uftid) if not fix_order: raise NOT_FOUND() if fix_order.UFTstatus != 0: raise PARAMS_ERROR(u'当前订单状态为{}, 只可以修改未付款的订单'.format( SERVER_STATUS.get(fix_order.UFTstatus))) updated = self.strade.update_fixerorder_detail_by_uftid( uftid, {'UFTprice': data.get('price')}) return Success(u'修改成功', {'uftid': uftid})
def update_moverorder_price(self): """更新订单价格""" if not is_admin(): raise TOKEN_ERROR(u'请使用管理员登录') data = parameter_required(('umtid', 'price')) price = data.get('price') umtid = data.get('umtid') mover_order = self.strade.get_mover_order_by_umtid(umtid) if not mover_order: raise NOT_FOUND() if mover_order.UMTstatus != 0: raise PARAMS_ERROR(u'当前订单状态为{}, 只可以修改未付款的订单'.format( SERVER_STATUS.get(mover_order.UMTstatus))) updated = self.strade.update_movertrade_detail_by_umtid( umtid, {'UMTpreviewprice': price}) return Success(u'修改成功', {'umtid': umtid})
def get_appointment_one(self): """获取单条订单""" if is_tourist(): raise TOKEN_ERROR(u'请登录') data = parameter_required() if 'uctid' in data: uctid = data.get('uctid') order = self.strade.get_clean_order_by_uctid(uctid) if not order: raise NOT_FOUND(u'该订单不存在') order.UCTstatus = SERVER_STATUS.get(order.UCTstatus) sceid = order.SCEid cleaner_server = self.sserver.get_cleanerserver_by_sceid(sceid) order.fill('clener', 'type') order.fill(getattr(cleaner_server, 'SCMtitle', ''), 'name') elif 'uftid' in data: uftid = data.get('uftid') order = self.strade.get_fixer_order_by_uftid(uftid) if not order: raise NOT_FOUND(u'该订单不存在') order.UFTstatus = SERVER_STATUS.get(order.UFTstatus) order.fill('fixer', 'type') order.fill('邻家维修', 'name') elif 'umtid' in data: umtid = data.get('umtid') order = self.strade.get_mover_order_by_umtid(umtid) if not order: raise NOT_FOUND(u'该订单不存在') order.UMTstatus = SERVER_STATUS.get(order.UMTstatus) order.fill('mover', 'type') smsid = order.SMSid mover_server = self.sserver.get_mover_by_smsid(smsid) order.fill(getattr(mover_server, 'SMStitle', ''), 'name') order.fill('type', 'mover') else: return PARAMS_ERROR() if not is_admin(): if request.user.id != order.USid: raise NOT_FOUND(u'它人订单') # 工作人员 staff = {} stfid = order.STFid if stfid: staff = self.suser.get_staff_by_stfid(stfid).clean.add( 'STFid', 'STFname') order.fill(staff, 'staff') return Success(u'获取订单成功', {'order': order})
def _allow_order_status(old, new): if old == 0: # 0: u'待支付', 1: u'等待服务', 2: u'服务完成', 3: u'申请退款', 4: u'退款中', 5: u'交易关闭' allow = [1] elif old == 1: allow = [2, 4] elif old == 2: allow = [] elif old == 3: allow = [2, 4] elif old == 4: allow = [5] else: allow = [0, 1, 2, 3, 4, 5] if new not in allow: raise PARAMS_ERROR(u'状态不合理, 当前状态为: {} ' u''.format(SERVER_STATUS.get(old)))
def all_with_page(self, page=None, count=None): """ 计算总页数和总数 :param page: 当前页码 :param count: 页面大小 :return: sqlalchemy对象列表 """ if not page and not count: return self.all() try: page = int(page) count = int(count) except TypeError as e: raise PARAMS_ERROR(u'分页参数错误') mount = self.count() page_count = math.ceil(float(mount) / count) request.page_count = page_count request.all_count = mount return self.offset((page - 1) * count).limit(count).all()
def add_admin(self): # 添加管理员, 默认添加0级别管理员 if not is_hign_level_admin(): raise TOKEN_ERROR(u'需要高级管理权限') required = ['adname', 'adusername', 'adpassword', 'admobiel', 'ademail'] data = parameter_required(required) if self.suser.get_admin_by_adusername(data.get('adusername')): raise PARAMS_ERROR(u'用户名重复') validate_phone(data.get('admobiel')) validate_phone(data.get('adphone')) validate_arg('\w+@\w+\.\w+', data.get('ademail'), u'电子邮箱格式不正确') data['adlevel'] = 0 or data.get('adlevel') if data['adlevel'] >= request.user.level: raise AUTHORITY_ERROR() data['adid'] = str(uuid.uuid4()) data['adpassword'] = generate_password_hash(data.get('adpassword')) self.suser.add_model('Admin', data) return Success(u'添加管理员成功', { 'adid': data.get('adid') })
def update_bedroom(self): """更新卧室信息, 比如改为已租出, 或者价格之类""" if not is_admin(): raise TOKEN_ERROR(u'请使用管理员登录') data = parameter_required(('bbrid', )) bbrid = data.pop('bbrid') bedroom = self.sroom.get_bedroom_by_bbrid(bbrid) if not bedroom: raise NOT_FOUND(u'此卧室不存在') roid = bedroom.ROid if 'bbrshowprice' in data: # 需要改为未租出的状态 self.sroom.update_bedroom_by_bbrid( bbrid, { 'BBRshowprice': data.get('bbrshowprice'), 'BBRshowpriceunit': data.get('bbrshowpriceunit', 'month'), 'BBRstatus': 2 }) userbedroom = self.sroom.update_roomates_info_by_bbrid( bbrid, {'UBBRstatus': 1}) # 同时需要更新卧室住户的状态 msg = u'改为未入住成功' elif 'usgender' in data: # 需要改为入住状态 self.sroom.update_bedroom_by_bbrid(bbrid, {"BBRstatus": 5}) # 同时需要添加入住信息, 修改以往的入住信息为已搬(如果有) self.sroom.update_roomates_info_by_bbrid(bbrid, {'UBBRstatus': 1}) model_dict = dict(UBBRid=str(uuid.uuid4()), BBRid=bbrid, USgender=data.get('usgender')) mod = dict(UserBedroomBehindRoom=model_dict) self.sroom.add_models(mod) msg = u'改为已入住成功' else: raise PARAMS_ERROR(u'缺少必要的参数') cache.delete('room_detail::{}'.format(roid)) return Success(msg, {'bbrid': bbrid})
def on_json_loading_failed(self, e): if current_app is not None and current_app.debug: raise PARAMS_ERROR('Failed to decode JSON object: {0}'.format(e)) raise PARAMS_ERROR(u'参数异常')
def update_room(self): """更新房源信息""" if not is_admin(): raise TOKEN_ERROR(u'请使用管理员登录') data = parameter_required(('roid', )) roid = data.get('roid') # 房源主体的参数 # house信息 # medias信息 # tags # roomequi设备 # 公寓信息 house = data.pop('house', None) medias = data.pop('medias', []) tags = data.pop('tags', []) roomrequirment = data.pop('roomrequirment', None) room = self.sroom.get_room_by_roid(roid) if not room: raise NOT_FOUND(u'无此房源') room_data = { 'ROname': data.get('roname'), 'ROimage': data.get('roimage'), 'ROareanum': data.get('roareanum'), 'ROface': data.get('roface'), 'ROarea': data.get('roarea'), 'ROshowpriceunit': data.get('roshowpriceunit'), 'ROrenttype': data.get('rorenttype'), 'ROdecorationstyle': data.get('rodecorationstyle'), 'ROshowprice': data.get('roshowprice'), 'ROcitynum': data.get('rocitynum'), 'ROsubwayaround': data.get('rosubwayaround'), 'STFid': data.get('stfid') } room_data = {k: v for k, v in room_data.items() if v is not None} if not room_data: raise PARAMS_ERROR('修改room需要的参数缺失') room_updated = self.sroom.update_room_by_roid(roid, room_data) print('更新了room') if house: hoid = room.ROid houseinfo_required = ('hofloor', 'hototalfloor', 'hobedroomcount', 'hoparlorcount') parameter_required(houseinfo_required, datafrom=house) house_data = { 'HOfloor': house.get('hofloor'), 'HOtotalfloor': house.get('hototalfloor'), 'HObedroomcount': house.get('hobedroomcount'), 'HOparlorcount': house.get('hoparlorcount'), } house_updated = self.sroom.update_house_by_hoid(hoid, house_data) if medias: # 此处接受到的media数据是没有删除的和信添加的, 删除的将不会在传过来 # 此处有点罗嗦, 只需删除原来的数据, 再重新添加即可 deleted = self.sroom.delete_room_media_by_roid(roid) for new_media in medias: new_media['reid'] = str(uuid.uuid4()) new_media['roid'] = roid self.sroom.add_model('RoomMedia', new_media) print('添加多媒体') if tags: # 删除原来的tag self.sroom.delete_tag_by_roid(roid) print('删除了原来的tag') mod = {} mod['RoomTag'] = [] for tag in tags: tag['roid'] = roid tag['rtid'] = str(uuid.uuid4()) mod['RoomTag'].append(tag) self.sroom.add_models(mod) print('添加tag') if roomrequirment: self.sroom.delete_room_equirment_by_roid(roid) print('删除了原来的设备') roomrequirment['roid'] = roid roomrequirment['reid'] = str(uuid.uuid4()) self.sroom.add_model('RoomEquirment', roomrequirment) print('修改设备') if 'villegeid' in data: hoid = room.HOid # house = self.sroom.get_house_by_hoid(hoid) villege = self.sroom.get_villege_info_by_id(data.get('villegeid')) if not villege: raise PARAMS_ERROR(u'villege id有误') self.sroom.update_house_by_hoid(hoid, {'VIid': data.get('villegeid')}) cache.delete('room_detail::{}'.format(roid)) cache.delete("get_index_room_list_data") # 删除缓存 return Success(u'修改成功', {'roid': roid})