async def publish_product_to_excel(ns={}): if not ns.get('ids') and (not ns.get('result_from_search')): return { 'status': False, 'msg': '请传递产品ID' } result = [] if ns.get('ids'): db = DBPools() async with db.sqlorContext('kboss') as sor: ids = json.loads(ns.get('ids')) if isinstance(ns.get('ids'), str) else ns.get('ids') # 根据ids查询user_publish_product表 find_sql = """SELECT * FROM user_publish_product WHERE id IN (%s) AND del_flg = '0';""" % ','.join(["'%s'" % id for id in ids]) result = await sor.sqlExe(find_sql, {}) if not result: return { 'status': False, 'msg': '没有找到匹配的产品' } if ns.get('result_from_search'): result = ns.get('result_from_search') # 结果转换成 中文名称:值 的字典列表 field_mapping = { # 'id': 'id', # 'publish_type': '类型', 'img': '图片链接', # 'cart_flag': '是否支持显卡', # 'domain_name': '所属域名', # 'orgid': '所属机构', 'product_name': '商品名称', # 'product_category': '所属类别', 'company_name': '企业名称', # 'company_type': '公司类别', 'contact_person': '联系人', 'job_title': '职务', 'phone_number': '手机号码', 'email': '邮箱', 'cpu': 'cpu', 'memory': '内存', 'gpu': 'gpu', 'sys_disk': '系统盘', 'data_disk': '数据盘', 'net_card': '网卡', 'price': '价格', 'unit': '价格单位', 'discount': '价格折扣', 'discount_price': '折扣后价格', 'service_charge': '服务费', 'short_term': '是否短租', # 'priority': '排序优先级', 'status': '上架状态', # 'title': '主题', # 'label': '标签', # 'first_page': '是否推送到首页', # 'admin_push': '是否是运营人员提交', 'requirement_summary': '需求概述', 'related_parameters': '相关参数', 'application_scenario': '应用场景', 'audit_status': '审核状态', 'listing_status': '上架状态', 'reject_reason': '驳回原因', 'update_time': '更新时间', 'create_at': '创建时间', # 'publish_time': '发布日期', # 'del_flg': '删除标志' } # 转换字典键为中文 for data_dic in result: # 如果有图片路径 则转换为完整的图片链接 if data_dic.get('img') and data_dic['img'] != 'null': data_dic['img'] = 'https://' + data_dic['domain_name'] + '/idfile?path=' + data_dic['img'] else: data_dic['img'] = None # 转换字典键为中文 对应的值要有映射 # 拆分后:显式循环结构(便于后续处理) new_data_dic = {} for key, value in data_dic.items(): if key == 'publish_type': # 显示类型映射 if value == '1': value = '产品' elif value == '2': value = '需求' if key == 'audit_status': # 显示审核状态映射 if value == 'pending': value = '待审' elif value == 'approved': value = '通过' elif value == 'rejected': value = '拒绝' if key == 'listing_status': # 显示上架状态映射 if value == 'listing': value = '上架' elif value == 'delisting': value = '下架' if key == 'short_term': # 显示短租状态映射 if value == '1': value = '是' elif value == '0': value = '否' # 获取中文映射键 chinese_key = field_mapping.get(key) # 仅保留有映射关系的字段 if chinese_key is not None: new_data_dic[chinese_key] = value data_dic.clear() data_dic.update(new_data_dic) return { 'status': True, 'msg': 'export to excel success', 'data': result } async def get_user_role(ns={}): sor = ns['sor'] # get role ns['del_flg'] = '0' res_role = await sor.R('userrole', ns) if res_role: user_role = res_role[0] else: return { "status": False, "msg": "userrole table, user id can not find..." } roleid = user_role.get('roleid') # get role name role_name = await sor.R('role', {'id': roleid}) if role_name: role = role_name[0].get('role') else: return { "status": False, "msg": "role table, can not get role name" } return role async def publish_product_search(ns={}): """ 普通客户查看 运营查看自己提交内容 运营查看所有用户内容 运营: 待审 已审 上架 客户: 已审 上架 驳回 :param ns: :return: """ offset = ns.get('offset') manager_self = ns.get('manager_self') to_excel = ns.get('to_excel') if ns.get('userid'): userid = ns.get('userid') else: userid = await get_user() if not ns.get('url_link'): return { 'status': False, 'msg': 'url_link is required' } if not ns.get('publish_type'): return { 'status': False, 'msg': 'publish_type is required' } domain_name = ns.get('url_link').split("//")[1].split("/")[0] if 'localhost' in domain_name: domain_name = 'dev.opencomputing.cn' publish_type = ns.get('publish_type') page_size = int(ns['page_size']) if ns.get('page_size') else 8 current_page_param = int(ns['current_page']) if ns.get('current_page') else 1 current_page = (current_page_param - 1) * page_size db = DBPools() async with db.sqlorContext('kboss') as sor: # 区分运营和普通客户 user_list = await sor.R('users', {'id': userid}) if not user_list: return { 'status': False, 'msg': '没有找到匹配的用户' } orgid = user_list[0]['orgid'] org_parentid_li = await sor.R('organization', {'id': orgid}) org_parentid = org_parentid_li[0]['parentid'] user_role = await get_user_role({'userid': userid, 'sor': sor}) try: # 非客户角色 if user_role != '客户' and user_role != '管理员': ns['del_flg'] = '0' # 业主机构角色并且是只查看业主机构自己 manager_self==single if orgid == 'mIWUHBeeDM8mwAFPIQ8pS' and manager_self == 'single': count_sql = """SELECT COUNT(*) AS total_count, upr.* FROM user_publish_product AS upr LEFT JOIN organization AS org ON upr.orgid = org.id WHERE org.parentid IS NULL AND upr.del_flg = '0' AND upr.publish_type = '%s' ORDER BY upr.create_at DESC;""" % publish_type find_sql = """SELECT upr.* FROM user_publish_product AS upr LEFT JOIN organization AS org ON upr.orgid = org.id WHERE org.parentid IS NULL AND upr.del_flg = '0' AND upr.publish_type = '%s' ORDER BY upr.create_at DESC LIMIT %s OFFSET %s;""" % (publish_type, page_size, current_page) # 业主机构角色并且是查看所有(不包括业主机构自己) manager_self!=single (WHERE (org.id = '%s' or org.parentid = '%s') elif orgid == 'mIWUHBeeDM8mwAFPIQ8pS': count_sql = """SELECT COUNT(*) AS total_count, upr.* FROM user_publish_product AS upr LEFT JOIN organization AS org ON upr.orgid = org.id WHERE org.parentid = '%s' AND org.org_type != '1' AND upr.del_flg = '0' AND upr.publish_type = '%s' ORDER BY upr.create_at DESC;""" % (orgid, publish_type) find_sql = """SELECT upr.* FROM user_publish_product AS upr LEFT JOIN organization AS org ON upr.orgid = org.id WHERE org.parentid = '%s' AND org.org_type != '1' AND upr.del_flg = '0' AND upr.publish_type = '%s' ORDER BY upr.create_at DESC LIMIT %s OFFSET %s;""" % (orgid, publish_type, page_size, current_page) # 其他机构非用户角色 只查看自己 elif manager_self == 'single': count_sql = """SELECT COUNT(*) AS total_count, upr.* FROM user_publish_product AS upr LEFT JOIN organization AS org ON upr.orgid = org.id WHERE org.id = '%s' AND upr.del_flg = '0' AND upr.publish_type = '%s' ORDER BY upr.create_at DESC;""" % (orgid, publish_type) find_sql = """SELECT upr.* FROM user_publish_product AS upr LEFT JOIN organization AS org ON upr.orgid = org.id WHERE org.id = '%s' AND upr.del_flg = '0' AND upr.publish_type = '%s' ORDER BY upr.create_at DESC LIMIT %s OFFSET %s;""" % (orgid, publish_type, page_size, current_page) # 其他机构非用户角色查看所有客户 (WHERE (org.id = '%s' or org.parentid = '%s') AND upr.del_flg = '0') else: count_sql = """SELECT COUNT(*) AS total_count, upr.* FROM user_publish_product AS upr LEFT JOIN organization AS org ON upr.orgid = org.id WHERE org.parentid = '%s' AND upr.del_flg = '0' AND upr.publish_type = '%s' ORDER BY upr.create_at DESC;""" % (orgid, publish_type) find_sql = """SELECT upr.* FROM user_publish_product AS upr LEFT JOIN organization AS org ON upr.orgid = org.id WHERE (org.parentid = '%s' OR org.id = '%s') AND upr.del_flg = '0' AND upr.publish_type = '%s' ORDER BY upr.create_at DESC LIMIT %s OFFSET %s;""" % (orgid, orgid, publish_type, page_size, current_page) # 客户角色 else: ns['del_flg'] = '0' ns['orgid'] = user_list[0]['id'] count_sql = """SELECT COUNT(*) AS total_count, upr.* FROM user_publish_product AS upr WHERE upr.orgid = '%s' AND upr.del_flg = '0' AND upr.publish_type = '%s' ORDER BY upr.create_at DESC LIMIT %s OFFSET %s;""" % (orgid, publish_type, page_size, current_page) find_sql = """SELECT upr.* FROM user_publish_product AS upr WHERE upr.orgid = '%s' AND upr.del_flg = '0' AND upr.publish_type = '%s' ORDER BY upr.create_at DESC LIMIT %s OFFSET %s;""" % (orgid, publish_type, page_size, current_page) # 截取count_sql和find_sql中的 WHERE, 向WHERE后追加新的筛选条件 # 如果审核状态是pending,approved, 查询待审和已审的数据 if ns.get('audit_status') == 'pending,approved': count_sql = count_sql.split('WHERE')[0] + ' WHERE ' + "(upr.audit_status = 'pending' OR upr.audit_status = 'approved') AND " + count_sql.split('WHERE')[1] find_sql = find_sql.split('WHERE')[0] + ' WHERE ' + "(upr.audit_status = 'pending' OR upr.audit_status = 'approved') AND " + find_sql.split('WHERE')[1] elif ns.get('audit_status') == 'approved,rejected': count_sql = count_sql.split('WHERE')[0] + ' WHERE ' + "(upr.audit_status = 'rejected' OR upr.audit_status = 'approved') AND " + count_sql.split('WHERE')[1] find_sql = find_sql.split('WHERE')[0] + ' WHERE ' + "(upr.audit_status = 'rejected' OR upr.audit_status = 'approved') AND " + find_sql.split('WHERE')[1] elif ns.get('audit_status'): count_sql = count_sql.split('WHERE')[0] + ' WHERE ' + "upr.audit_status = '%s' AND " % ns.get('audit_status') + count_sql.split('WHERE')[1] find_sql = find_sql.split('WHERE')[0] + ' WHERE ' + "upr.audit_status = '%s' AND " % ns.get('audit_status') + find_sql.split('WHERE')[1] if ns.get('listing_status'): count_sql = count_sql.split('WHERE')[0] + ' WHERE ' + "upr.listing_status = '%s' AND " % ns.get('listing_status') + count_sql.split('WHERE')[1] find_sql = find_sql.split('WHERE')[0] + ' WHERE ' + "upr.listing_status = '%s' AND " % ns.get('listing_status') + find_sql.split('WHERE')[1] # 添加start_date和end_date筛选 if ns.get('start_date') and ns.get('end_date'): count_sql = count_sql.split('WHERE')[0] + ' WHERE ' + "(upr.create_at BETWEEN '%s' AND '%s') AND " % (ns.get('start_date'), ns.get('end_date')) + count_sql.split('WHERE')[1] find_sql = find_sql.split('WHERE')[0] + ' WHERE ' + "(upr.create_at BETWEEN '%s' AND '%s') AND " % (ns.get('start_date'), ns.get('end_date')) + find_sql.split('WHERE')[1] # 添加keyword模糊查询 只筛选产品名称 if ns.get('keyword'): count_sql = count_sql.split('WHERE')[0] + ' WHERE ' + "upr.product_name LIKE '%%%%%s%%%%' AND " % ns.get('keyword') + count_sql.split('WHERE')[1] find_sql = find_sql.split('WHERE')[0] + ' WHERE ' + "upr.product_name LIKE '%%%%%s%%%%' AND " % ns.get('keyword') + find_sql.split('WHERE')[1] print(count_sql) total_count = (await sor.sqlExe(count_sql, {}))[0]['total_count'] result = await sor.sqlExe(find_sql, {}) # 处理图片 for res in result: if res.get('img') and res['img'] != 'null': res['img'] = 'https://' + domain_name + '/idfile?path=' + res['img'] else: res['img'] = None # 读取产品类别表 轮询匹配result中的所有类别 product_category_list = await sor.R('user_publish_product_category', {'del_flg': '0'}) for res in result: for product_category in product_category_list: if product_category['id'] == res['product_category'].split(",")[0]: res['category_name'] = product_category['product_category'] break if to_excel == '1': res = await publish_product_to_excel({'result_from_search': result}) return { 'status': True, 'msg': 'search to excel success', 'data': res['data'] } else: return { 'status': True, 'msg': 'Requirements retrieved successfully', 'data': { "id": uuid(), "total_count": total_count, "page_size": page_size, "current_page": current_page_param, "product_list": result } } except Exception as e: return { 'status': False, 'msg': 'Failed to retrieve requirements, %s' % str(e) } ret = await publish_product_search(params_kw) return ret