From 5b5b859cdc65786a492fc32ca7584e566dd0b278 Mon Sep 17 00:00:00 2001
From: Czw <459749926@qq.com>
Date: Fri, 12 Nov 2021 18:28:54 +0800
Subject: [PATCH] =?UTF-8?q?feat:=20=E9=87=87=E8=B4=AD=E5=8D=95=E6=8D=AE?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 apps/finance/models.py        | 12 ++++++------
 apps/purchase/models.py       |  8 ++++----
 apps/purchase/views.py        | 28 ++++++++++++++++++++++------
 apps/sales/models.py          |  8 ++++----
 apps/stock_check/models.py    |  4 ++--
 apps/stock_in/models.py       |  8 ++++----
 apps/stock_out/models.py      |  4 ++--
 apps/stock_transfer/models.py |  4 ++--
 extensions/models.py          | 28 +++++++++++++++++++++++++++-
 9 files changed, 73 insertions(+), 31 deletions(-)

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',
 ]