main #16

Merged
charles merged 2 commits from main into prod 2025-08-20 14:32:58 +08:00
8 changed files with 128 additions and 30 deletions

View File

@ -88,7 +88,7 @@ async def publish_product_add(ns={}):
ns_dic['discount_price'] = ns['price']
user_role = await get_user_role({'userid': userid, 'sor': sor})
# 非客户角色不需要审批
if user_role != '客户':
if user_role != '客户' and user_role != '管理员':
ns['status'] = '1'
ns_dic['audit_status'] = 'approved'
ns_dic['listing_status'] = 'listing'

View File

@ -197,7 +197,7 @@ async def publish_product_search(ns={}):
user_role = await get_user_role({'userid': userid, 'sor': sor})
try:
# 非客户角色
if user_role != '客户':
if user_role != '客户' and user_role != '管理员':
ns['del_flg'] = '0'
# 业主机构角色并且是只查看业主机构自己 manager_self==single
@ -227,7 +227,7 @@ async def publish_product_search(ns={}):
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' 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.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'
@ -240,6 +240,10 @@ async def publish_product_search(ns={}):
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]

View File

@ -28,8 +28,8 @@ async def publish_product_search_first_page(ns={}):
count_sql = """SELECT COUNT(*) AS total_count FROM user_publish_product WHERE domain_name = '%s' AND first_page = '1' AND audit_status = 'approved' AND listing_status = 'listing' AND del_flg = '0' AND publish_type = '%s' ORDER BY create_at DESC;""" % (domain_name, publish_type)
find_sql = """SELECT upp.* FROM user_publish_product AS upp INNER JOIN user_publish_product_category AS uppc ON upp.product_category LIKE uppc.id WHERE upp.domain_name = '%s' AND upp.first_page = '1' AND upp.audit_status = 'approved' AND upp.del_flg = '0' AND upp.publish_type = '%s' ORDER BY uppc.priority ASC, upp.create_at DESC LIMIT %s OFFSET %s;""" % (domain_name, publish_type, page_size, current_page)
elif to_page == 'square' and product_category:
count_sql = """SELECT COUNT(*) AS total_count FROM user_publish_product WHERE domain_name = '%s' AND product_category LIKE """ % domain_name + """'%%""" + product_category + """%%'""" + """ AND audit_status = 'approved' AND del_flg = '0' AND publish_type = '%s' ORDER BY create_at DESC;""" % publish_type
find_sql = """SELECT * FROM user_publish_product WHERE domain_name = '%s' AND product_category LIKE """ % domain_name + """'%%""" + product_category + """%%'""" + """ AND audit_status = 'approved' AND del_flg = '0' AND publish_type = '%s' ORDER BY create_at DESC LIMIT %s OFFSET %s;""" % (publish_type, page_size, current_page)
count_sql = """SELECT COUNT(*) AS total_count FROM user_publish_product WHERE domain_name = '%s' AND product_category LIKE """ % domain_name + """'%%""" + product_category + """%%'""" + """ AND audit_status = 'approved' AND listing_status = 'listing' AND del_flg = '0' AND publish_type = '%s' ORDER BY create_at DESC;""" % publish_type
find_sql = """SELECT * FROM user_publish_product WHERE domain_name = '%s' AND product_category LIKE """ % domain_name + """'%%""" + product_category + """%%'""" + """ AND audit_status = 'approved' AND listing_status = 'listing' AND del_flg = '0' AND publish_type = '%s' ORDER BY create_at DESC LIMIT %s OFFSET %s;""" % (publish_type, page_size, current_page)
elif to_page == 'square':
count_sql = """SELECT COUNT(*) AS total_count FROM user_publish_product WHERE domain_name = '%s' AND audit_status = 'approved' AND del_flg = '0' AND publish_type = '%s' ORDER BY create_at DESC;""" % (domain_name, publish_type)
find_sql = """SELECT * FROM user_publish_product WHERE domain_name = '%s' AND audit_status = 'approved' AND del_flg = '0' AND publish_type = '%s' ORDER BY create_at DESC LIMIT %s OFFSET %s;""" % (domain_name, publish_type, page_size, current_page)

View File

@ -66,7 +66,7 @@ async def publish_product_update(ns={}):
user_role = await get_user_role({'userid': userid, 'sor': sor})
# 编辑状态
# 非客户角色编辑客户的产品
if user_role != '客户' and ns.get('orgid') != orgid:
if user_role != '客户' and user_role != '管理员' and ns.get('orgid') != orgid:
# 非客户角色审核客户的产品
# 如果是待审状态 更新审核状态为通过 上架状态为上架 清空驳回原因
if ns.get('audit_status') == 'approved':
@ -86,7 +86,7 @@ async def publish_product_update(ns={}):
ns_dic['publish_time'] = None
# 非客户角色编辑自己的产品 默认审批通过和发布成功
elif user_role != '客户':
elif user_role != '客户' and user_role != '管理员':
# 运营删除自己的产品
if ns.get('del_flg') == '1':
pass
@ -100,9 +100,28 @@ async def publish_product_update(ns={}):
# 客户编辑以后 审核状态是: 待审 上架状态是:空
else:
# 客户要下架自己的产品
if ns.get('listing_status') == 'delisting' or ns.get('listing_status') == 'listing':
# 如果状态是审批中和未上架
exists_status = await sor.R('user_publish_product', {'id': ns.get('id')})
if exists_status[0]['audit_status'] == 'pending' and (not exists_status[0]['listing_status']):
return {
'status': False,
'msg': '审批中的产品操作'
}
if ns.get('listing_status') == 'delisting':
ns_dic['audit_status'] = None
ns_dic['listing_status'] = 'delisting'
ns_dic['publish_time'] = None
if ns.get('listing_status') == 'listing':
if exists_status[0]['audit_status'] == 'approved':
ns_dic['listing_status'] = 'listing'
ns_dic['publish_time'] = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
else:
return {
'status': False,
'msg': '审批未通过,不能上架'
}
# 客户仅编辑不是下架产品
else:
ns_dic['audit_status'] = 'pending'

View File

@ -14,7 +14,8 @@ export default {
return {
role:{
role_type:'customer',
audit_status:'approved'
audit_status:'approved,rejected',
type:'user'
}
}
},

View File

@ -22,12 +22,18 @@
</div>
<div class="table-box">
<div style="margin-bottom: 10px;">
<el-radio-group v-if="role.type == 'app'" v-model="searchData.radioType" class="radio-group"
<el-radio-group v-if="role.type == 'user'" v-model="searchData.radioType" class="radio-group"
size="mini" @change="handleRadioChange">
<el-radio-button v-for="item in radioOptions" :key="item.value" :label="item.value">
{{ item.label }}
</el-radio-button>
</el-radio-group>
<el-radio-group v-if="role.type == 'app'" v-model="searchData.radioType" class="radio-group"
size="mini" @change="handleRadioChange">
<el-radio-button v-for="item in userMap" :key="item.value" :label="item.value">
{{ item.label }}
</el-radio-button>
</el-radio-group>
<!-- <el-button style="margin-left: 10px;" size="mini" @click="openAddDialog">
<i class="el-icon-plus"></i> 添加{{ searchData.radioType === '1' || searchData.radioType === '3' ?
'需求' : '商品' }}
@ -39,7 +45,7 @@
<el-table size="large" border height="calc(100vh - 210px)" v-loading="loading" :data="tableData"
style="width: 100%;border:1px solid #ccc;" element-loading-text="加载中..."
element-loading-spinner="el-icon-loading" element-loading-background="rgba(255, 255, 255, 0.8)">
<el-table-column prop="date" label="图片" width="180">
<el-table-column v-if="searchData.radioType!='1'&&searchData.radioType!='3'" prop="date" label="图片" width="180">
<template slot-scope="scope">
<el-image v-if="scope.row.img" :src="scope.row.img || 'https://www.kaiyuancloud.cn/idfile?path=logo_ncmatch.png'"
style="width: 80px; height: 60px;border: 1px solid #ccc;border-radius: 6px;"
@ -86,11 +92,11 @@
<el-button v-if="role.role_type == 'customer'" type="text" size="large"
@click="openDetail(scope.row, 2)">审核</el-button>
<el-button
:disabled="scope.row.audit_status=='rejected'||scope.row.audit_status === 'approved' && scope.row.listing_status === 'listing'"
:disabled="scope.row.audit_status !== 'approved' || scope.row.listing_status === 'listing'"
@click="grounding(scope.row, 'listing')" type="text" style="color: #67C23A;"
size="large">上架</el-button>
<el-button
:disabled="scope.row.audit_status=='rejected'||scope.row.audit_status === 'approved' && scope.row.listing_status === 'delisting'"
:disabled="scope.row.audit_status !== 'approved' || scope.row.listing_status === 'delisting'"
@click="grounding(scope.row, 'delisting')" type="text" size="large">下架</el-button>
<el-button type="text" size="large" @click="exportData(scope.row)">导出</el-button>
<el-popconfirm v-if="role.role_type == 'customer'" title="确定删除该条目吗?"
@ -160,6 +166,20 @@ export default {
current_page: 1,
page_size: 8,
},
userMap: [
{
label: '用户需求',
value: '1',
publish_type: '2',
manager_self: null,
},
{
label: '用户商品',
value: '2',
publish_type: '1',
manager_self: null,
},
],
radioMap: {
'1': {
label: '用户需求',
@ -246,7 +266,15 @@ export default {
this.searchData.audit_status = this.role.audit_status;
}
if (this.role && this.role.publish_type) {
if (this.role.type === 'app') {
this.searchData.publish_type = this.role.publish_type;
} else if (this.role.type === 'user') {
const selectedItem = this.userMap.find(item => item.value === this.role.publish_type);
if (selectedItem) {
this.searchData.publish_type = selectedItem.publish_type;
this.searchData.manager_self = selectedItem.manager_self;
}
}
}
this.getTableData();
},
@ -321,8 +349,22 @@ export default {
this.sendProductData = item;
},
handleRadioChange(value) {
//
if (this.role.type === 'user') {
// user
const selectedItem = this.userMap.find(item => item.value === value);
if (selectedItem) {
this.searchData.publish_type = selectedItem.publish_type;
this.searchData.manager_self = selectedItem.manager_self;
}
} else {
// app 使 radioMap
if (this.radioMap[value]) {
this.searchData.publish_type = this.radioMap[value].publish_type;
this.searchData.manager_self = this.radioMap[value].manager_self;
}
}
//
this.searchData.current_page = 1;
this.getTableData();
@ -403,7 +445,12 @@ export default {
this.loading = true;
if(to_excel==='1'){
this.searchData.to_excel=to_excel
reqSearchByMangement({url_link:window.location.href,to_excel:to_excel,publish_type:this.searchData.publish_type}).then(res => {
reqSearchByMangement({
url_link: window.location.href,
to_excel: to_excel,
publish_type: this.searchData.publish_type,
manager_self: this.searchData.radioType=='4'||this.searchData.radioType=='3'?'single':null
}).then(res => {
console.log(res);
if (res.status) {
// Workbook
@ -420,7 +467,34 @@ export default {
this.loading = false;
})
}else{
reqSearchByMangement(this.searchData).then(res => {
// manager_self
let manager_self = null;
let publish_type = null;
if (this.role.type === 'user') {
const selectedItem = this.userMap.find(item => item.value === this.searchData.radioType);
if (selectedItem) {
publish_type = selectedItem.publish_type;
manager_self = this.searchData.radioType=='4'||this.searchData.radioType=='3'?'single':null;
}
} else if (this.role.type === 'app') {
if (this.radioMap[this.searchData.radioType]) {
publish_type = this.radioMap[this.searchData.radioType].publish_type;
manager_self = this.searchData.radioType=='4'||this.searchData.radioType=='3'?'single':null;
}
}
//
const requestData = {
...this.searchData,
publish_type: publish_type,
manager_self: manager_self
};
console.log('请求参数:', requestData);
requestData.manager_self=this.searchData.radioType=='4'||this.searchData.radioType=='3'?'single':null
requestData.publish_type = this.searchData.radioType=='1'||this.searchData.radioType=='3'?'2':'1'
reqSearchByMangement(requestData).then(res => {
console.log(res);
if (res.status) {
this.tableData = res.data.product_list;

View File

@ -19,7 +19,7 @@ export default {
}
},
created(){
this.initData()
// this.initData()
},
}
</script>

View File

@ -274,11 +274,11 @@ export default Vue.extend({
<span class="leftText">
NCMatch &nbsp;&nbsp;
</span>
<span class="rightText" style="margin-left: 10px;"> 您身边的AI管家</span>
<span class="rightText" style="margin-left: 10px;"> 算力供需对接平台</span>
</span>
<!-- <span class="description">支持模型训练推理和数据处理灵活配置助您高效释放AI潜能</span>-->
<ul style="margin-top: 50px" class="tagUl">
<li> AI </li>
<li>海量资源 <span style="display: inline-block;margin: 0 15px;"></span> 物美价廉</li>
</ul>
</div>
</div>