diff --git a/apps/finance/models.py b/apps/finance/models.py index 9e96ac0..e500d5d 100644 --- a/apps/finance/models.py +++ b/apps/finance/models.py @@ -22,14 +22,14 @@ class PaymentOrder(Model): @classmethod def get_number(cls, team): - start_date, end_date = pendulum.now(), pendulum.tomorrow() + start_date, end_date = get_today(), get_tomorrow() instance = cls.objects.filter(team=team, create_time__gte=start_date, create_time__lt=end_date).last() try: result = re.match('^(.*?)([1-9]+)$', instance.number) number = result.group(1) + str(int(result.group(2)) + 1) except AttributeError: - number = 'FK' + start_date.format('YYYYMMDD') + '0001' + number = 'FK' + pendulum.today(settings.TIME_ZONE) + '0001' return number @@ -70,14 +70,14 @@ class CollectionOrder(Model): @classmethod def get_number(cls, team): - start_date, end_date = pendulum.now(), pendulum.tomorrow() + start_date, end_date = get_today(), get_tomorrow() instance = cls.objects.filter(team=team, create_time__gte=start_date, create_time__lt=end_date).last() try: result = re.match('^(.*?)([1-9]+)$', instance.number) number = result.group(1) + str(int(result.group(2)) + 1) except AttributeError: - number = 'CK' + start_date.format('YYYYMMDD') + '0001' + number = 'CK' + pendulum.today(settings.TIME_ZONE) + '0001' return number @@ -123,14 +123,14 @@ class ChargeOrder(Model): @classmethod def get_number(cls, team): - start_date, end_date = pendulum.now(), pendulum.tomorrow() + start_date, end_date = get_today(), get_tomorrow() instance = cls.objects.filter(team=team, create_time__gte=start_date, create_time__lt=end_date).last() try: result = re.match('^(.*?)([1-9]+)$', instance.number) number = result.group(1) + str(int(result.group(2)) + 1) except AttributeError: - number = 'SZ' + start_date.format('YYYYMMDD') + '0001' + number = 'SZ' + pendulum.today(settings.TIME_ZONE) + '0001' return number diff --git a/apps/purchase/models.py b/apps/purchase/models.py index 8149abd..44a837e 100644 --- a/apps/purchase/models.py +++ b/apps/purchase/models.py @@ -29,14 +29,14 @@ class PurchaseOrder(Model): @classmethod def get_number(cls, team): - start_date, end_date = pendulum.now(), pendulum.tomorrow() + start_date, end_date = get_today(), get_tomorrow() instance = cls.objects.filter(team=team, create_time__gte=start_date, create_time__lt=end_date).last() try: result = re.match('^(.*?)([1-9]+)$', instance.number) number = result.group(1) + str(int(result.group(2)) + 1) except AttributeError: - number = 'CG' + start_date.format('YYYYMMDD') + '0001' + number = 'CG' + pendulum.today(settings.TIME_ZONE).format('YYYYMMDD') + '0001' return number @@ -83,14 +83,14 @@ class PurchaseReturnOrder(Model): @classmethod def get_number(cls, team): - start_date, end_date = pendulum.now(), pendulum.tomorrow() + start_date, end_date = get_today(), get_tomorrow() instance = cls.objects.filter(team=team, create_time__gte=start_date, create_time__lt=end_date).last() try: result = re.match('^(.*?)([1-9]+)$', instance.number) number = result.group(1) + str(int(result.group(2)) + 1) except AttributeError: - number = 'CR' + start_date.format('YYYYMMDD') + '0001' + number = 'CR' + pendulum.today(settings.TIME_ZONE) + '0001' return number diff --git a/apps/purchase/views.py b/apps/purchase/views.py index 14faa3b..69c8135 100644 --- a/apps/purchase/views.py +++ b/apps/purchase/views.py @@ -8,6 +8,7 @@ from apps.purchase.schemas import * from apps.purchase.models import * from apps.goods.models import * from apps.flow.models import * +from apps.stock_in.models import * class PurchaseOrderViewSet(BaseViewSet, ListModelMixin, RetrieveModelMixin, CreateModelMixin): @@ -25,7 +26,7 @@ class PurchaseOrderViewSet(BaseViewSet, ListModelMixin, RetrieveModelMixin, Crea @transaction.atomic def perform_create(self, serializer): - purchase_order = super().perform_create(serializer) + purchase_order = serializer.save() # 同步入库 if purchase_order.enable_auto_stock_in: @@ -52,7 +53,22 @@ class PurchaseOrderViewSet(BaseViewSet, ListModelMixin, RetrieveModelMixin, Crea InventoryFlow.objects.bulk_create(inventory_flows) else: # 创建入库单据 - pass + stock_in_order_number = StockInOrder.get_number(team=self.team) + stock_in_order = StockInOrder.objects.create( + number=stock_in_order_number, warehouse=purchase_order.warehouse, + type=StockInOrder.Type.PURCHASE, purchase_order=purchase_order, + total_quantity=purchase_order.total_quantity, creator=self.user, team=self.team + ) + + # 创建入库商品 + stock_in_goods_set = [] + for purchase_goods in purchase_order.purchase_goods_set.all(): + stock_in_goods_set.append(StockInGoods( + stock_in_order=stock_in_order, goods=purchase_goods.goods, + stock_in_quantity=purchase_goods.purchase_quantity, team=self.team + )) + else: + StockInGoods.objects.bulk_create(stock_in_goods_set) # 同步欠款 supplier = purchase_order.supplier @@ -62,14 +78,14 @@ class PurchaseOrderViewSet(BaseViewSet, ListModelMixin, RetrieveModelMixin, Crea # 同步账户, 流水 if payment_order := purchase_order.payment_order: finance_flows = [] - for payemnt_account in payment_order.payemnt_accounts.all(): - account = payemnt_account.account + for payment_account in payment_order.payment_accounts.all(): + account = payment_account.account amount_before = account.balance_amount - amount_change = payemnt_account.payment_amount + amount_change = payment_account.payment_amount amount_after = NP.minus(amount_before, amount_change) finance_flows.append(FinanceFlow( - account=payemnt_account.account, type=FinanceFlow.Type.PAYMENT, + account=payment_account.account, type=FinanceFlow.Type.PAYMENT, amount_before=amount_before, amount_change=amount_change, amount_after=amount_after, payment_order=payment_order, creator=self.user, team=self.team )) diff --git a/apps/sales/models.py b/apps/sales/models.py index d23d9ad..80829e1 100644 --- a/apps/sales/models.py +++ b/apps/sales/models.py @@ -25,14 +25,14 @@ class SalesOrder(Model): @classmethod def get_number(cls, team): - start_date, end_date = pendulum.now(), pendulum.tomorrow() + start_date, end_date = get_today(), get_tomorrow() instance = cls.objects.filter(team=team, create_time__gte=start_date, create_time__lt=end_date).last() try: result = re.match('^(.*?)([1-9]+)$', instance.number) number = result.group(1) + str(int(result.group(2)) + 1) except AttributeError: - number = 'XS' + start_date.format('YYYYMMDD') + '0001' + number = 'XS' + pendulum.today(settings.TIME_ZONE) + '0001' return number @@ -79,14 +79,14 @@ class SalesReturnOrder(Model): @classmethod def get_number(cls, team): - start_date, end_date = pendulum.now(), pendulum.tomorrow() + start_date, end_date = get_today(), get_tomorrow() instance = cls.objects.filter(team=team, create_time__gte=start_date, create_time__lt=end_date).last() try: result = re.match('^(.*?)([1-9]+)$', instance.number) number = result.group(1) + str(int(result.group(2)) + 1) except AttributeError: - number = 'SR' + start_date.format('YYYYMMDD') + '0001' + number = 'SR' + pendulum.today(settings.TIME_ZONE) + '0001' return number diff --git a/apps/stock_check/models.py b/apps/stock_check/models.py index 4d66df6..1059095 100644 --- a/apps/stock_check/models.py +++ b/apps/stock_check/models.py @@ -31,14 +31,14 @@ class StockCheckOrder(Model): @classmethod def get_number(cls, team): - start_date, end_date = pendulum.now(), pendulum.tomorrow() + start_date, end_date = get_today(), get_tomorrow() instance = cls.objects.filter(team=team, create_time__gte=start_date, create_time__lt=end_date).last() try: result = re.match('^(.*?)([1-9]+)$', instance.number) number = result.group(1) + str(int(result.group(2)) + 1) except AttributeError: - number = 'PD' + start_date.format('YYYYMMDD') + '0001' + number = 'PD' + pendulum.today(settings.TIME_ZONE) + '0001' return number diff --git a/apps/stock_in/models.py b/apps/stock_in/models.py index 47dab6b..9208d07 100644 --- a/apps/stock_in/models.py +++ b/apps/stock_in/models.py @@ -31,14 +31,14 @@ class StockInOrder(Model): @classmethod def get_number(cls, team): - start_date, end_date = pendulum.now(), pendulum.tomorrow() + start_date, end_date = get_today(), get_tomorrow() instance = cls.objects.filter(team=team, create_time__gte=start_date, create_time__lt=end_date).last() try: result = re.match('^(.*?)([1-9]+)$', instance.number) number = result.group(1) + str(int(result.group(2)) + 1) except AttributeError: - number = 'RK' + start_date.format('YYYYMMDD') + '0001' + number = 'RK' + pendulum.today(settings.TIME_ZONE) + '0001' return number @@ -49,7 +49,7 @@ class StockInGoods(Model): stock_in_order = ForeignKey('stock_in.StockInOrder', on_delete=CASCADE, related_name='stock_in_goods_set', verbose_name='入库单据') goods = ForeignKey('goods.Goods', on_delete=PROTECT, related_name='stock_in_goods_set', verbose_name='商品') - total_quantity = FloatField(verbose_name='入库总数') + stock_in_quantity = FloatField(verbose_name='入库总数') remain_quantity = FloatField(default=0, verbose_name='入库剩余数量') is_completed = BooleanField(default=False, verbose_name='完成状态') is_void = BooleanField(default=False, verbose_name='作废状态') @@ -80,7 +80,7 @@ class StockInRecordGoods(Model): """入库记录商品""" stock_in_record = ForeignKey('stock_in.StockInRecord', on_delete=CASCADE, - related_name='stock_in_record_goods_set', verbose_name='入库记录') + related_name='stock_in_record_goods_set', verbose_name='入库记录') stock_in_goods = ForeignKey('stock_in.StockInGoods', on_delete=CASCADE, related_name='stock_in_record_goods_set', verbose_name='入库商品') goods = ForeignKey('goods.Goods', on_delete=PROTECT, related_name='stock_in_record_goods_set', verbose_name='商品') diff --git a/apps/stock_out/models.py b/apps/stock_out/models.py index 0e9730c..563a931 100644 --- a/apps/stock_out/models.py +++ b/apps/stock_out/models.py @@ -31,14 +31,14 @@ class StockOutOrder(Model): @classmethod def get_number(cls, team): - start_date, end_date = pendulum.now(), pendulum.tomorrow() + start_date, end_date = get_today(), get_tomorrow() instance = cls.objects.filter(team=team, create_time__gte=start_date, create_time__lt=end_date).last() try: result = re.match('^(.*?)([1-9]+)$', instance.number) number = result.group(1) + str(int(result.group(2)) + 1) except AttributeError: - number = 'CK' + start_date.format('YYYYMMDD') + '0001' + number = 'CK' + pendulum.today(settings.TIME_ZONE) + '0001' return number diff --git a/apps/stock_transfer/models.py b/apps/stock_transfer/models.py index a9df530..b5a5441 100644 --- a/apps/stock_transfer/models.py +++ b/apps/stock_transfer/models.py @@ -23,14 +23,14 @@ class StockTransferOrder(Model): unique_together = [('number', 'team')] @classmethod def get_number(cls, team): - start_date, end_date = pendulum.now(), pendulum.tomorrow() + start_date, end_date = get_today(), get_tomorrow() instance = cls.objects.filter(team=team, create_time__gte=start_date, create_time__lt=end_date).last() try: result = re.match('^(.*?)([1-9]+)$', instance.number) number = result.group(1) + str(int(result.group(2)) + 1) except AttributeError: - number = 'DB' + start_date.format('YYYYMMDD') + '0001' + number = 'DB' + pendulum.today(settings.TIME_ZONE) + '0001' return number diff --git a/extensions/models.py b/extensions/models.py index b0fb14b..aacfce1 100644 --- a/extensions/models.py +++ b/extensions/models.py @@ -6,6 +6,8 @@ from django.db.models import Model, IntegerChoices, TextChoices from django.db.models import Sum, Count, Value, F, Q, Prefetch from django.db.models.functions import Coalesce from django.db import transaction, connection +from datetime import datetime, timezone +from django.conf import settings import pendulum import re @@ -18,6 +20,30 @@ class AmountField(DecimalField): super().__init__(verbose_name, name, **kwargs) +def get_yesterday(): + """昨日""" + + time = pendulum.yesterday(settings.TIME_ZONE).to_datetime_string() + time = datetime.strptime(time, '%Y-%m-%d %H:%M:%S').astimezone(tz=timezone.utc).replace(tzinfo=timezone.utc) + return time + + +def get_today(): + """今日""" + + time = pendulum.today(settings.TIME_ZONE).to_datetime_string() + time = datetime.strptime(time, '%Y-%m-%d %H:%M:%S').astimezone(tz=timezone.utc).replace(tzinfo=timezone.utc) + return time + + +def get_tomorrow(): + """明日""" + + time = pendulum.tomorrow(settings.TIME_ZONE).to_datetime_string() + time = datetime.strptime(time, '%Y-%m-%d %H:%M:%S').astimezone(tz=timezone.utc).replace(tzinfo=timezone.utc) + return time + + __all__ = [ 'Model', 'IntegerChoices', 'TextChoices', 'CASCADE', 'SET_NULL', 'SET_DEFAULT', 'PROTECT', @@ -25,5 +51,5 @@ __all__ = [ 'BooleanField', 'IntegerField', 'FloatField', 'DecimalField', 'AmountField', 'CharField', 'DateField', 'DateTimeField', 'JSONField', 'FileField', 'ImageField', 'Sum', 'Count', 'Value', 'F', 'Q', 'Prefetch', 'Coalesce', 'transaction', 'connection', - 'pendulum', 're', + 'pendulum', 're', 'settings', 'get_yesterday', 'get_today', 'get_tomorrow', ]