diff --git a/apps/rpm/tasks.py b/apps/rpm/tasks.py index 4401ceb5..ebecd493 100644 --- a/apps/rpm/tasks.py +++ b/apps/rpm/tasks.py @@ -21,3 +21,8 @@ def close_rpj_by_leave_time(): else: i.state = Rpj.RPJ_CLOSE i.save() + # 工单审批如果还未结束,直接关闭 + from apps.wf.models import Ticket + from apps.wf.services import WfService + if i.ticket and i.ticket.state != Ticket.TICKET_ACT_STATE_FINISH: + WfService.close_by_task(i.ticket, '相关方入厂时间到期') diff --git a/apps/system/views.py b/apps/system/views.py index 3f11301c..44f8f431 100755 --- a/apps/system/views.py +++ b/apps/system/views.py @@ -8,11 +8,12 @@ from django_celery_beat.models import (CrontabSchedule, IntervalSchedule, PeriodicTask) from django_celery_results.models import TaskResult from rest_framework.decorators import action -from rest_framework.exceptions import ParseError, ValidationError +from rest_framework.exceptions import ParseError, ValidationError, PermissionDenied from rest_framework.mixins import (CreateModelMixin, DestroyModelMixin, ListModelMixin, RetrieveModelMixin) from rest_framework.parsers import (JSONParser, MultiPartParser) +from rest_framework.serializers import Serializer from rest_framework.permissions import IsAuthenticated, AllowAny from rest_framework.response import Response from rest_framework.views import APIView @@ -494,6 +495,16 @@ class UserViewSet(CustomModelViewSet): raise ParseError(**PASSWORD_NOT_SAME) else: raise ValidationError(**OLD_PASSWORD_WRONG) + + @action(methods=['post'], detail=True, perms_map={'post': '*'}, serializer_class=Serializer) + def reset_password(self, request, pk=None): + user = self.get_object() + if request.user.is_superuser: + user.set_password('0000') + user.save() + else: + raise PermissionDenied() + return Response() @action(methods=['get'], detail=False, permission_classes=[IsAuthenticated]) def info(self, request, pk=None): diff --git a/apps/vm/tasks.py b/apps/vm/tasks.py index f46ae2ff..2a797d75 100644 --- a/apps/vm/tasks.py +++ b/apps/vm/tasks.py @@ -21,3 +21,8 @@ def close_visit_by_leave_time(): else: i.state = Visit.V_CLOSE i.save() + # 工单审批如果还未结束,直接关闭 + from apps.wf.models import Ticket + from apps.wf.services import WfService + if i.ticket and i.ticket.state != Ticket.TICKET_ACT_STATE_FINISH: + WfService.close_by_task(i.ticket, '访客入厂时间到期') diff --git a/apps/wf/services.py b/apps/wf/services.py index 53f0bfed..2d5fd0b6 100755 --- a/apps/wf/services.py +++ b/apps/wf/services.py @@ -435,6 +435,20 @@ class WfService(object): if state.participant_type == State.PARTICIPANT_TYPE_ROBOT: run_task.delay(ticket_id=ticket.id) + @classmethod + def close_by_task(cls, ticket: Ticket, suggestion: str): + # 定时任务触发的工单关闭 + end_state = WfService.get_workflow_end_state(ticket.workflow) + ticket.state = end_state + ticket.participant_type = 0 + ticket.participant = 0 + ticket.act_state = Ticket.TICKET_ACT_STATE_CLOSED + ticket.save() + # 更新流转记录 + TicketFlow.objects.create(ticket=ticket, state=ticket.state, + ticket_data=WfService.get_ticket_all_field_value(ticket), + suggestion=suggestion, participant_type=State.PARTICIPANT_TYPE_ROBOT, + intervene_type=Transition.TRANSITION_INTERVENE_TYPE_CLOSE, transition=None) def send_ticket_notice_t(ticket: Ticket): """ diff --git a/apps/wf/tasks.py b/apps/wf/tasks.py index 7352542b..f392dbc1 100644 --- a/apps/wf/tasks.py +++ b/apps/wf/tasks.py @@ -24,11 +24,11 @@ def send_ticket_notice(ticket_id): if ticket: if ticket.participant_type == 1: # 发送短信通知 - pt = User.objects.filter(id=ticket.participant).first() + pt = User.objects.filter(id=ticket.participant, is_active=True).first() if pt and pt.phone: send_sms(pt.phone, 1002, params) elif ticket.participant_type == 2: - pts = User.objects.filter(id__in=ticket.participant) + pts = User.objects.filter(id__in=ticket.participant, is_active=True) for i in pts: if i.phone: send_sms(i.phone, 1002, params)