309 lines
15 KiB
Plaintext
309 lines
15 KiB
Plaintext
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 |