Skip to content

Commit 76f37a1

Browse files
authored
Merge pull request #6 from wccdev/dev
Dev
2 parents eb86bb1 + 24f9771 commit 76f37a1

18 files changed

+865
-208
lines changed

drf_oa_workflow/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,4 @@
22

33
__author__ = """Leslie Chan"""
44
__email__ = '[email protected]'
5-
__version__ = '0.5.0'
5+
__version__ = '0.5.1'

drf_oa_workflow/admin.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
from django.contrib import admin
2-
from django.contrib.auth import get_user_model
2+
3+
# from django.contrib.auth import get_user_model
34
from django.db.models import Case, F, Value, When
45

56
from .models import OaUserInfo

drf_oa_workflow/choices.py

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
from django.db.models import IntegerChoices, TextChoices
2+
3+
4+
class TransmitTypes(IntegerChoices):
5+
FORWARD = 1, "转发"
6+
CONSULTATION = 2, "意见征询"
7+
TRANSFER = 3, "转办"
8+
9+
10+
class WFOperationTypes(IntegerChoices):
11+
SUBMIT_WITHOUT_WF = 0, "不走流程提交"
12+
SUBMIT = 1, "提交"
13+
APPROVAL = 2, "批准"
14+
SAVE = 3, "保存"
15+
FORWARD = 4, "转发"
16+
FORWARD_ROLLBACK = 5, "转发收回"
17+
TRANSFER = 6, "转办"
18+
MARKUP = 7, "批注"
19+
REJECT = 8, "退回"
20+
WITHDRAW = 9, "撤回"
21+
CONSULTATION = 10, "意见征询"
22+
RE_SUBMIT = 11, "重新提交" # 流程被退回时
23+
DO_FORCE_RECOVER = 12, "强制收回"
24+
DO_DELETE = 13, "删除流程"
25+
26+
TERMINATE = 50, "终止"
27+
28+
29+
class OAWorkflowLogTypes(TextChoices):
30+
# FIXME 确认OA不同环境关于LOGTYPE字段值与定义是否相同
31+
APPROVAL = "0", "批准"
32+
SAVE = "1", "保存"
33+
SUBMIT = "2", "提交"
34+
REJECT = "3", "退回"
35+
REOPEN = "4", "重新打开"
36+
DELETE = "5", "删除"
37+
ACTIVE = "6", "激活"
38+
FORWARD = "7", "转发"
39+
MARKUP = "9", "批注"
40+
CONSULTATION = "a", "意见征询"
41+
REPLY = "b", "意见征询回复"
42+
CIRCULATION = "c", "传阅"
43+
FORCE_ARCHIVE = "e", "强制归档"
44+
TRANSFER = "h", "转办"
45+
INTERVENE = "i", "流程干预"
46+
TRANSFER_REPLY = "j", "转办反馈"
47+
WITHDRAW = "r", "撤回"
48+
SUPERVISING = "s", "督办"
49+
CC = "t", "抄送"
50+
END_CONSULTATION = "x", "结束征询"
51+
CONSULTATION_TRANSFER = "z", "征询转办"
52+
53+
54+
class OAWFCOViewType(IntegerChoices):
55+
VIEWED = -2, "已查看过流程,不显示任何new标记"
56+
VIEWED_WITHOUT_NEWEST = -1, "查看过流程后又有新的未查看回复,显示黄色new标记"
57+
UN_VIEW = 0, "接收到流程且未查看过,显示红色new标记"
58+
59+
60+
class OAWFCOIsRemarks(IntegerChoices):
61+
NOT_OPERATED = 0, "未操作"
62+
TRANS = 1, "转发"
63+
OPERATED = 2, "已操作"
64+
ARCHIVED = 4, "归档"
65+
TIMEOUT = 5, "超时"
66+
AUTO_REVIEW = 6, "自动审批(审批中)"
67+
CC_WITHOUT_SUB = 8, "抄送(不需提交)"
68+
CC_WITH_SUB = 9, "抄送(需提交)"
69+
CIRCULATION = 11, "传阅"

drf_oa_workflow/db/__init__.py

Whitespace-only changes.

drf_oa_workflow/db/function.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
from django.db.models import DateTimeField
2+
from django.db.models.expressions import F, Func, Value
3+
from django.db.models.functions import Concat
4+
5+
6+
class ConvertOADbDatetime(Func):
7+
"""
8+
处理OA Oracle数据库 时间(字符串)和日期(字符串)字段,输出为DateTime类型
9+
"""
10+
11+
function = "TO_DATE"
12+
template = "%(function)s(%(expressions)s, 'YYYY-MM-DD HH24:MI:SS') - INTERVAL '8' HOUR"
13+
14+
def __init__(self, date_field, time_field, *expressions, output_field=DateTimeField(), **extra):
15+
base_expressions = Concat(F(date_field), Value(" "), F(time_field))
16+
super().__init__(base_expressions, *expressions, output_field=output_field, extra=extra)

drf_oa_workflow/db/manager.py

Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
from django.db import models
2+
from django.db.models import Case, F, Q, Value, When
3+
4+
from drf_oa_workflow.db.function import ConvertOADbDatetime
5+
from drf_oa_workflow.settings import api_settings
6+
7+
8+
class BaseOADbManager(models.Manager):
9+
def __init__(self):
10+
super().__init__()
11+
self._db = api_settings.OA_DATABASE_ALIAS
12+
13+
def using(self, *args, **kwargs):
14+
return super().using(api_settings.OA_DATABASE_ALIAS)
15+
16+
17+
class CurrentOperatorManager(BaseOADbManager):
18+
def wf_un_operators(self):
19+
"""
20+
流程当前节点未操作人
21+
"""
22+
from drf_oa_workflow.choices import OAWFCOIsRemarks
23+
24+
return (
25+
self.get_queryset()
26+
.filter(
27+
Q(
28+
ISREMARK__in=[OAWFCOIsRemarks.NOT_OPERATED, OAWFCOIsRemarks.ARCHIVED, OAWFCOIsRemarks.CC_WITH_SUB],
29+
OPERATEDATE__isnull=True,
30+
OPERATETIME__isnull=True,
31+
)
32+
| Q(ISREMARK=OAWFCOIsRemarks.NOT_OPERATED),
33+
ISLASTTIMES=1,
34+
NODEID=F("REQUESTID__CURRENTNODEID_id"),
35+
)
36+
.annotate(
37+
un_operator_id=F("USERID_id"), un_operator_name=F("USERID__LASTNAME"), request_id=F("REQUESTID_id")
38+
)
39+
.distinct()
40+
)
41+
42+
43+
class WorkflowQuerySet(models.QuerySet):
44+
def build_fields(self):
45+
return self.annotate(
46+
RECEIVEDATE=F("current_operators__RECEIVEDATE"),
47+
RECEIVETIME=F("current_operators__RECEIVETIME"),
48+
C_VIEWTYPE=F("current_operators__VIEWTYPE"),
49+
C_ISREMARRK=F("current_operators__ISREMARK"),
50+
C_NODEID=F("current_operators__NODEID"),
51+
C_ISREJECT=F("current_operators__ISREJECT"),
52+
C_ISBEREJECT=F("current_operators__ISBEREJECT"),
53+
# createTime=Concat(F("CREATEDATE"), Value(" "), F("CREATETIME")),
54+
# receiveTime=Concat(F("current_operators__RECEIVEDATE"), Value(" "), F("current_operators__RECEIVETIME")),
55+
# lastOperateTime=Concat(F("LASTOPERATEDATE"), Value(" "), F("LASTOPERATETIME")),
56+
createTime=ConvertOADbDatetime("CREATEDATE", "CREATETIME"),
57+
receiveTime=Case(
58+
When(
59+
Q(current_operators__RECEIVEDATE__isnull=False, current_operators__RECEIVETIME__isnull=False),
60+
then=ConvertOADbDatetime("current_operators__RECEIVEDATE", "current_operators__RECEIVETIME"),
61+
),
62+
default=Value(None),
63+
),
64+
lastOperateTime=Case(
65+
When(
66+
Q(LASTOPERATEDATE__isnull=False, LASTOPERATETIME__isnull=False),
67+
then=ConvertOADbDatetime("LASTOPERATEDATE", "LASTOPERATETIME"),
68+
),
69+
default=Value(None),
70+
),
71+
)
72+
73+
def todo(self, oa_user_id, workflow_ids):
74+
"""
75+
待办查询
76+
0:未操作;
77+
1:转发;
78+
2:已操作;
79+
4:归档;
80+
5:超时;
81+
6:自动审批(审批中)
82+
8:抄送(不需提交);
83+
9:抄送(需提交);
84+
11:传阅;
85+
"""
86+
queryset = self.filter(
87+
current_operators__USERTYPE=0,
88+
current_operators__ISREMARK__in=[0, 1, 5, 7, 8, 9],
89+
current_operators__ISLASTTIMES=1,
90+
current_operators__USERID=oa_user_id,
91+
WORKFLOWID__in=workflow_ids,
92+
)
93+
return queryset.build_fields()
94+
95+
def handled(self, oa_user_id, workflow_ids):
96+
queryset = self.filter(
97+
current_operators__USERTYPE=0,
98+
current_operators__ISREMARK__in=[2, 4],
99+
current_operators__ISLASTTIMES=1,
100+
current_operators__USERID=oa_user_id,
101+
WORKFLOWID__in=workflow_ids,
102+
)
103+
return queryset.build_fields()
104+
105+
106+
class WorkflowManager(BaseOADbManager):
107+
def get_queryset(self):
108+
queryset = WorkflowQuerySet(self.model, using=self._db, hints=self._hints)
109+
return queryset

drf_oa_workflow/db/models.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
from django.db import models
2+
3+
from .manager import BaseOADbManager
4+
5+
6+
class OADbBaseModel(models.Model):
7+
objects = BaseOADbManager()
8+
9+
class Meta:
10+
abstract = True

drf_oa_workflow/db_connections.py

Lines changed: 0 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +0,0 @@
1-
import oracledb
2-
3-
from .settings import api_settings
4-
5-
# from django.conf import settings
6-
7-
8-
try:
9-
oracledb.init_oracle_client()
10-
except Exception as e: # noqa
11-
pass
12-
13-
14-
def get_oa_oracle_connection():
15-
"""
16-
OA 数据库连接
17-
"""
18-
return oracledb.connect(
19-
user=api_settings.OA_DB_USER,
20-
password=api_settings.OA_DB_PASSWORD,
21-
host=api_settings.OA_DB_HOST,
22-
port=api_settings.OA_DB_PORT,
23-
service_name=api_settings.OA_DB_SERVER_NAME,
24-
)

0 commit comments

Comments
 (0)