diff --git a/TempLate/GERP/index.html b/TempLate/GERP/index.html
index 6abb691c..e63179e9 100644
--- a/TempLate/GERP/index.html
+++ b/TempLate/GERP/index.html
@@ -5,7 +5,7 @@
GERP 管理系统
-
+
@@ -14,7 +14,7 @@
-
+
diff --git a/gvsds/apps/gerp/app_manager.py b/gvsds/apps/gerp/app_manager.py
index f1b8b2d3..0bcee476 100644
--- a/gvsds/apps/gerp/app_manager.py
+++ b/gvsds/apps/gerp/app_manager.py
@@ -54,8 +54,14 @@ def _ToBytes(value):
return value
-def _AppFlat(app, tenant_installed=None, user_record=None, company_installed=None):
- """App 实例 → 市场/我的应用视图 dict"""
+def _AppFlat(app, tenant_installed=None, user_record=None, company_installed=None,
+ installed_companies=None):
+ """App 实例 → 市场/我的应用视图 dict
+
+ Args:
+ installed_companies: 管理员视角——可管理范围内已装该应用的公司名列表
+ (非管理员/未传时为空列表,前端仅在管理员视图渲染)
+ """
return {
'AppUUID': UUIDObj(app.AppUUID).str,
'AppCode': app.AppCode,
@@ -75,6 +81,8 @@ def _AppFlat(app, tenant_installed=None, user_record=None, company_installed=Non
'TenantAuth': tenant_installed.AuthStatus if tenant_installed else 0,
# 公司维度安装(指定公司安装时 TenantInstalled=0、CompanyInstalled=1)
'CompanyInstalled': 1 if company_installed and company_installed.InstallStatus == 1 else 0,
+ # 管理员视角:可管理范围内已装该应用的公司名(前端卡片标记"管理"依据)
+ 'InstalledCompanies': list(installed_companies or []),
'UserEnabled': 1 if user_record and user_record.UseStatus == 1 else 0,
'ApplyStatus': user_record.ApplyStatus if user_record else 0,
}
@@ -100,13 +108,16 @@ class AppManager:
return App.objects.filter(AppUUID=_ToBytes(AppUUID)).first()
@staticmethod
- def ListMarket(TenantUUID=None, UserUUID=None, CompanyUUID=None):
+ def ListMarket(TenantUUID=None, UserUUID=None, CompanyUUID=None, ManageableCompanies=None):
"""应用市场列表——每个应用附带租户/公司安装状态与个人启用/申请状态
Args:
TenantUUID: 当前租户 UUID(bytes/str/UUIDObj),用于标注"企业功能已安装"
UserUUID: 当前用户 UUID,用于标注"个人已启用/申请中"
CompanyUUID: 当前公司 UUID(可选),用于标注"指定公司已安装"
+ ManageableCompanies: 管理员可管理公司 UUID 列表(可选);
+ 传入时附加 InstalledCompanies=可管理范围内已装该应用的公司名,
+ 供前端对"非本公司的安装"也显示"管理"与卡片标记。
Returns:
list[dict]
@@ -127,6 +138,23 @@ class AppManager:
if user_bytes:
for ua in UserApp.objects.filter(UserUUID=user_bytes):
user_map[UUIDObj(ua.AppUUID).str] = ua
+ # 管理员视角:可管理范围内已装各应用的公司名(app str -> [公司名])
+ installed_companies_map = {}
+ manageable_bytes = [_ToBytes(c) for c in (ManageableCompanies or []) if _ToBytes(c)]
+ if manageable_bytes:
+ from gvsdsdk.models import Company as SdkCompany
+ company_name_map = {
+ _ToBytes(c.CompanyUUID): c.CompanyName
+ for c in SdkCompany.objects.filter(CompanyUUID__in=manageable_bytes)
+ }
+ app_bytes_list = [_ToBytes(a.AppUUID) for a in apps]
+ for ca in CompanyApp.objects.filter(
+ AppUUID__in=app_bytes_list,
+ CompanyUUID__in=manageable_bytes,
+ InstallStatus=1):
+ name = company_name_map.get(_ToBytes(ca.CompanyUUID))
+ if name:
+ installed_companies_map.setdefault(UUIDObj(ca.AppUUID).str, []).append(name)
result = []
for app in apps:
key = UUIDObj(app.AppUUID).str
@@ -135,6 +163,7 @@ class AppManager:
tenant_installed=tenant_map.get(key),
user_record=user_map.get(key),
company_installed=company_map.get(key),
+ installed_companies=installed_companies_map.get(key),
))
return result
diff --git a/gvsds/apps/gerp/views/app.py b/gvsds/apps/gerp/views/app.py
index 44e19c51..91571b14 100644
--- a/gvsds/apps/gerp/views/app.py
+++ b/gvsds/apps/gerp/views/app.py
@@ -20,6 +20,7 @@ import logging
from rest_framework.permissions import IsAuthenticated
from rest_framework.response import Response
+from gvsdsdk.auth.admin_service import IsAdmin
from gvsdsdk.auth.permissions import IsAdminUser
from gvsdsdk.model_utils import UUIDObj
@@ -109,10 +110,15 @@ class AppMarketView(ELTAuthenticatedAPIView):
permission_classes = [IsAuthenticated]
def get(self, request):
+ # 管理员视角:传入可管理公司列表,附加 InstalledCompanies(管理范围内已装公司名)
+ manageable = None
+ if IsAdmin(request=request):
+ manageable, _scope = AppManager.GetManageableCompanies(request)
data = AppManager.ListMarket(
TenantUUID=_GetTenantBytes(request),
UserUUID=_GetUserBytes(request),
CompanyUUID=_GetCompanyBytes(request),
+ ManageableCompanies=manageable,
)
return Response({'code': 0, 'data': {'list': data, 'total': len(data)}})