1
0
forked from erp-dev/erp
This commit is contained in:
2026-07-05 13:53:17 +08:00
parent 4538e51ad5
commit e1cc6df122
24 changed files with 3030 additions and 495 deletions

View File

@@ -4,6 +4,7 @@ from datetime import timedelta
from django.db import transaction
from django.utils import timezone
from basic_info.models import Employee, EmployeeStatusEnum, EmployeeType
from mission.models import Mission, MissionCategory, MissionParticipant, MissionReply
from mission.signals import (
mission_cancelled,
@@ -104,11 +105,30 @@ def _clear_unreplied_notification_state_if_active(*, mission: Mission) -> None:
@transaction.atomic
def set_mission_participants(*, mission: Mission, participant_ids: list[int]) -> Mission:
def set_mission_participants(
*,
mission: Mission,
participant_ids: list[int] | None = None,
employee_type_ids: list[int] | None = None,
) -> Mission:
mission = Mission.objects.select_for_update().get(pk=mission.pk)
participant_ids = list(dict.fromkeys(participant_ids or []))
employee_type_ids = list(dict.fromkeys(employee_type_ids or []))
from basic_info.models import Employee
if employee_type_ids:
employee_type_count = EmployeeType.objects.filter(
id__in=employee_type_ids,
merchant=mission.merchant,
).count()
if employee_type_count != len(employee_type_ids):
raise ValueError("员工职位不存在或不属于任务所属商户")
position_employee_ids = Employee.objects.filter(
merchant=mission.merchant,
position_id__in=employee_type_ids,
status=EmployeeStatusEnum.ACTIVE,
).values_list("id", flat=True)
participant_ids = list(dict.fromkeys([*participant_ids, *position_employee_ids]))
employees = list(Employee.objects.filter(id__in=participant_ids, merchant=mission.merchant))
if len(employees) != len(participant_ids):
@@ -138,6 +158,7 @@ def create_mission(
content_type=None,
content_id: int | None = None,
participant_ids: list[int] | None = None,
employee_type_ids: list[int] | None = None,
notify_if_unreplied: bool = False,
unreplied_notify_interval_minutes: int | None = None,
unreplied_notify_max_count: int = 5,
@@ -166,8 +187,12 @@ def create_mission(
unreplied_notify_interval_minutes=unreplied_notify_interval_minutes,
unreplied_notify_max_count=unreplied_notify_max_count,
)
if participant_ids is not None:
set_mission_participants(mission=mission, participant_ids=participant_ids)
if participant_ids is not None or employee_type_ids is not None:
set_mission_participants(
mission=mission,
participant_ids=participant_ids,
employee_type_ids=employee_type_ids,
)
_send_signal_on_commit(
mission_created,
sender=Mission,
@@ -188,6 +213,7 @@ def update_mission(
content_id: int | None = None,
update_content_object: bool = False,
participant_ids: list[int] | None = None,
employee_type_ids: list[int] | None = None,
notify_if_unreplied=UNSET,
unreplied_notify_interval_minutes=UNSET,
unreplied_notify_max_count=UNSET,
@@ -266,8 +292,12 @@ def update_mission(
if update_fields:
mission.save(update_fields=[*dict.fromkeys(update_fields), "updated_at"])
if participant_ids is not None:
set_mission_participants(mission=mission, participant_ids=participant_ids)
if participant_ids is not None or employee_type_ids is not None:
set_mission_participants(
mission=mission,
participant_ids=participant_ids,
employee_type_ids=employee_type_ids,
)
return mission