async def CheckSmsCode(ns={}): db = DBPools() async with db.sqlorContext('kboss') as sor: vcode_sql = "select * from sms_record where mobile = '%s' order by send_time desc limit 1;" % ns.get('mobile') vcode_li = await sor.sqlExe(vcode_sql, {}) if vcode_li: date_str = vcode_li[0]['send_time'] target_datetime = datetime.datetime.strptime(date_str, '%Y-%m-%d %H:%M:%S') delta = datetime.datetime.now() - target_datetime # 阈值限制 10 分钟 if delta.total_seconds() > 60 * 10: return { 'status': False, 'msg': '验证码超时失效' } if json.loads(vcode_li[0]['message']).get('code') == ns.get('vcode'): return { 'status': True, 'msg': '验证码验证通过' } return { 'status': False, 'msg': '验证码错误' } async def apply(ns={}): """ userid传用户id customer客户名 phone客户电话 unit客户单位 product客户资源名称 resources客户资源需求 :param ns: :return: """ db = DBPools() async with db.sqlorContext('kboss') as sor: if ns.get('userid'): ns['product'] = 1 user = await sor.R('users', {'id': await get_user()}) if not user: return {'status': False, 'msg': 'User does not exist'} if not ns['customer'] or not ns['phone'] or not ns['product'] or not ns['unit'] or not ns['resources']: return {'status': False, 'msg': 'Required information is missing'} uuids = str(uuid()) uuid_digits = 21 uuid_gen = uuids[:uuid_digits].replace('-', '') data = { 'id': uuid_gen, 'custid': ns['userid'], 'customer': ns['customer'], 'phone': ns['phone'], 'unit': ns['unit'], 'product': ns['product'], 'resources': str(ns['resources']) } await sor.C('cust_message', data) orgid = user[0]['orgid'] sales = await sor.R('customer', {'customerid': orgid}) if sales: for sale in sales: saleid = sale['salemanid'] sales_info = await sor.R('users', {'id': saleid}) if sales_info: # print(sales_info) sales_mobile = sales_info[0]['mobile'] # print(sales_mobile) #发送短信 sms_send_dict_saleman = { 'customer': ns['customer'], 'phone': ns['phone'], } # print(sms_send_dict_saleman) try: # 执行发送短信 await send_vcode(sales_mobile, '客户申请试用留言通知', sms_send_dict_saleman) except Exception as e: return {'status': False, 'msg': f'SMS send failed: {str(e)}'} # 发送站内信 msg_config = await sor.R('message_config', {'msgtype': '客户申请试用留言通知','del_flg':'0'}) if not msg_config: return {'status': False, 'msg': '没有找到id记录'} else: msgtype_template = msg_config[0]['msgtype'] msgstext_template = msg_config[0]['msgtext'] msgstatus = msg_config[0]['msgstatus'] if msgstatus == '1': return {'status': False, 'msg': '状态禁止发送站内信'} elif not msgtype_template: return {'status': False, 'msg': '找不到该模板类型'} elif not msgstext_template: return {'status': False, 'msg': '找不到模板内容'} else: customer = ns['customer'] phone = ns['phone'] product = ns['product'] resources = str(ns['resources']) msgtype = msgtype_template msgtext = msgstext_template.format(customer=customer, phone=phone, resources=resources, product=product) uid = str(uuid()) uid_gen = uid[:21].replace('-', '') ns_saleman = { 'id': uid_gen, 'senderid': 'inner', 'receiverid': sales_info[0]['id'], 'msgtype': msgtype, 'msgtext': msgtext } await sor.C('message', ns_saleman) else: ns_inten = { "id": uuid(), "name": ns.get('customer'), "mobile": ns.get('phone'), "email": "", "organization": ns.get('unit'), "intention": str(ns.get('resources')) } await sor.C('intention_customer', ns_inten) return {'status': True, 'msg': 'user is not bingding saleman'} return {'status': True, 'msg': 'Data inserted successfully and sales information retrieved'} else: # check mobile vcode if ns.get('phone') and ns.get('vcode'): check_vcode = await CheckSmsCode({'mobile': ns.get('phone'), 'vcode': ns.get('vcode')}) if not check_vcode.get('status'): return check_vcode else: return { 'status': False, 'msg': '没有获取到手机号或短信验证码' } ns_inten = { "id": uuid(), "name": ns.get('customer'), "mobile": ns.get('phone'), "email": "", "organization": ns.get('unit'), "intention": "1" } await sor.C('intention_customer', ns_inten) return {'status': True, 'msg': 'User ID is missing'} ret = await apply(params_kw) return ret