From 893418646032d5c4478319e76df22d9dfcc9c57a Mon Sep 17 00:00:00 2001 From: caoqianming Date: Wed, 27 Sep 2023 12:46:19 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=8E=92=E4=BA=A7=E5=90=8E=E6=9B=B4?= =?UTF-8?q?=E6=96=B0=E8=AE=A2=E5=8D=95=E7=8A=B6=E6=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../migrations/0014_alter_process_options.py | 17 +++++++ apps/pm/services.py | 11 +++-- apps/sam/migrations/0004_alter_order_state.py | 18 ++++++++ apps/sam/models.py | 46 ++++++++++++------- apps/sam/tasks.py | 22 +++++++++ apps/utils/tasks.py | 6 ++- 6 files changed, 98 insertions(+), 22 deletions(-) create mode 100644 apps/mtm/migrations/0014_alter_process_options.py create mode 100644 apps/sam/migrations/0004_alter_order_state.py create mode 100644 apps/sam/tasks.py diff --git a/apps/mtm/migrations/0014_alter_process_options.py b/apps/mtm/migrations/0014_alter_process_options.py new file mode 100644 index 00000000..0ab8c8da --- /dev/null +++ b/apps/mtm/migrations/0014_alter_process_options.py @@ -0,0 +1,17 @@ +# Generated by Django 3.2.12 on 2023-09-27 04:45 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('mtm', '0013_mgroup_process'), + ] + + operations = [ + migrations.AlterModelOptions( + name='process', + options={'ordering': ['sort', 'create_time'], 'verbose_name': '工序'}, + ), + ] diff --git a/apps/pm/services.py b/apps/pm/services.py index 53b0618b..c16f4cc1 100644 --- a/apps/pm/services.py +++ b/apps/pm/services.py @@ -21,13 +21,13 @@ class PmService: productId = item.material.id if productId not in rdict: rdict[productId] = [item.material, item.count, - item.order.delivery_date, [item]] + item.order.delivery_date, [item.id]] else: order_date = item.order.delivery_date if rdict[productId][2] > order_date: rdict[productId][2] = order_date rdict[productId][1] = rdict[productId][1] + item.count - rdict[productId][3].append(item) + rdict[productId][3].append(item.id) return rdict @classmethod @@ -39,7 +39,7 @@ class PmService: rdict = cls.check_orderitems(orderitems) start_date_str = start_date.strftime('%Y%m%d') for k, v in enumerate(rdict): - product, count, end_date_cal, orderitems = v + product, count, end_date_cal, orderitemId_list = v if end_date is None: end_date = end_date_cal if start_date >= end_date: @@ -104,3 +104,8 @@ class PmService: 'create_by': user, 'update_by': user }) + OrderItem.objects.filter( + id__in=orderitemId_list).update(mtask=fmtask) + + from apps.sam.tasks import change_order_state_when_schedue + change_order_state_when_schedue.delay(orderitemId_list) diff --git a/apps/sam/migrations/0004_alter_order_state.py b/apps/sam/migrations/0004_alter_order_state.py new file mode 100644 index 00000000..d142d0e5 --- /dev/null +++ b/apps/sam/migrations/0004_alter_order_state.py @@ -0,0 +1,18 @@ +# Generated by Django 3.2.12 on 2023-09-27 04:45 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('sam', '0003_orderitem_mtask'), + ] + + operations = [ + migrations.AlterField( + model_name='order', + name='state', + field=models.PositiveSmallIntegerField(choices=[(10, '创建中'), (20, '已提交'), (30, '排产中'), (40, '排产完成'), (50, '已交付')], default=10, help_text="((10, '创建中'), (20, '已提交'), (30, '排产中'), (40, '排产完成'), (50, '已交付'))", verbose_name='订单状态'), + ), + ] diff --git a/apps/sam/models.py b/apps/sam/models.py index 069cd150..ed47ea92 100644 --- a/apps/sam/models.py +++ b/apps/sam/models.py @@ -3,6 +3,8 @@ from apps.utils.models import CommonBModel, BaseModel, CommonBDModel from apps.mtm.models import Material # Create your models here. + + class Customer(CommonBModel): """ 客户信息 @@ -10,7 +12,8 @@ class Customer(CommonBModel): name = models.CharField('客户名称', max_length=50, unique=True) address = models.CharField('详细地址', max_length=20, blank=True, null=True) contact = models.CharField('联系人', max_length=20) - contact_phone = models.CharField('联系电话', max_length=11, unique=True,null=True) + contact_phone = models.CharField( + '联系电话', max_length=11, unique=True, null=True) description = models.CharField('描述', max_length=200, blank=True, null=True) class Meta: @@ -19,7 +22,7 @@ class Customer(CommonBModel): def __str__(self): return self.name - + class Contract(CommonBModel): """ @@ -28,16 +31,18 @@ class Contract(CommonBModel): name = models.CharField('合同名称', max_length=100) number = models.CharField('合同编号', max_length=100, unique=True) amount = models.IntegerField('合同金额', default=0) - customer = models.ForeignKey(Customer, verbose_name='关联客户', on_delete=models.CASCADE, related_name='contract_customer') + customer = models.ForeignKey(Customer, verbose_name='关联客户', + on_delete=models.CASCADE, related_name='contract_customer') sign_date = models.DateField('签订日期') description = models.CharField('描述', max_length=200, blank=True, null=True) + class Meta: verbose_name = '合同信息' verbose_name_plural = verbose_name def __str__(self): return self.name - + class Order(CommonBModel): """ @@ -45,20 +50,26 @@ class Order(CommonBModel): """ ORDER_CREATE = 10 ORDER_SUBMITED = 20 - ORDER_PLANED = 30 - ORDER_DELIVERED = 40 + ORDER_PLANING = 30 + ORDER_PLANED = 40 + ORDER_DELIVERED = 50 ORDER_STATES = ( (10, '创建中'), (20, '已提交'), - (30, '已排产'), - (40, '已交付') + (30, '排产中'), + (40, '排产完成'), + (50, '已交付') ) - state = models.PositiveSmallIntegerField('订单状态', default=ORDER_CREATE, choices=ORDER_STATES, help_text=str(ORDER_STATES)) + state = models.PositiveSmallIntegerField( + '订单状态', default=ORDER_CREATE, choices=ORDER_STATES, help_text=str(ORDER_STATES)) number = models.CharField('订单编号', max_length=100, unique=True) - customer = models.ForeignKey(Customer, verbose_name='客户', on_delete=models.CASCADE) - contract = models.ForeignKey(Contract, verbose_name='所属合同', null=True, blank=True, on_delete=models.SET_NULL) + customer = models.ForeignKey( + Customer, verbose_name='客户', on_delete=models.CASCADE) + contract = models.ForeignKey( + Contract, verbose_name='所属合同', null=True, blank=True, on_delete=models.SET_NULL) delivery_date = models.DateField('截止交货日期') - items = models.ManyToManyField(Material, verbose_name='订单明细', through='sam.orderitem', blank=True) + items = models.ManyToManyField( + Material, verbose_name='订单明细', through='sam.orderitem', blank=True) submit_time = models.DateTimeField('提交时间', null=True, blank=True) class Meta: @@ -70,10 +81,11 @@ class OrderItem(BaseModel): """ 订单明细 """ - order = models.ForeignKey(Order, verbose_name='关联订单', on_delete=models.CASCADE) - material = models.ForeignKey(Material, verbose_name='所需产品', on_delete=models.CASCADE) + order = models.ForeignKey( + Order, verbose_name='关联订单', on_delete=models.CASCADE) + material = models.ForeignKey( + Material, verbose_name='所需产品', on_delete=models.CASCADE) count = models.PositiveIntegerField('所需数量', default=1) delivered_count = models.PositiveIntegerField('已交货数量', default=0) - mtask = models.ForeignKey('pm.mtask', verbose_name='关联生产任务', on_delete=models.SET_NULL, null=True, blank=True) - - \ No newline at end of file + mtask = models.ForeignKey('pm.mtask', verbose_name='关联生产任务', + on_delete=models.SET_NULL, null=True, blank=True) diff --git a/apps/sam/tasks.py b/apps/sam/tasks.py new file mode 100644 index 00000000..0914e8bd --- /dev/null +++ b/apps/sam/tasks.py @@ -0,0 +1,22 @@ +# Create your tasks here +from __future__ import absolute_import, unicode_literals +from apps.utils.tasks import CustomTask +from celery import shared_task +from .models import Order, OrderItem + + +@shared_task(base=CustomTask) +def change_order_state_when_schedue(orderitemIds): + """排产后更新orderstate + """ + orderIds = list(OrderItem.objects.filter( + id__in=orderitemIds).values_list('order__id', flat=True).distinct()) + for i in orderIds: + order = Order.objects.get(id=i) + state = Order.ORDER_PLANED + orderitems = OrderItem.objects.filter(order__id=i) + for item in orderitems: + if item.mtask is None: + state = Order.ORDER_PLANING + order.state = state + order.save() diff --git a/apps/utils/tasks.py b/apps/utils/tasks.py index f92a995c..0a5d36c9 100644 --- a/apps/utils/tasks.py +++ b/apps/utils/tasks.py @@ -13,9 +13,11 @@ myLogger = logging.getLogger('log') def send_mail_task(**args): config = get_sysconfig() from django.core.mail import send_mail - args['subject'] = '{}:{}_{}_{}'.format(settings.SYS_NAME, settings.SYS_VERSION, config['base']['base_name_short'], args.get('subject', '500')) + args['subject'] = '{}:{}_{}_{}'.format( + settings.SYS_NAME, settings.SYS_VERSION, config['base']['base_name_short'], args.get('subject', '500')) args['from_email'] = args.get('from_email', settings.EMAIL_HOST_USER) - args['recipient_list'] = args.get('recipient_list', [settings.EMAIL_HOST_USER]) + args['recipient_list'] = args.get( + 'recipient_list', [settings.EMAIL_HOST_USER]) send_mail(**args)