1
0
forked from erp-dev/erp

feat: added wecom notify when printing_job production was completed(new status) and shipment was created

This commit is contained in:
2026-04-09 17:35:14 +08:00
parent 76ea445880
commit 646dbe7f18
27 changed files with 1122 additions and 13 deletions

View File

@@ -128,6 +128,23 @@ class PrintingJobAPITestCase(TestCase):
self.assertEqual(job.quantity, 100)
self.assertEqual(job.unit, '')
self.assertEqual(job.pieces, 10)
self.assertFalse(job.is_production_completed)
def test_create_printing_job_ignores_is_production_completed(self):
"""测试创建接口忽略 is_production_completed"""
data = {
'printing_order': self.printing_order.id,
'product': self.product.id,
'quantity': 100,
'unit': '',
'is_production_completed': True,
}
response = self.client.post('/api/v1/printing-jobs/', data, format='json')
self.assertEqual(response.status_code, status.HTTP_201_CREATED)
job = printing_models.PrintingJob.objects.get(id=response.data['id'])
self.assertFalse(job.is_production_completed)
def test_list_printing_jobs(self):
"""测试获取款式明细列表"""
@@ -158,6 +175,89 @@ class PrintingJobAPITestCase(TestCase):
self.assertIn('batch_advance_records', item)
self.assertIsInstance(item['batch_advance_records'], list)
self.assertEqual(len(item['batch_advance_records']), 0)
def test_mark_production_completed(self):
"""测试显式标记完成生产接口"""
job = printing_models.PrintingJob.objects.create(
merchant=self.merchant,
printing_order=self.printing_order,
product=self.product,
quantity=100,
unit='',
is_production_completed=False,
)
response = self.client.post(
'/api/v1/printing-jobs/mark-production-completed/',
{'printing_job_id': job.id},
format='json'
)
self.assertEqual(response.status_code, status.HTTP_200_OK)
self.assertEqual(response.data, {'message': 'OK'})
job.refresh_from_db()
self.assertTrue(job.is_production_completed)
def test_mark_production_completed_requires_printing_job_id(self):
"""测试显式标记完成生产接口缺少 printing_job_id"""
response = self.client.post(
'/api/v1/printing-jobs/mark-production-completed/',
{},
format='json'
)
self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
self.assertIn('printing_job_id', response.data['detail'])
def test_mark_production_completed_forbidden_for_other_merchant(self):
"""测试不能操作其他商户的 PrintingJob"""
other_merchant = basic_models.Merchant.objects.create(
name='其他印花厂',
type=basic_models.MerchantTypeEnum.FACTORY
)
job = printing_models.PrintingJob.objects.create(
merchant=other_merchant,
printing_order=self.printing_order,
product=self.product,
quantity=100,
unit='',
is_production_completed=False,
)
response = self.client.post(
'/api/v1/printing-jobs/mark-production-completed/',
{'printing_job_id': job.id},
format='json'
)
self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN)
self.assertIn('其他商户', response.data['detail'])
job.refresh_from_db()
self.assertFalse(job.is_production_completed)
def test_mark_production_completed_requires_employee(self):
"""测试显式标记完成生产接口需要 employee"""
no_employee_user = User.objects.create_user(
username='noemployee',
password='testpass123',
email='noemployee@example.com'
)
no_employee_user.user_permissions.add(
Permission.objects.get(codename='view_printingjob'),
Permission.objects.get(codename='add_printingjob'),
Permission.objects.get(codename='change_printingjob'),
)
self.client.force_authenticate(user=no_employee_user)
try:
response = self.client.post(
'/api/v1/printing-jobs/mark-production-completed/',
{'printing_job_id': 1},
format='json'
)
finally:
self.client.force_authenticate(user=self.user)
self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN)
def test_retrieve_printing_job(self):
"""测试获取款式明细详情"""
@@ -347,6 +447,28 @@ class PrintingJobAPITestCase(TestCase):
self.assertEqual(job.quantity, 200)
self.assertEqual(job.unit, '')
self.assertEqual(job.pieces, 20)
self.assertFalse(job.is_production_completed)
def test_update_printing_job_ignores_is_production_completed(self):
"""测试更新接口忽略 is_production_completed"""
job = printing_models.PrintingJob.objects.create(
printing_order=self.printing_order,
product=self.product,
quantity=100,
unit='',
is_production_completed=False,
)
response = self.client.patch(
f'/api/v1/printing-jobs/{job.id}/',
{'is_production_completed': True, 'quantity': 120},
format='json'
)
self.assertEqual(response.status_code, status.HTTP_200_OK)
job.refresh_from_db()
self.assertEqual(job.quantity, 120)
self.assertFalse(job.is_production_completed)
def test_cannot_change_printing_order_on_update(self):
"""测试:不允许通过更新接口修改 PrintingJob.printing_order"""
@@ -706,12 +828,14 @@ class PrintingJobAPITestCase(TestCase):
self.assertIn('status', response.data)
self.assertIn('status_id', response.data)
self.assertIn('is_completed', response.data)
self.assertIn('is_production_completed', response.data)
self.assertIn('has_started', response.data)
self.assertIn('business_object_id', response.data)
# 未推进状态,但有 BusinessObject当前是初始状态
self.assertIn(response.data['status'], ['待印染', '未开始']) # 初始状态或未开始
self.assertFalse(response.data['is_completed'])
self.assertFalse(response.data['is_production_completed'])
self.assertFalse(response.data['has_started'])
def test_job_status_in_list(self):
@@ -731,6 +855,7 @@ class PrintingJobAPITestCase(TestCase):
# 验证列表中的状态字段
self.assertIn('status', response.data['results'][0])
self.assertIn('is_completed', response.data['results'][0])
self.assertIn('is_production_completed', response.data['results'][0])
def test_job_completion_status(self):
"""测试任务完成状态判断"""
@@ -763,7 +888,31 @@ class PrintingJobAPITestCase(TestCase):
# 验证完成状态
self.assertEqual(response.data['status'], '已完成')
self.assertTrue(response.data['is_completed'])
self.assertFalse(response.data['is_production_completed'])
self.assertTrue(response.data['has_started'])
def test_list_filter_by_is_production_completed(self):
"""测试按 is_production_completed 过滤 PrintingJob 列表"""
completed_job = printing_models.PrintingJob.objects.create(
printing_order=self.printing_order,
product=self.product,
quantity=100,
unit='',
is_production_completed=True,
)
printing_models.PrintingJob.objects.create(
printing_order=self.printing_order,
product=self.product,
quantity=80,
unit='',
is_production_completed=False,
)
response = self.client.get('/api/v1/printing-jobs/?is_production_completed=true')
self.assertEqual(response.status_code, status.HTTP_200_OK)
self.assertEqual(len(response.data['results']), 1)
self.assertEqual(response.data['results'][0]['id'], completed_job.id)
self.assertTrue(response.data['results'][0]['is_production_completed'])
def test_advance_to_next_state(self):
"""测试推进到下一个状态 API"""