1
0
forked from erp-dev/erp

feat: message-api for mission via wecomm agent

This commit is contained in:
2026-05-14 09:30:38 +08:00
parent 9359013b4c
commit f409f2e6ee
38 changed files with 2085 additions and 49 deletions

View File

@@ -541,30 +541,44 @@ class MissionV2APITest(TestCase):
[item["name"] for item in list_resp.data],
["通用", "跟进"],
)
self.assertEqual(list_resp.data[0]["payload_processor"], "")
create_resp = self.client.post(
"/api/v2/mission-categories/",
{"name": "售后"},
{"name": "售后", "payload_processor": "structured_description_v1"},
format="json",
)
self.assertEqual(create_resp.status_code, 201)
category_id = create_resp.data["id"]
self.assertEqual(create_resp.data["payload_processor"], "structured_description_v1")
detail_resp = self.client.get(f"/api/v2/mission-categories/{category_id}/")
self.assertEqual(detail_resp.status_code, 200)
self.assertEqual(detail_resp.data["name"], "售后")
self.assertEqual(detail_resp.data["payload_processor"], "structured_description_v1")
patch_resp = self.client.patch(
f"/api/v2/mission-categories/{category_id}/",
{"name": "售后跟进"},
{"name": "售后跟进", "payload_processor": ""},
format="json",
)
self.assertEqual(patch_resp.status_code, 200)
self.assertEqual(patch_resp.data["name"], "售后跟进")
self.assertEqual(patch_resp.data["payload_processor"], "")
delete_resp = self.client.delete(f"/api/v2/mission-categories/{category_id}/")
self.assertEqual(delete_resp.status_code, 204)
def test_mission_category_rejects_unknown_payload_processor(self):
resp = self.client.post(
"/api/v2/mission-categories/",
{"name": "售后", "payload_processor": "unknown_processor"},
format="json",
)
self.assertEqual(resp.status_code, 400)
self.assertIn("payload_processor", resp.data)
def test_delete_used_mission_category_is_rejected(self):
mission = self._create_mission()

View File

@@ -108,6 +108,11 @@ class MissionUrgentSerializer(serializers.Serializer):
class MissionCategoryWriteSerializer(serializers.Serializer):
name = serializers.CharField(allow_blank=False, max_length=50)
payload_processor = serializers.ChoiceField(
choices=mission_models.MissionPayloadProcessorEnum.choices,
required=False,
allow_blank=True,
)
def validate_name(self, value):
value = value.strip()
@@ -251,6 +256,7 @@ class MissionCategorySerializer(serializers.ModelSerializer):
"id",
"merchant",
"name",
"payload_processor",
"created_at",
"updated_at",
]
@@ -402,6 +408,7 @@ class MissionCategoryListCreateView(APIView):
category = mission_models.MissionCategory.objects.create(
merchant=employee.merchant,
name=serializer.validated_data["name"],
payload_processor=serializer.validated_data.get("payload_processor", ""),
)
except IntegrityError:
return Response({"name": ["分类名称已存在"]}, status=status.HTTP_400_BAD_REQUEST)
@@ -428,10 +435,16 @@ class MissionCategoryDetailView(APIView):
context={"employee": employee, "instance": category},
)
serializer.is_valid(raise_exception=True)
update_fields = []
if "name" in serializer.validated_data:
category.name = serializer.validated_data["name"]
update_fields.append("name")
if "payload_processor" in serializer.validated_data:
category.payload_processor = serializer.validated_data["payload_processor"]
update_fields.append("payload_processor")
if update_fields:
try:
category.save(update_fields=["name", "updated_at"])
category.save(update_fields=[*update_fields, "updated_at"])
except IntegrityError:
return Response({"name": ["分类名称已存在"]}, status=status.HTTP_400_BAD_REQUEST)
return Response(MissionCategorySerializer(category).data)