refactor(gerp): 收敛 SAAS 残留裸 ORM(doc 视图/统计任务/审计清理/工单通知/viewsets 换源)

This commit is contained in:
TermiNexus committed 2026-08-07 23:52:30 +08:00
1 parent 5405286734
commit d7f017d396
6 files changed
+73 -72

No files matched your search

+36 -7
View File
@@ -39,13 +39,19 @@ class DocManager:
return None
@staticmethod
def AddDocument(Title, Content=''):
"""新建文档"""
return CommunityDocument.objects.create(
DocUUID=uuid.uuid4().bytes,
DocTitle=Title,
DocContent=Content,
)
def AddDocument(Title, Content='', SerieUUID=None):
"""新建文档(可选绑定系列)"""
create_data = {
'DocUUID': uuid.uuid4().bytes,
'DocTitle': Title,
'DocContent': Content,
}
if SerieUUID:
serie = DocManager.GetSerie(SerieUUID)
if serie is not None:
# DocSerieUUID 为 ForeignKey:传实例
create_data['DocSerieUUID'] = serie
return CommunityDocument.objects.create(**create_data)
@staticmethod
def ModifyDocument(DocUUID, Data):
@@ -127,3 +133,26 @@ class DocManager:
return False, '系列不存在'
serie.delete()
return True, None
# ========== 系列附加查询(供视图收敛裸 ORM) ==========
@staticmethod
def GetSerie(DocSerieUUID):
"""获取系列实例(不存在返回 None)"""
try:
return CommunitySeries.objects.get(DocSerieUUID=UUIDObj(DocSerieUUID).bytes)
except (CommunitySeries.DoesNotExist, ValueError, AttributeError):
return None
@staticmethod
def SerieNameExists(DocSerieName):
"""判断系列名是否已存在"""
return CommunitySeries.objects.filter(DocSerieName=DocSerieName).exists()
@staticmethod
def SerieHasDocuments(DocSerieUUID):
"""判断系列下是否还有文档(防删除)"""
serie = DocManager.GetSerie(DocSerieUUID)
if serie is None:
return False
return CommunityDocument.objects.filter(DocSerieUUID=serie).exists()
+26 -51
View File
@@ -1,7 +1,6 @@
"""模块:Doc 社区文档视图
提供社区文档与系列的增删改查与访问控制。"""
import uuid
import datetime
from rest_framework import viewsets
from rest_framework.decorators import action
@@ -14,6 +13,7 @@ from .serializers import (
DocAddSerializer, DocModifySerializer,
SerieAddSerializer, SerieDeleteSerializer,
)
from .manager import DocManager
from gvsdsdk.model_utils import UUIDObj
@@ -54,9 +54,8 @@ class CommunityDocumentViewSet(viewsets.ModelViewSet):
doc_bytes = UUIDObj(doc_uuid).bytes
if not doc_bytes:
return Response({'code': 1, 'msg': 'DocUUID格式错误'}, status=400)
try:
doc = CommunityDocument.objects.get(DocUUID=doc_bytes)
except CommunityDocument.DoesNotExist:
doc = DocManager.GetDocument(doc_uuid)
if doc is None:
return Response({'code': 1, 'msg': '文档不存在'}, status=404)
return Response({
'code': 0,
@@ -74,22 +73,13 @@ class CommunityDocumentViewSet(viewsets.ModelViewSet):
user_uuid = request.user.UserUUID
serie_uuid_str = data.get('DocSerieUUID')
serie = None
if serie_uuid_str:
serie_bytes = UUIDObj(serie_uuid_str).bytes
if not serie_bytes:
if not UUIDObj(serie_uuid_str).bytes:
return Response({'code': 1, 'msg': 'DocSerieUUID格式错误'}, status=400)
try:
serie = CommunitySeries.objects.get(DocSerieUUID=serie_bytes)
except CommunitySeries.DoesNotExist:
if DocManager.GetSerie(serie_uuid_str) is None:
return Response({'code': 1, 'msg': '系列不存在'}, status=400)
doc = CommunityDocument.objects.create(
DocUUID=uuid.uuid4().bytes,
DocTitle=data['DocTitle'],
DocContent='',
DocSerieUUID=serie,
)
doc = DocManager.AddDocument(Title=data['DocTitle'], Content='', SerieUUID=serie_uuid_str)
return Response({
'code': 0,
'msg': '添加成功',
@@ -102,23 +92,11 @@ class CommunityDocumentViewSet(viewsets.ModelViewSet):
ser.IsValid(raise_exception=True)
data = ser.ValidatedData
doc_uuid_str = data.get('DocUUID')
doc_bytes = UUIDObj(doc_uuid_str).bytes
if not doc_bytes:
if not UUIDObj(doc_uuid_str).bytes:
return Response({'code': 1, 'msg': 'DocUUID格式错误'}, status=400)
try:
doc = CommunityDocument.objects.get(DocUUID=doc_bytes)
except CommunityDocument.DoesNotExist:
return Response({'code': 1, 'msg': '文档不存在'}, status=404)
update_fields = []
if 'DocTitle' in data:
doc.DocTitle = data['DocTitle']
update_fields.append('DocTitle')
if 'DocContent' in data:
doc.DocContent = data['DocContent']
update_fields.append('DocContent')
if update_fields:
doc.save(update_fields=update_fields)
ok, err = DocManager.ModifyDocument(doc_uuid_str, data)
if not ok:
return Response({'code': 1, 'msg': err or '修改失败'}, status=404)
return Response({'code': 0, 'msg': '修改成功'})
@action(detail=False, methods=['post'])
@@ -129,11 +107,12 @@ class CommunityDocumentViewSet(viewsets.ModelViewSet):
doc_bytes = UUIDObj(doc_uuid).bytes
if not doc_bytes:
return Response({'code': 1, 'msg': 'DocUUID格式错误'}, status=400)
try:
doc = CommunityDocument.objects.get(DocUUID=doc_bytes)
except CommunityDocument.DoesNotExist:
doc = DocManager.GetDocument(doc_uuid)
if doc is None:
return Response({'code': 1, 'msg': '文档不存在'}, status=404)
doc.delete()
ok, err = DocManager.DeleteDocument(doc_uuid)
if not ok:
return Response({'code': 1, 'msg': err or '删除失败'}, status=404)
return Response({'code': 0, 'msg': '删除成功'})
@@ -167,14 +146,13 @@ class CommunitySeriesViewSet(viewsets.ModelViewSet):
data = ser.ValidatedData
user_uuid = request.user.UserUUID
if CommunitySeries.objects.filter(DocSerieName=data['DocSerieName']).exists():
if DocManager.SerieNameExists(data['DocSerieName']):
return Response({'code': 1, 'msg': '系列名称已存在'}, status=409)
serie = CommunitySeries.objects.create(
DocSerieUUID=uuid.uuid4().bytes,
DocSerieName=data['DocSerieName'],
DocAuthorUserUUID=user_uuid,
)
serie = DocManager.AddSeries({
'DocSerieName': data['DocSerieName'],
'DocAuthorUserUUID': user_uuid,
})
return Response({
'code': 0,
'msg': '添加成功',
@@ -187,16 +165,13 @@ class CommunitySeriesViewSet(viewsets.ModelViewSet):
ser.IsValid(raise_exception=True)
data = ser.ValidatedData
serie_uuid_str = data.get('DocSerieUUID')
serie_bytes = UUIDObj(serie_uuid_str).bytes
if not serie_bytes:
if not UUIDObj(serie_uuid_str).bytes:
return Response({'code': 1, 'msg': 'DocSerieUUID格式错误'}, status=400)
try:
serie = CommunitySeries.objects.get(DocSerieUUID=serie_bytes)
except CommunitySeries.DoesNotExist:
if DocManager.GetSerie(serie_uuid_str) is None:
return Response({'code': 1, 'msg': '系列不存在'}, status=404)
if CommunityDocument.objects.filter(DocSerieUUID=serie).exists():
if DocManager.SerieHasDocuments(serie_uuid_str):
return Response({'code': 1, 'msg': '该系列下还有文档,无法删除'}, status=400)
serie.delete()
ok, err = DocManager.DeleteSerie(serie_uuid_str)
if not ok:
return Response({'code': 1, 'msg': err or '删除失败'}, status=404)
return Response({'code': 0, 'msg': '删除成功'})
+3 -3
View File
@@ -1334,11 +1334,11 @@ class FormService(FormServiceBase):
def _send_workorder_notify(self, order, receiver_uuid, title, content):
"""工单指派/状态流转时向用户发送站内信通知(MsgType=2 工单通知)"""
try:
from gvsds.apps.gerp.models import Message as _WoMsg
from gvsdsdk.models import Message as _WoMsg
_WoMsg.objects.create(
MessageUUID=uuid.uuid4().bytes,
SenderUUID_id=self._current_user_uuid_bytes(),
ReceiverUUID_id=receiver_uuid,
SenderUUID=self._current_user_uuid_bytes(),
ReceiverUUID=receiver_uuid,
Title=title,
Content=content,
MsgType=2,
@@ -11,7 +11,7 @@ import logging
from django.core.management.base import BaseCommand
from django.utils import timezone
from gvsds.apps.gerp.models import AuditLog
from gvsdsdk.models import AuditLog
logger = logging.getLogger(__name__)
+6 -9
View File
@@ -15,6 +15,7 @@ from gvsdsdk.models import (
PositionTemplatePermission as SdkPositionTemplatePermission,
CompanyInfo as SdkCompanyInfo,
DepartmentSMTM as SdkDepartmentSMTM,
UserRoleDepartment as SdkUserRoleDepartment,
Workgroup as SdkWorkgroup,
SimulatedTrigger as SdkSimulatedTrigger,
CashReceiptsPaymentsLedger as SdkCashReceiptsPaymentsLedger,
@@ -37,10 +38,6 @@ from gvsdsdk.models import (
Position as SdkPosition,
)
from . import ELTAuthenticatedAPIView
from ..models import (
UserRoleDepartment,
DepartmentSMTM,
)
from ..serializers import (
TenantSerializer, CompanyInfoSerializer, CompanySerializer,
DepartmentSerializer, RoleSerializer, UserRoleSerializer,
@@ -180,7 +177,7 @@ class DepartmentViewSet(CompanyScopedMixin, viewsets.ModelViewSet):
dept = DepartmentManager.GetDepartmentByUUID(dept_bytes)
if dept and UUIDObj(dept.CompanyUUID).bytes != current_company:
return Response({'code': 403, 'msg': '无权操作:目标部门不属于当前公司'}, status=403)
smtm, created = DepartmentSMTM.objects.update_or_create(
smtm, created = SdkDepartmentSMTM.objects.update_or_create(
DepartmentUUID=dept_bytes,
UserUUID=user_bytes,
defaults={'PersonInChargeStatus': status_val}
@@ -338,7 +335,7 @@ class UserRoleViewSet(CompanyScopedMixin, viewsets.ModelViewSet):
# 批量取"用户-角色对 → 首个部门",供部门树浏览面板分组
urd_dept_map = {}
try:
urd_rows = UserRoleDepartment.objects.filter(UserRoleUUID__in=[
urd_rows = SdkUserRoleDepartment.objects.filter(UserRoleUUID__in=[
ur.UserRoleUUID for ur in page if ur.UserRoleUUID
])
for u in urd_rows:
@@ -347,11 +344,11 @@ class UserRoleViewSet(CompanyScopedMixin, viewsets.ModelViewSet):
except Exception:
_key = str(u.UserRoleUUID)
if _key not in urd_dept_map:
# DeptUUID 为 ForeignKey:用 _id 取原始列值(BINARY(16))
# SDK UserRoleDepartment.DeptUUID 为 UUIDField:取字段值转字符串
try:
urd_dept_map[_key] = str(UUIDObj(u.DeptUUID_id))
urd_dept_map[_key] = str(UUIDObj(u.DeptUUID))
except Exception:
urd_dept_map[_key] = str(u.DeptUUID_id)
urd_dept_map[_key] = str(u.DeptUUID)
except Exception:
urd_dept_map = {}
data = []
+1 -1
View File
@@ -94,7 +94,7 @@ def BuildDailyRankings(self):
def _GetActiveTenants():
"""获取所有活跃租户的 UUID 列表(bytes 形式)。"""
try:
from gvsds.apps.gerp.models import Tenant
from gvsdsdk.models import Tenant
return [t.TenantUUID.bytes for t in Tenant.objects.filter(TenantStatus=1)]
except Exception:
logger.warning('[StatsTasks] 获取租户列表失败,返回空列表', exc_info=True)