Procházet zdrojové kódy

Merge remote-tracking branch 'origin/master'

wushaodong před 3 roky
rodič
revize
a41dd13cdb

+ 20 - 0
apps/finance/filters.py

@@ -0,0 +1,20 @@
+#coding=utf-8
+import django_filters
+from models import FinanceCategory, FinancePurpose
+
+
+class FinanceCategoryFilter(django_filters.FilterSet):
+    name = django_filters.CharFilter(name='name', lookup_expr='icontains')
+
+    class Meta:
+        model = FinanceCategory
+        fields = "__all__"
+
+
+class FinancePurposeFilter(django_filters.FilterSet):
+    name = django_filters.CharFilter(name='name', lookup_expr='icontains')
+    category_name = django_filters.CharFilter(name='category__name', lookup_expr='icontains')
+
+    class Meta:
+        model = FinancePurpose
+        fields = "__all__"

+ 43 - 14
apps/finance/models.py

@@ -12,8 +12,7 @@ from django.conf import settings
 class FinanceCategory(models.Model):
     name = models.CharField(max_length=100, verbose_name=u"名称")
     enabled = models.BooleanField(verbose_name=u"在用", default=True)
-    create_user = models.ForeignKey(User, related_name='finance_category_ref_create_user', verbose_name=u"创建人",
-                                    on_delete=models.PROTECT)
+    create_user = models.ForeignKey(User, related_name='finance_category_ref_create_user', verbose_name=u"创建人", editable=False ,on_delete=models.PROTECT)
     create_time = models.DateTimeField(verbose_name=u"创建时间", default=timezone.now)
 
     class Meta:
@@ -22,11 +21,23 @@ class FinanceCategory(models.Model):
         verbose_name = u"财务收支类别"
         default_permissions = ()
         permissions = (
+            ("view_finance_category", u"查看"),
             ("add_finance_category", u"添加"),
-            ("edit_finance_category", u"修改"),
             ("delete_finance_category", u"删除"),
         )
 
+    @staticmethod
+    def getById(id):
+        try:
+            id = int(id)
+        except:
+            raise CustomError(u'无效的财务收支类别ID')
+        instance = FinanceCategory.objects.filter(pk=id).first()
+        if not instance:
+            raise CustomError(u'未找到相应的财务收支类别')
+        return instance
+
+
 class FinancePurpose(models.Model):
     PAY = 1
     INCOME = 2
@@ -40,8 +51,7 @@ class FinancePurpose(models.Model):
     type = models.IntegerField(choices=TYPE_CHOICES, verbose_name=u"收支类型")
     category = models.ForeignKey(FinanceCategory, verbose_name=u"类别", on_delete=models.PROTECT)
     enabled = models.BooleanField(verbose_name=u"在用", default=True)
-    create_user = models.ForeignKey(User, related_name='finance_product_ref_create_user', verbose_name=u"创建人",
-                                    on_delete=models.PROTECT)
+    create_user = models.ForeignKey(User, related_name='finance_product_ref_create_user', verbose_name=u"创建人", editable=False, on_delete=models.PROTECT)
     create_time = models.DateTimeField(verbose_name=u"创建时间", default=timezone.now)
 
     class Meta:
@@ -49,11 +59,18 @@ class FinancePurpose(models.Model):
         ordering = ['-id']
         verbose_name = u"财务收支用途"
         default_permissions = ()
-        permissions = (
-            ("add_finance_category", u"添加"),
-            ("edit_finance_category", u"修改"),
-            ("delete_finance_category", u"删除"),
-        )
+        permissions = ()
+
+    @staticmethod
+    def getById(id):
+        try:
+            id = int(id)
+        except:
+            raise CustomError(u'无效的财务收支用途ID')
+        instance = FinancePurpose.objects.filter(pk=id).first()
+        if not instance:
+            raise CustomError(u'未找到相应的财务收支用途')
+        return instance
 
 
 class dbFinanceIncome(models.Model):
@@ -93,19 +110,20 @@ class dbFinanceIncome(models.Model):
         (SALE_ENTRY_FARE, 'SF'),
     )
 
-    no = models.CharField(max_length=50, verbose_name=u"收银单号")
+    no = models.CharField(max_length=50, verbose_name=u"收银单号", editable=False)
     referer_no = models.CharField(max_length=50, verbose_name=u"引用单据编号")
     department = models.ForeignKey(Department, related_name='finance_income_ref_department', verbose_name=u'部门',null=True,on_delete=models.PROTECT)
-    create_user = models.ForeignKey(User, related_name='finance_income_ref_create_user', verbose_name=u"创建人", on_delete=models.PROTECT)
+    create_user = models.ForeignKey(User, related_name='finance_income_ref_create_user', verbose_name=u"创建人", on_delete=models.PROTECT, editable=False)
     create_time = models.DateTimeField(verbose_name=u"创建时间", default=timezone.now)
     type = models.IntegerField(choices=TYPE_CHOICES, verbose_name=u"类型")
     amount = models.BigIntegerField(verbose_name=u"金额")
     account = models.ForeignKey(Option, related_name='finance_income_ref_account',verbose_name=u"账户", on_delete=models.PROTECT)
-    purpose = models.ForeignKey(FinancePurpose, verbose_name=u"用途", on_delete=models.PROTECT)
+    purpose = models.ForeignKey(FinancePurpose, verbose_name=u"用途", on_delete=models.PROTECT, null=True)
     check_user = models.ForeignKey(User, related_name='finance_income_ref_check_user', verbose_name=u"审核人",
                                     on_delete=models.PROTECT)
     check_time = models.DateTimeField(verbose_name=u"审核时间", null=True)
     check_status = models.PositiveSmallIntegerField(choices=settings.CHECK_STATUS_CHOICES, verbose_name=u"审核状态", default=settings.DEFAULT)
+    notes = models.CharField(max_length=200, verbose_name=u"备注", blank=True, null=True)
 
 
     def save(self, *args, **kwargs):
@@ -117,11 +135,22 @@ class dbFinanceIncome(models.Model):
             if count == 0:
                 self.no = '%s%s%04d' % (prefix, now.strftime('%Y%m%d'), count + 1)
             else:
-                suffix = (rows[0].no.split('-'))[1]
+                suffix = (rows[0].no[2:])
                 self.no = prefix+str(int(suffix) + 1)
 
         super(dbFinanceIncome, self).save(*args, **kwargs)
 
+    @staticmethod
+    def getById(id):
+        try:
+            id = int(id)
+        except:
+            raise CustomError(u'无效的财务收支单ID')
+        instance = dbFinanceIncome.objects.filter(pk=id).first()
+        if not instance:
+            raise CustomError(u'未找到相应的收支单')
+        return instance
+
     class Meta:
         db_table = "finance_income"
         verbose_name = u"收支管理"

+ 161 - 0
apps/finance/serializers.py

@@ -3,7 +3,168 @@
 from rest_framework import serializers
 from django.db.models import Q
 
+from apps import base
+from apps.account.models import User
+from apps.base import Formater
 from apps.exceptions import CustomError
+from apps.foundation.models import BizLog
+from apps.finance.models import FinanceCategory, FinancePurpose, dbFinanceIncome
 from apps.serializer_errors import dump_serializer_errors
+from libs.booleancharfield import CountShowCharField
 
 
+class FinanceCategorySerializer(serializers.ModelSerializer):
+    enabled_text = serializers.SerializerMethodField()
+
+    class Meta:
+        model = FinanceCategory
+        fields = '__all__'
+
+    def get_enabled_text(self, obj):
+        if obj.enabled:
+            return u'是'
+        return u'否'
+
+    @staticmethod
+    def factory(user, data, id=None):
+        if id:
+            instance = FinanceCategory.getById(id)
+        else:
+            instance = None
+        serializer = FinanceCategorySerializer(instance, data=data)
+        serializer.user = user
+        return serializer
+
+    def create(self, validated_data):
+        validated_data['create_user'] = self.user
+        instance = FinanceCategory.objects.create(**validated_data)
+        BizLog.objects.addnew(
+            self.user,
+            BizLog.INSERT,
+            u"添加财务收支类别[%s],id=%d" % (instance.name, instance.id),
+            validated_data
+        )
+        return instance
+
+    def update(self, instance, validated_data):
+        instance = super(FinanceCategorySerializer, self).update(instance, validated_data)
+        BizLog.objects.addnew(
+            self.user,
+            BizLog.UPDATE,
+            u"修改财务收支类别[%s],id=%d" % (instance.name, instance.id),
+            validated_data
+        )
+        return instance
+
+    def validSave(self):
+        if self.is_valid():
+            return self.save()
+        else:
+            raise CustomError(dump_serializer_errors(self))
+
+
+class FinancePurposeSerializer(serializers.ModelSerializer):
+    category_text = serializers.CharField(source='category.name', read_only=True)
+    type_text = serializers.CharField(source='get_type_display', read_only=True)
+    enabled_text = serializers.SerializerMethodField()
+
+    def get_enabled_text(self, obj):
+        if obj.enabled:
+            return u'是'
+        return u'否'
+
+    class Meta:
+        model = FinancePurpose
+        fields = '__all__'
+
+    @staticmethod
+    def factory(user, data, id=None):
+        if id:
+            instance = FinancePurpose.getById(id)
+        else:
+            instance = None
+        serializer = FinancePurposeSerializer(instance, data=data)
+        serializer.user = user
+        return serializer
+
+    def create(self, validated_data):
+        validated_data['create_user'] = self.user
+        instance = FinancePurpose.objects.create(**validated_data)
+        BizLog.objects.addnew(
+            self.user,
+            BizLog.INSERT,
+            u"添加财务收支用途[%s],id=%d" % (instance.name, instance.id),
+            validated_data
+        )
+        return instance
+
+    def update(self, instance, validated_data):
+        instance = super(FinancePurposeSerializer, self).update(instance, validated_data)
+        BizLog.objects.addnew(
+            self.user,
+            BizLog.UPDATE,
+            u"修改财务收支用途[%s],id=%d" % (instance.name, instance.id),
+            validated_data
+        )
+        return instance
+
+    def validSave(self):
+        if self.is_valid():
+            return self.save()
+        else:
+            raise CustomError(dump_serializer_errors(self))
+
+
+class FinanceIncomeSerializer(serializers.ModelSerializer):
+    create_user_text = serializers.CharField(source='create_user.name', read_only=True)
+    type_text = serializers.CharField(source='get_type_display', read_only=True)
+    check_status_text = serializers.CharField(source='get_check_status_display', read_only=True)
+    account_text = serializers.CharField(source='account.name', read_only=True)
+    purpose_text = serializers.CharField(source='purpose.name', read_only=True)
+    check_user_text = serializers.CharField(source='check_user.name', read_only=True)
+
+
+    class Meta:
+        model = dbFinanceIncome
+        fields = '__all__'
+
+    @staticmethod
+    def factory(user, data, id=None):
+        if id:
+            instance = dbFinanceIncome.getById(id)
+        else:
+            instance = None
+        serializer = FinanceIncomeSerializer(instance, data=data)
+        serializer.user = user
+        return serializer
+
+    def create(self, validated_data):
+        validated_data['create_user'] = self.user
+        instance = dbFinanceIncome.objects.create(**validated_data)
+        BizLog.objects.addnew(
+            self.user,
+            BizLog.INSERT,
+            u"添加收支单[%s],id=%d" % (instance.no, instance.id),
+            validated_data
+        )
+        return instance
+
+    def update(self, instance, validated_data):
+        instance = super(FinanceIncomeSerializer, self).update(instance, validated_data)
+        BizLog.objects.addnew(
+            self.user,
+            BizLog.UPDATE,
+            u"修改收支单[%s],id=%d" % (instance.no, instance.id),
+            validated_data
+        )
+        return instance
+
+    def validate(self, data):
+        data['amount'] = Formater.formatAmount(data['amount'])
+        return data
+
+    def validSave(self):
+        if self.is_valid():
+            return self.save()
+        else:
+            raise CustomError(dump_serializer_errors(self))

+ 15 - 0
apps/finance/urls.py

@@ -0,0 +1,15 @@
+# coding=utf-8
+from django.conf.urls import url
+
+from views import *
+
+urlpatterns = (
+    url(r'^finance_category/data/$', finance_category_list),
+    url(r'^finance_category/save/$', finance_category_save),
+    url(r'^finance_category/delete/$', finance_category_delete),
+    url(r'^finance_category/dict/$', finance_category_dict),
+
+    url(r'^finance_purpose/data/$', finance_purpose_list),
+    url(r'^finance_purpose/save/$', finance_purpose_save),
+    url(r'^finance_purpose/delete/$', finance_purpose_delete),
+)

+ 126 - 0
apps/finance/views.py

@@ -0,0 +1,126 @@
+# coding=utf-8
+
+import traceback
+import json
+
+from django.db.models import ProtectedError
+from django.views.decorators.csrf import csrf_exempt
+from django.db import transaction, IntegrityError
+
+from apps.finance.filters import FinanceCategoryFilter, FinancePurposeFilter
+from apps.finance.models import FinanceCategory, FinancePurpose, dbFinanceIncome
+from apps.finance.serializers import FinanceCategorySerializer, FinancePurposeSerializer
+from apps.account.decorators import token_required, permission_required
+from apps.foundation.models import BizLog
+
+from libs.http import JSONResponse, JSONError, DataGridJSONResponse
+from libs import utils
+from apps.exceptions import CustomError
+
+
+@csrf_exempt
+@permission_required('finance.view_finance_category')
+def finance_category_list(request):
+    f = FinanceCategoryFilter(request.GET, queryset=FinanceCategory.objects.filter())
+    rows, total = utils.get_page_data(request, f.qs)
+    serializer = FinanceCategorySerializer(rows, many=True)
+    return DataGridJSONResponse(serializer.data, total)\
+
+
+@csrf_exempt
+@token_required
+def finance_category_dict(request):
+    result = {
+        'category': FinanceCategorySerializer(FinanceCategory.objects.filter(enabled=True), many=True).data
+    }
+    return JSONResponse(result)
+
+
+@csrf_exempt
+@permission_required('finance.add_finance_category')
+def finance_category_save(request):
+    id = request.GET.get('id')
+    data = json.loads(request.body)
+
+    try:
+        with transaction.atomic():
+            serializer = FinanceCategorySerializer.factory(request.user, data, id)
+            serializer.validSave()
+    except CustomError, e:
+        return JSONError(e.get_error_msg())
+    except Exception, e:
+        traceback.print_exc()
+        return JSONError(u'保存失败!')
+    return JSONResponse({})
+
+
+@csrf_exempt
+@permission_required('finance.delete_finance_category')
+def finance_category_delete(request):
+    id = request.GET.get('id')
+
+    try:
+        with transaction.atomic():
+            instance = FinanceCategory.getById(id)
+            BizLog.objects.addnew(request.user, BizLog.DELETE, u"删除财务收支类别[%s],id=%d" % (instance.name, instance.id))
+            instance.delete()
+    except CustomError, e:
+        return JSONError(e.get_error_msg())
+    except ProtectedError:
+        return JSONError(u'该财务收支类别已被使用,禁止删除!')
+    except IntegrityError:
+        return JSONError(u'该财务收支类别已被使用,禁止删除!')
+    except Exception, e:
+        traceback.print_exc()
+        return JSONError(u'删除失败!')
+
+    return JSONResponse({})
+
+
+@csrf_exempt
+@permission_required('finance.view_finance_category')
+def finance_purpose_list(request):
+    f = FinancePurposeFilter(request.GET, queryset=FinancePurpose.objects.filter())
+    rows, total = utils.get_page_data(request, f.qs)
+    serializer = FinancePurposeSerializer(rows, many=True)
+    return DataGridJSONResponse(serializer.data, total)
+
+
+@csrf_exempt
+@permission_required('finance.add_finance_category')
+def finance_purpose_save(request):
+    id = request.GET.get('id')
+    data = json.loads(request.body)
+    try:
+        with transaction.atomic():
+            serializer = FinancePurposeSerializer.factory(request.user, data, id)
+            serializer.validSave()
+    except CustomError, e:
+        return JSONError(e.get_error_msg())
+    except Exception, e:
+        traceback.print_exc()
+        return JSONError(u'保存失败!')
+    return JSONResponse({})
+
+
+@csrf_exempt
+@permission_required('finance.delete_finance_category')
+def finance_purpose_delete(request):
+    id = request.GET.get('id')
+
+    try:
+        with transaction.atomic():
+            instance = FinancePurpose.getById(id)
+            BizLog.objects.addnew(request.user, BizLog.DELETE, u"删除财务收支用途[%s],id=%d" % (instance.name, instance.id))
+            instance.delete()
+    except CustomError, e:
+        return JSONError(e.get_error_msg())
+    except ProtectedError:
+        return JSONError(u'该财务收支用途已被使用,禁止删除!')
+    except IntegrityError:
+        return JSONError(u'该财务收支用途已被使用,禁止删除!')
+    except Exception, e:
+        traceback.print_exc()
+        return JSONError(u'删除失败!')
+
+    return JSONResponse({})

+ 3 - 2
apps/foundation/consts.py

@@ -61,7 +61,8 @@ CONTENT_TYPE_SORTING = (
     'foundation-bizlog',  # 权限管理
     'config-config',  # 基础设置
 
-    'product-productbase'
+    'product-productbase',
+    'finance-financecategory',
 
 )
 
@@ -83,7 +84,7 @@ MENU_TO_MODEL = (
                ,'warehouse-warehousebackmap',)),
     (u'基础数据', ('material-material', 'material-consumable', 'goods-goods','warehouse-warehouse'
                , 'warehouse-warehouseadmin','warehouse-warehousestock','account-department'
-               ,'foundation-option','supplier-supplier', 'customer-customer', 'account-user','foundation-bizlog','config-config',)),
+               ,'foundation-option','supplier-supplier', 'customer-customer', 'account-user','foundation-bizlog','config-config', 'finance-financecategory', )),
     (u'其他',('product-productbase',))
 
 )

+ 1 - 1
apps/foundation/models.py

@@ -24,7 +24,7 @@ class Option(models.Model):
         (CONSUMABLE_MODE, u'耗材类别'),
         (GOODS_MODE, u'成品类别'),
         (QUALITY_REQUEST, u'质量要求'),
-        (PAYMENT_ACCOUNT, u'付款账户'),
+        (PAYMENT_ACCOUNT, u'银行账户'),
     )
 
     type = models.PositiveSmallIntegerField(choices=TYPE_CHOICES, verbose_name=u"类别")

+ 2 - 1
apps/order/filters.py

@@ -7,6 +7,7 @@ from models import SaleOrder, GoodsDeliver
 class SaleOrderFilter(django_filters.FilterSet):
     create_time = django_filters.DateTimeFromToRangeFilter(field_name='create_time')
     no = django_filters.CharFilter(name='no', lookup_expr='icontains')
+    cleared = django_filters.CharFilter(name='cleared')
     create_user = django_filters.CharFilter(name='create_user__name', lookup_expr='icontains')
     customer_name = django_filters.CharFilter(name='customer__name', lookup_expr='icontains')
     customer_tel = django_filters.CharFilter(name='customer__mobile', lookup_expr='icontains')
@@ -15,7 +16,7 @@ class SaleOrderFilter(django_filters.FilterSet):
         model = SaleOrder
         fields = (
             'create_time', 'no', 'customer_name', 'customer_tel',
-            'status', 'create_user'
+            'status', 'create_user', 'cleared'
         )
 
     def __init__(self, data=None, *args, **kwargs):

+ 29 - 3
apps/order/models.py

@@ -5,7 +5,7 @@ from apps.customer.models import Customer
 from apps.exceptions import CustomError
 from django.db import models
 from django.conf import settings
-from django.db.models import Sum
+from django.db.models import Sum, F
 
 from apps.account.models import User, Department
 from apps.goods.models import Goods
@@ -22,8 +22,16 @@ class SaleOrder(models.Model):
     department = models.ForeignKey(Department, verbose_name=u"创建部门", editable=False, on_delete=models.PROTECT)
     check_time = models.DateTimeField(verbose_name=u"审核时间", null=True)
     check_user = models.ForeignKey(User, related_name='sale_order_ref_check_user', verbose_name=u"审核人", on_delete=models.PROTECT, null=True)
-    count = models.BigIntegerField(u'数量', default=0)
-    amount = models.BigIntegerField(u'金额', default=0)
+    count = models.BigIntegerField(u'发货数量', default=0)
+    amount = models.BigIntegerField(u'发货金额', default=0)
+    receive_count = models.BigIntegerField(u'收货数量', default=0)
+    receive_amount = models.BigIntegerField(u'收货金额', default=0)
+    pay_amount = models.BigIntegerField(u'已付金额', default=0)
+    put_amount = models.BigIntegerField(u'装车费', default=0)
+    fare_amount = models.BigIntegerField(u'运费', default=0)
+    loss_amount = models.BigIntegerField(u'扣减金额', default=0)
+    loss_notes = models.CharField(max_length=200, verbose_name=u"扣减备注", blank=True, null=True)
+    cleared = models.BooleanField(verbose_name=u"结清", default=False)
 
     class Meta:
         db_table = "sale_order"
@@ -43,6 +51,8 @@ class SaleOrder(models.Model):
             ("delete_sale_order", u"删除"),
             ("export_sale_order", u"导出"),
             ("print_sale_order", u"打印"),
+            ("loss_sale_order", u"扣减"),
+            ("pay_sale_order", u"结算"),
         )
 
     @staticmethod
@@ -65,6 +75,21 @@ class SaleOrder(models.Model):
         self.amount = sum_amount
         self.save()
 
+    def updateReceiveAmount(self):
+        sum_receive_count = 0
+        sum_receive_amount = 0
+
+        sum_row = SaleOrderDetail.objects.filter(main=self).aggregate(
+            sum_receive_count=Sum('receive_count'), sum_receive_amount=Sum(F('receive_count')*F('price'))
+        )
+        if sum_row:
+            sum_receive_count = sum_row['sum_receive_count'] or 0
+            sum_receive_amount = sum_row['sum_receive_amount'] or 0
+
+        self.receive_count = sum_receive_count
+        self.receive_amount = sum_receive_amount
+        self.save()
+
     def save(self, *args, **kwargs):
         if self.no == None or self.no == '':
             now = timezone.now()
@@ -82,6 +107,7 @@ class SaleOrderDetail(models.Model):
     goods = models.ForeignKey(Goods, verbose_name=u'产品', on_delete=models.PROTECT)
     quality_request = models.ForeignKey(Option, verbose_name=u"质量标准", null=True, blank=True, on_delete=models.PROTECT)
     count = models.BigIntegerField(u'数量')
+    receive_count = models.BigIntegerField(u'收货数量')
     price = models.BigIntegerField(u'单价')
     amount = models.BigIntegerField(u'金额', editable=False)
 

+ 18 - 4
apps/order/resources.py

@@ -19,12 +19,25 @@ class SaleOrderResource(resources.Resource):
         self.fields['notes'] = Field(attribute='notes')
         self.fields['count'] = Field(attribute='count')
         self.fields['amount'] = Field(attribute='amount')
+        self.fields['receive_count'] = Field(attribute='receive_count')
+        self.fields['receive_amount'] = Field(attribute='receive_amount')
+        self.fields['pay_amount'] = Field(attribute='pay_amount')
+        self.fields['loss_amount'] = Field(attribute='loss_amount')
+        self.fields['put_amount'] = Field(attribute='put_amount')
+        self.fields['fare_amount'] = Field(attribute='fare_amount')
+        self.fields['total_amount'] = Field(attribute='total_amount')
+        self.fields['clear_text'] = Field(attribute='clear_text')
 
     def get_export_headers(self):
-        return [u'单号', u'客户', u'客户电话', u'产品', u'合计数量', u'合计金额', u'创建时间', u'创建人', u'审核状态', u'审核时间', u'审核人', u'备注']
+        return [u'单号', u'客户', u'客户电话', u'产品', u'合计数量', u'合计金额',
+                u'收货数量', u'收货金额', u'扣减金额', u'应付金额', u'结算金额', u'装车费用', u'运输费用', u'结清',
+                u'创建时间', u'创建人', u'审核状态', u'审核时间', u'审核人', u'备注']
 
     class Meta:
-        fields = ('no', 'customer_name', 'customer_tel', 'products', 'count', 'amount', 'create_time', 'create_user_text', 'check_status_text',
+        fields = ('no', 'customer_name', 'customer_tel', 'products',
+                  'count', 'amount', 'receive_count', 'receive_amount', 'loss_amount',
+                  'total_amount', 'pay_amount', 'put_amount', 'fare_amount', 'clear_text',
+                  'create_time', 'create_user_text', 'check_status_text',
                   'check_time', 'check_user_text', 'notes',)
         export_order = fields
 
@@ -36,14 +49,15 @@ class SaleOrderDetailResource(resources.Resource):
         self.fields['model'] = Field(attribute='model')
         self.fields['quality_request_text'] = Field(attribute='quality_request_text')
         self.fields['count'] = Field(attribute='count')
+        self.fields['receive_count'] = Field(attribute='receive_count')
         self.fields['price'] = Field(attribute='price')
         self.fields['amount'] = Field(attribute='amount')
 
     def get_export_headers(self):
-        return [u'产品名称', u'产品代码', u'质量标准',u'数量', u'单价', u'金额',]
+        return [u'产品名称', u'产品代码', u'质量标准',u'数量', u'收货数量', u'单价', u'金额',]
 
     class Meta:
-        fields = ('name', 'model', 'quality_request_text', 'count', 'price', 'amount',)
+        fields = ('name', 'model', 'quality_request_text', 'count', 'receive_count', 'price', 'amount',)
         export_order = fields
 
 

+ 19 - 1
apps/order/serializers.py

@@ -1,7 +1,7 @@
 #coding=utf-8
 
 from rest_framework import serializers
-
+from django.db.models import Q, F, Sum
 from apps.base import Formater
 from apps.exceptions import CustomError
 from apps.foundation.models import BizLog
@@ -27,8 +27,16 @@ class SaleOrderSerializer(serializers.ModelSerializer):
     customer_id = serializers.CharField(source='customer.id', read_only=True)
     customer_tel = serializers.CharField(source='customer.mobile', read_only=True)
     products = serializers.SerializerMethodField()
+    total_amount = serializers.SerializerMethodField()
+    clear_text = serializers.SerializerMethodField()
     count = CountShowCharField(read_only=True)
     amount = AmountShowCharField(read_only=True)
+    receive_count = CountShowCharField(read_only=True)
+    receive_amount = AmountShowCharField(read_only=True)
+    pay_amount = AmountShowCharField(read_only=True)
+    loss_amount = AmountShowCharField(read_only=True)
+    put_amount = AmountShowCharField(read_only=True)
+    fare_amount = AmountShowCharField(read_only=True)
 
     class Meta:
         model = SaleOrder
@@ -40,6 +48,15 @@ class SaleOrderSerializer(serializers.ModelSerializer):
         data.extend([s[0] for s in rows.values_list('goods__product_base__name')])
         return ','.join(data)
 
+    def get_total_amount(self, obj):
+        amount = Formater.formatAmountShow((obj.receive_amount or 0) - (obj.loss_amount or 0))
+        return amount
+
+    def get_clear_text(self, obj):
+        if obj.cleared:
+            return u'是'
+        return u'否'
+
     @staticmethod
     def factory(user, data,id=None):
         if id:
@@ -84,6 +101,7 @@ class SaleOrderDetailSerializer(serializers.ModelSerializer):
     quality_request_text = serializers.CharField(source='quality_request.name', read_only=True)
     quality_request_id = serializers.CharField(source='quality_request.id', read_only=True)
     count = CountShowCharField()
+    receive_count = CountShowCharField()
     price = PriceShowCharField()
     amount = AmountShowCharField(read_only=True)
 

+ 4 - 0
apps/order/urls.py

@@ -11,6 +11,10 @@ urlpatterns = (
     url(r'^sale_order/detail/$', sale_order_detail),
     url(r'^sale_order/check/$', sale_order_check),
     url(r'^sale_order/delete/$', sale_order_delete),
+    url(r'^sale_order/loss_save/$', sale_order_loss_save),
+    url(r'^sale_order/pay/$', sale_order_pay),
+    url(r'^sale_order/fare_save/$', sale_order_fare_save),
+    url(r'^sale_order/clear/$', sale_order_clear),
     url(r'^sale_order/export_detail/$', sale_order_export_detail),
 
     url(r'^sale_order/select/$', sale_order_select),

+ 206 - 2
apps/order/views.py

@@ -29,6 +29,8 @@ from django.conf import settings
 from apps.foundation.models import BizLog, Option
 from resources import SaleOrderResource, SaleOrderDetailResource, GoodsDeliverDetailResource, GoodsDeliverResource, \
     GoodsDeliverQueryResource, GoodsDeliverReturnQueryResource
+from apps.finance.models import dbFinanceIncome
+from apps.finance.serializers import FinanceIncomeSerializer
 
 
 @csrf_exempt
@@ -38,10 +40,26 @@ def sale_order_list(request):
     user_ids = request.user.getSubEmployeeIds()
     rows = SaleOrder.objects.filter(Q(department_id__in=department_ids) | Q(create_user_id__in=user_ids) | Q(create_user=request.user))
     f = SaleOrderFilter(request.GET, queryset=rows)
-    total_row = f.qs.aggregate(sum_count=Sum('count'), sum_amount=Sum('amount'))
+    total_row = f.qs.aggregate(
+        sum_count=Sum('count'),
+        sum_amount=Sum('amount'),
+        sum_receive_count=Sum('receive_count'),
+        sum_receive_amount=Sum('receive_amount'),
+        sum_pay_amount=Sum('pay_amount'),
+        sum_put_amount=Sum('put_amount'),
+        sum_fare_amount=Sum('fare_amount'),
+        sum_loss_amount=Sum('loss_amount')
+    )
     more = {
         'sum_count': Formater.formatCountShow(total_row['sum_count']),
-        'sum_amount': Formater.formatAmountShow(total_row['sum_amount'])
+        'sum_amount': Formater.formatAmountShow(total_row['sum_amount']),
+        'sum_receive_count': Formater.formatCountShow(total_row['sum_receive_count']),
+        'sum_receive_amount': Formater.formatAmountShow(total_row['sum_receive_amount']),
+        'sum_pay_amount': Formater.formatAmountShow(total_row['sum_pay_amount']),
+        'sum_put_amount': Formater.formatAmountShow(total_row['sum_put_amount']),
+        'sum_fare_amount': Formater.formatAmountShow(total_row['sum_fare_amount']),
+        'sum_loss_amount': Formater.formatAmountShow(total_row['sum_loss_amount']),
+        'sum_total_amount': Formater.formatAmountShow((total_row['sum_receive_amount'] or 0)-(total_row['sum_loss_amount'] or 0)),
     }
     rows, total = utils.get_page_data(request, f.qs)
     serializer = SaleOrderSerializer(rows, many=True)
@@ -119,6 +137,7 @@ def sale_order_detail(request):
         'no': sale_order.no,
         'total_count': Formater.formatCountShow(sale_order.count),
         'total_amount': Formater.formatAmountShow(sale_order.amount),
+        'loss_amount': Formater.formatAmountShow(sale_order.loss_amount),
         'name': sale_order.customer.name,
         'mobile': sale_order.customer.mobile,
         'customer_id': sale_order.customer.id,
@@ -129,6 +148,7 @@ def sale_order_detail(request):
         'check_time': sale_order.check_time and Formater.formatStrTime(sale_order.check_time) or '',
         'create_time': Formater.formatStrTime(sale_order.create_time),
         'notes': sale_order.notes or '',
+        'loss_notes': sale_order.loss_notes or '',
     }
     data = {
         'main_data':main_data,
@@ -147,6 +167,7 @@ def sale_order_detail(request):
             'quality_request_text': row.quality_request and row.quality_request.name or '',
             'warehouse_place': row.goods.product_base.warehouse_place,
             'count': Formater.formatCountShow(row.count),
+            'receive_count': Formater.formatCountShow(row.receive_count),
             'price': Formater.formatPriceShow(row.price),
             'amount': Formater.formatAmountShow(row.amount)
         }
@@ -195,6 +216,11 @@ def sale_order_check(request):
                 order.status = settings.PASS
                 order.check_user = request.user
                 order.check_time = timezone.now()
+
+                SaleOrderDetail.objects.filter(main_id=order.id).update(receive_count=F('count'))
+
+                order.updateReceiveAmount()
+
                 BizLog.objects.addnew(
                     request.user,
                     BizLog.CHECK,
@@ -209,6 +235,10 @@ def sale_order_check(request):
                 order.status = settings.DEFAULT
                 order.check_user = None
                 order.check_time = None
+
+                SaleOrderDetail.objects.filter(main_id=order.id).update(receive_count=0)
+                order.updateReceiveAmount()
+
                 BizLog.objects.addnew(
                     request.user,
                     BizLog.CHECK,
@@ -222,6 +252,180 @@ def sale_order_check(request):
         return JSONError(u'审核失败')
     return JSONResponse({})
 
+@csrf_exempt
+@permission_required('order.loss_sale_order')
+def sale_order_loss_save(request):
+    id = request.GET.get('id')
+    data = json.loads(request.body)
+
+    try:
+        with transaction.atomic():
+            order = SaleOrder.getById(id)
+            if order.status == settings.DEFAULT:
+                raise CustomError(u'该订单尚未审核')
+            loss_amount = data['order_data']['amount']
+            loss_notes = data['order_data']['notes']
+            for item in data['items']:
+                detail = SaleOrderDetail.objects.filter(id=item['detail_id']).first()
+                detail.receive_count = Formater.formatCount(item['receive_count'])
+                detail.save()
+
+            order.updateReceiveAmount()
+            order.loss_amount = Formater.formatAmount(loss_amount)
+            order.loss_notes = loss_notes
+            order.save()
+            BizLog.objects.addnew(
+                request.user,
+                BizLog.UPDATE,
+                u"销售订单[%s]扣减,id=%d" % (order.no, order.id),
+            )
+
+    except CustomError, e:
+        return JSONError(e.get_error_msg())
+    except Exception, e:
+        traceback.print_exc()
+        return JSONError(u'保存失败')
+    return JSONResponse({})
+
+
+@csrf_exempt
+@permission_required('order.pay_sale_order')
+def sale_order_pay(request):
+    id = request.GET.get('id')
+    data = json.loads(request.body)
+
+    try:
+        with transaction.atomic():
+            order = SaleOrder.getById(id)
+            if order.status == settings.DEFAULT:
+                raise CustomError(u'该订单尚未审核')
+            if order.cleared:
+                raise CustomError(u'该订单已结清')
+
+            order.pay_amount += Formater.formatAmount(data['actual_amount'])
+            order.save()
+            total_amount = order.receive_amount - order.loss_amount
+
+            if order.pay_amount >= total_amount:
+                order.cleared = True
+                order.save()
+
+            income_data = {
+                'referer_no': order.no,
+                'type': dbFinanceIncome.SALE_ENTRY_PAY,
+                'amount': data['actual_amount'],
+                'account': data['account'],
+                'check_status': settings.PASS,
+                'check_user':request.user.id,
+                'department':request.user.department_id,
+                'check_time': timezone.now(),
+                'notes': data['notes']
+            }
+
+            income = FinanceIncomeSerializer.factory(request.user, income_data)
+            income.validSave()
+
+    except CustomError, e:
+        return JSONError(e.get_error_msg())
+    except Exception, e:
+        traceback.print_exc()
+        return JSONError(u'保存失败')
+    return JSONResponse({})
+
+
+@csrf_exempt
+@permission_required('order.pay_sale_order')
+def sale_order_fare_save(request):
+    id = request.GET.get('id')
+    data = json.loads(request.body)
+
+    try:
+        with transaction.atomic():
+            order = SaleOrder.getById(id)
+            fare_amount = data['fare_amount']
+            fare_account = data['fare_account']
+            put_amount = data['put_amount']
+            put_account = data['put_account']
+
+            if fare_amount != 0:
+                if not fare_account:
+                    raise CustomError(u'请选择运费账户')
+                fare_amount = Formater.formatAmount(fare_amount)
+                order.fare_amount += fare_amount
+
+                income_data = {
+                    'referer_no': order.no,
+                    'type': dbFinanceIncome.SALE_ENTRY_FARE,
+                    'amount': -data['fare_amount'],
+                    'account': fare_account,
+                    'check_status': settings.PASS,
+                    'check_user': request.user.id,
+                    'department': request.user.department_id,
+                    'check_time': timezone.now()
+                }
+
+                pb = FinanceIncomeSerializer.factory(request.user, income_data)
+                pb.validSave()
+
+            if put_amount != 0:
+                if not put_account:
+                    raise CustomError(u'请选择装车费账户')
+                put_amount = Formater.formatAmount(put_amount)
+                order.put_amount += put_amount
+
+                income_data = {
+                    'referer_no': order.no,
+                    'type': dbFinanceIncome.SALE_ENTRY_UNLOAD,
+                    'amount': -data['put_amount'],
+                    'account': put_account,
+                    'check_status': settings.PASS,
+                    'check_user': request.user.id,
+                    'department': request.user.department_id,
+                    'check_time': timezone.now()
+                }
+
+                pb = FinanceIncomeSerializer.factory(request.user, income_data)
+                pb.validSave()
+
+            order.save()
+
+    except CustomError, e:
+        return JSONError(e.get_error_msg())
+    except Exception, e:
+        traceback.print_exc()
+        return JSONError(u'保存失败')
+    return JSONResponse({})
+
+
+@csrf_exempt
+@permission_required('order.pay_sale_order')
+def sale_order_clear(request):
+    id = request.GET.get('id')
+
+    try:
+        with transaction.atomic():
+            order = SaleOrder.getById(id)
+            if order.status == settings.DEFAULT:
+                raise CustomError(u'该订单未审核')
+
+            if order.cleared:
+                raise CustomError(u'该订单已结清')
+
+            order.cleared = True
+            order.save()
+            BizLog.objects.addnew(
+                request.user,
+                BizLog.CHECK,
+                u"销售订单[%s]结清,id=%d" % (order.no, order.id),
+            )
+
+    except CustomError, e:
+        return JSONError(e.get_error_msg())
+    except Exception, e:
+        traceback.print_exc()
+        return JSONError(u'结清失败')
+    return JSONResponse({})
+
 @csrf_exempt
 @permission_required('order.export_sale_order')
 def sale_order_export_detail(request):

+ 1 - 9
apps/purchase/filters.py

@@ -40,7 +40,7 @@ class PurchaseOrderFilter(django_filters.FilterSet):
     create_time = django_filters.DateTimeFromToRangeFilter(field_name='create_time')
     no = django_filters.CharFilter(name='no', lookup_expr='icontains')
     supplier_name = django_filters.CharFilter(name='supplier__name', lookup_expr='icontains')
-    status = django_filters.CharFilter(method='filter_status')
+    status = django_filters.CharFilter(field_name='status')
     notes = django_filters.CharFilter(name='notes', lookup_expr='icontains')
 
     class Meta:
@@ -52,14 +52,6 @@ class PurchaseOrderFilter(django_filters.FilterSet):
         data = clean_datetime_range(data, 'create_time','source')
         super(PurchaseOrderFilter, self).__init__(data, *args, **kwargs)
 
-    def filter_status(self, queryset, *args):
-        if args[1]:
-            value = int(args[1])
-            if value != 3:
-                queryset = queryset.filter(status=value)
-            else:
-                queryset = queryset.filter(~Q(status=PurchaseOrder.TAKE_EFFECT))
-        return queryset
 
 class PurchaseOrderDetailFilter(django_filters.FilterSet):
     supplier_name = django_filters.CharFilter(name='main__supplier__name', lookup_expr='icontains')

+ 23 - 25
apps/purchase/models.py

@@ -180,13 +180,11 @@ class PurchasePrice(models.Model):
 
 
 class PurchaseOrder(models.Model):
-    DRAFT = 0
-    TAKE_EFFECT = 1
-    CHECKING = 2
+    DEFAULT = 0
+    PASS = 1
     STATUS_CHOICES = (
-        (DRAFT, u'草拟'),
-        (TAKE_EFFECT, u'生效'),
-        (CHECKING, u'审核中'),
+        (DEFAULT, u'未审核'),
+        (PASS, u'已审核')
     )
 
     NO_ARRVAL = 0
@@ -205,7 +203,7 @@ class PurchaseOrder(models.Model):
     amount = models.BigIntegerField(u'金额', default=0)
     apply_amount = models.BigIntegerField(verbose_name=u'申请金额', default=0)
     plan = models.ForeignKey(PurchasePlan, verbose_name=u"采购计划", on_delete=models.PROTECT, blank=True,null=True)
-    status = models.PositiveSmallIntegerField(choices=STATUS_CHOICES, verbose_name=u"状态", default=DRAFT)
+    status = models.PositiveSmallIntegerField(choices=STATUS_CHOICES, verbose_name=u"状态", default=DEFAULT)
     arrval = models.PositiveSmallIntegerField(choices=ARRVAL_CHOICES, verbose_name=u"到货", default=NO_ARRVAL)
     notes = models.CharField(max_length=200, verbose_name=u"备注", blank=True, null=True)
     create_time = models.DateTimeField(verbose_name=u"创建时间", default=timezone.now)
@@ -216,13 +214,13 @@ class PurchaseOrder(models.Model):
     payment_type = models.CharField(max_length=50, verbose_name=u"付款方式", null=True, blank=True)
     deliver_time = models.CharField(max_length=200, verbose_name=u"交货时间", blank=True, null=True)
 
-    check_user2 = models.ForeignKey(User, verbose_name=u"复核人", related_name='purchase_order_ref_check_user2',
-                                    on_delete=models.PROTECT, null=True, blank=True)
-    check_time2 = models.DateTimeField(verbose_name=u"复核时间", null=True)
-
-    check_user3 = models.ForeignKey(User, verbose_name=u"批准人", related_name='purchase_order_ref_check_user3',
-                                    on_delete=models.PROTECT, null=True, blank=True)
-    check_time3 = models.DateTimeField(verbose_name=u"批准时间", null=True)
+    # check_user2 = models.ForeignKey(User, verbose_name=u"复核人", related_name='purchase_order_ref_check_user2',
+    #                                 on_delete=models.PROTECT, null=True, blank=True)
+    # check_time2 = models.DateTimeField(verbose_name=u"复核时间", null=True)
+    #
+    # check_user3 = models.ForeignKey(User, verbose_name=u"批准人", related_name='purchase_order_ref_check_user3',
+    #                                 on_delete=models.PROTECT, null=True, blank=True)
+    # check_time3 = models.DateTimeField(verbose_name=u"批准时间", null=True)
     consignee_name = models.CharField(max_length=100, verbose_name=u"收货人姓名", null=True)
     consignee_tel = models.CharField(max_length=100, verbose_name=u"收货人电话", null=True)
 
@@ -249,8 +247,8 @@ class PurchaseOrder(models.Model):
             ("delete_purchase_order", u"删除"),
             ("export_purchase_order", u"导出"),
             ("print_purchase_order", u"打印"),
-            ("check2_purchase_order", u"复核"),
-            ("check3_purchase_order", u"批准"),
+            # ("check2_purchase_order", u"复核"),
+            # ("check3_purchase_order", u"批准"),
         )
 
     def updateApplyAmount(self):
@@ -394,13 +392,13 @@ class PurchasePayment(models.Model):
     department = models.ForeignKey(Department, verbose_name=u"创建部门", editable=False, on_delete=models.PROTECT)
     check_time = models.DateTimeField(verbose_name=u"审核时间", null=True)
     check_user = models.ForeignKey(User, related_name='purchase_payment_ref_check_user', verbose_name=u"审核人", on_delete=models.PROTECT, null=True)
-    review_user = models.ForeignKey(User, verbose_name=u"复核人", related_name='purchase_payment_ref_review_user',
-                                    on_delete=models.PROTECT, null=True, blank=True)
-    review_time = models.DateTimeField(verbose_name=u"复核时间", null=True)
-
-    ratify_user = models.ForeignKey(User, verbose_name=u"批准人", related_name='purchase_payment_ref_ratify_user',
-                                    on_delete=models.PROTECT, null=True, blank=True)
-    ratify_time = models.DateTimeField(verbose_name=u"批准时间", null=True)
+    # review_user = models.ForeignKey(User, verbose_name=u"复核人", related_name='purchase_payment_ref_review_user',
+    #                                 on_delete=models.PROTECT, null=True, blank=True)
+    # review_time = models.DateTimeField(verbose_name=u"复核时间", null=True)
+    #
+    # ratify_user = models.ForeignKey(User, verbose_name=u"批准人", related_name='purchase_payment_ref_ratify_user',
+    #                                 on_delete=models.PROTECT, null=True, blank=True)
+    # ratify_time = models.DateTimeField(verbose_name=u"批准时间", null=True)
     is_clear = models.BooleanField(verbose_name=u"是否结清", default=0)
 
     class Meta:
@@ -418,8 +416,8 @@ class PurchasePayment(models.Model):
             ("view_purchase_payment", u"浏览"),
             ("add_purchase_payment", u"添加"),
             ("check_purchase_payment", u"审核"),
-            ("review_purchase_payment", u"复核"),
-            ("ratify_purchase_payment", u"批准"),
+            # ("review_purchase_payment", u"复核"),
+            # ("ratify_purchase_payment", u"批准"),
             ("pay_purchase_payment", u"付款"),
             ("delete_purchase_payment", u"删除"),
             ("export_purchase_payment", u"导出"),

+ 8 - 8
apps/purchase/serializers.py

@@ -274,10 +274,10 @@ class PurchaseOrderSerializer(serializers.ModelSerializer):
     count = CountShowCharField()
     amount = AmountShowCharFieldWithTwoDecimalPlaces()
     apply_amount = AmountShowCharFieldWithTwoDecimalPlaces(read_only=True)
-    check_user_text2 = serializers.CharField(source='check_user2.name', read_only=True)
-    check_time2 = serializers.DateTimeField(format=base.DATETIME_FORMAT, read_only=True)
-    check_user_text3 = serializers.CharField(source='check_user3.name', read_only=True)
-    check_time3 = serializers.DateTimeField(format=base.DATETIME_FORMAT, read_only=True)
+    # check_user_text2 = serializers.CharField(source='check_user2.name', read_only=True)
+    # check_time2 = serializers.DateTimeField(format=base.DATETIME_FORMAT, read_only=True)
+    # check_user_text3 = serializers.CharField(source='check_user3.name', read_only=True)
+    # check_time3 = serializers.DateTimeField(format=base.DATETIME_FORMAT, read_only=True)
 
     class Meta:
         model = PurchaseOrder
@@ -646,10 +646,10 @@ class PurchasePaymentSerializer(serializers.ModelSerializer):
     actual_amount_CNY = serializers.SerializerMethodField()
     apply_amount_CNY = serializers.SerializerMethodField()
 
-    review_user_text = serializers.CharField(source='review_user.name', read_only=True)
-    review_time = serializers.DateTimeField(format=base.DATETIME_FORMAT, read_only=True)
-    ratify_user_text = serializers.CharField(source='ratify_user.name', read_only=True)
-    ratify_time = serializers.DateTimeField(format=base.DATETIME_FORMAT, read_only=True)
+    # review_user_text = serializers.CharField(source='review_user.name', read_only=True)
+    # review_time = serializers.DateTimeField(format=base.DATETIME_FORMAT, read_only=True)
+    # ratify_user_text = serializers.CharField(source='ratify_user.name', read_only=True)
+    # ratify_time = serializers.DateTimeField(format=base.DATETIME_FORMAT, read_only=True)
 
     class Meta:
         model = PurchasePayment

+ 0 - 2
apps/purchase/urls.py

@@ -41,8 +41,6 @@ urlpatterns = (
     url(r'^purchase_payment/detail/$', purchase_payment_detail),
     url(r'^purchase_payment/delete/$', purchase_payment_delete),
     url(r'^purchase_payment/check/$', purchase_payment_check),
-    url(r'^purchase_payment/review/$', purchase_payment_review),
-    url(r'^purchase_payment/ratify/$', purchase_payment_ratify),
     url(r'^purchase_payment/pay/$', purchase_payment_pay),
     url(r'^purchase_payment/pay/detail/$', purchase_payment_pay_detail),
     url(r'^purchase_payment/export_detail/$', purchase_payment_export_detail),

+ 64 - 211
apps/purchase/views.py

@@ -625,7 +625,8 @@ def purchase_order_edit(request):
         with transaction.atomic():
 
             order = PurchaseOrder.objects.filter(id=id).first()
-            if order.status > PurchaseOrder.DRAFT:
+            # if order.status > PurchaseOrder.DRAFT:
+            if order.status != PurchaseOrder.DEFAULT:
                 raise CustomError(u'该合同已审核,禁止修改')
 
             order.supplier_id = data['supplier']
@@ -654,7 +655,8 @@ def purchase_order_save(request):
     try:
         with transaction.atomic():
             pb = PurchaseOrderSerializer.factory(request.user, data['order_data'], id)
-            if pb.instance and pb.instance.status == PurchaseOrder.TAKE_EFFECT:
+            # if pb.instance and pb.instance.status == PurchaseOrder.TAKE_EFFECT:
+            if pb.instance and pb.instance.status != PurchaseOrder.DEFAULT:
                 raise CustomError(u'该合同已审核,禁止修改')
             pb = pb.validSave()
             PurchaseOrderDetail.objects.filter(main_id=pb.id).delete()
@@ -767,10 +769,10 @@ def purchase_order_detail(request):
             'create_user': purchase_order.create_user and purchase_order.create_user.name or '',
             'create_time': Formater.formatStrTime(purchase_order.create_time),
             'deliver_time': Formater.formatStrTime(purchase_order.deliver_time),
-            'check_user2': purchase_order.check_user2 and purchase_order.check_user2.name or '',
-            'check_time2': Formater.formatStrTime(purchase_order.check_time2),
-            'check_user3': purchase_order.check_user3 and purchase_order.check_user3.name or '',
-            'check_time3': Formater.formatStrTime(purchase_order.check_time3),
+            # 'check_user2': purchase_order.check_user2 and purchase_order.check_user2.name or '',
+            # 'check_time2': Formater.formatStrTime(purchase_order.check_time2),
+            # 'check_user3': purchase_order.check_user3 and purchase_order.check_user3.name or '',
+            # 'check_time3': Formater.formatStrTime(purchase_order.check_time3),
             'consignee_name': purchase_order.consignee_name,
             'consignee_tel': purchase_order.consignee_tel,
         }
@@ -829,9 +831,10 @@ def select_purchase_order(request):
     if not no:
         return JSONError(u'请输入合同单号!')
 
-    rows = PurchaseOrderDetail.objects.filter(main__no=no, main__status=PurchaseOrder.TAKE_EFFECT)
+    # rows = PurchaseOrderDetail.objects.filter(main__no=no, main__status=PurchaseOrder.TAKE_EFFECT)
+    rows = PurchaseOrderDetail.objects.filter(main__no=no, main__status=PurchaseOrder.PASS)
     if rows.count() == 0:
-        return JSONError(u'合同单号不正确或该合同尚未生效!')
+        return JSONError(u'合同单号不正确或该合同尚未审核!')
     if rows[0].main.apply_amount >= rows[0].main.amount:
         return JSONError(u'该合同已付款完毕!')
     result = {
@@ -861,8 +864,9 @@ def purchase_order_delete(request):
     try:
         with transaction.atomic():
             order = PurchaseOrder.getById(id)
-            if order.status != PurchaseOrder.DRAFT:
-                raise CustomError(u'该采购合同已生效, 不允许删除')
+            # if order.status != PurchaseOrder.DRAFT:
+            if order.status != PurchaseOrder.DEFAULT:
+                raise CustomError(u'该采购合同已审核, 不允许删除')
 
             # 删除发票图片
             image_rows = PurchaseInvoiceImage.objects.filter(order_detail__main_id=order.id)
@@ -901,116 +905,47 @@ def purchase_order_delete(request):
 @permission_required('purchase.check_purchase_order')
 def purchase_order_check(request):
     id = request.GET.get('id')
-    c_type = request.GET.get('c_type')
     status = int(request.GET.get('status'))
     try:
         with transaction.atomic():
             order = PurchaseOrder.getById(id)
-            if c_type == 'check':
-                if status == PurchaseOrder.TAKE_EFFECT:
-                    if order.status == PurchaseOrder.CHECKING:
-                        raise CustomError(u'该采购合同已审核')
-                    if not order.no:
-                        raise CustomError(u'该采购合同未填写合同号, 不允许审核')
-                    exist_rows = PurchaseOrder.objects.filter(Q(no=order.no), ~Q(id=id)).first()
-                    if exist_rows:
-                        raise CustomError(u'该采购合同单号已存在')
-                    order.status = PurchaseOrder.CHECKING
-                    order.check_user = request.user
-                    order.check_time = timezone.now()
-                    BizLog.objects.addnew(
-                        request.user,
-                        BizLog.CHECK,
-                        u"审核采购合同[%s],id=%d" % (order.no, order.id),
-                    )
-                else:
-                    if order.status == PurchaseOrder.DRAFT:
-                        raise CustomError(u'该采购合同尚未审核')
-                    if order.check_user2:
-                        raise CustomError(u'该采购合同已复核')
-                    g_row = GodownEntry.objects.filter(purchase_order=order).first()
-                    if g_row:
-                        raise CustomError(u'该合同已存在入库单, 不允许撤销审核')
-                    pay = PurchasePayment.objects.filter(order=order).first()
-                    if pay:
-                        raise CustomError(u'该合同已存在付款单, 不允许撤销审核')
-
-                    d_row = PurchaseOrderDetail.objects.filter(main=order, invoice_no__isnull=False, check_status=settings.PASS).first()
-                    if d_row:
-                        raise CustomError(u'该合同已审核发票, 不允许撤销审核')
-                    order.status = PurchaseOrder.DRAFT
-                    order.check_user = None
-                    order.check_time = None
-                    BizLog.objects.addnew(
-                        request.user,
-                        BizLog.CHECK,
-                        u"采购合同取消审核[%s],id=%d" % (order.no, order.id),
-                    )
-            elif c_type == 'check2':
-                #复核
-                if status == PurchaseOrder.TAKE_EFFECT:
-                    if order.status == PurchaseOrder.DRAFT:
-                        raise CustomError(u'该采购合同未审核')
-                    if order.check_user3:
-                        raise CustomError(u'该采购合同已批准')
-
-                    order.check_user2 = request.user
-                    order.check_time2 = timezone.now()
-                    BizLog.objects.addnew(
-                        request.user,
-                        BizLog.CHECK,
-                        u"采购合同复核[%s],id=%d" % (order.no, order.id),
-                    )
-                else:
-                    if not order.check_user2:
-                        raise CustomError(u'该采购计划未复核')
-                    if order.check_user3:
-                        raise CustomError(u'该采购计划已批准')
-
-                    order.check_user2 = None
-                    order.check_time2 = None
-                    BizLog.objects.addnew(
-                        request.user,
-                        BizLog.CHECK,
-                        u"采购合同取消复核[%s],id=%d" % (order.no, order.id),
-                    )
-            elif c_type == 'check3':
-                #批准
-                if status == PurchaseOrder.TAKE_EFFECT:
-                    if not order.check_user2:
-                        raise CustomError(u'该采购合同未复核')
-                    if order.check_user3:
-                        raise CustomError(u'该采购合同已批准')
-                    order.status = status
-                    order.check_user3 = request.user
-                    order.check_time3 = timezone.now()
-                    BizLog.objects.addnew(
-                        request.user,
-                        BizLog.CHECK,
-                         u"采购合同批准[%s],id=%d" % (order.no, order.id),
-                    )
-                else:
-                    if not order.check_user3:
-                        raise CustomError(u'该采购合同未批准')
-                    g_row = GodownEntry.objects.filter(purchase_order=order).first()
-                    if g_row:
-                        raise CustomError(u'该合同已存在入库单, 不允许撤销')
-                    pay = PurchasePayment.objects.filter(order=order).first()
-                    if pay:
-                        raise CustomError(u'该合同已存在付款单, 不允许撤销')
-
-                    d_row = PurchaseOrderDetail.objects.filter(main=order, invoice_no__isnull=False,
-                                                               check_status=settings.PASS).first()
-                    if d_row:
-                        raise CustomError(u'该合同已审核发票, 不允许撤销')
-                    order.status = PurchaseOrder.CHECKING
-                    order.check_user3 = None
-                    order.check_time3 = None
-                    BizLog.objects.addnew(
-                        request.user,
-                        BizLog.CHECK,
-                         u"采购合同取消批准[%s],id=%d" % (order.no, order.id),
-                    )
+            if status == PurchaseOrder.PASS:
+                if order.status == PurchaseOrder.PASS:
+                    raise CustomError(u'该采购合同已审核')
+                if not order.no:
+                    raise CustomError(u'该采购合同未填写合同号, 不允许审核')
+                exist_rows = PurchaseOrder.objects.filter(Q(no=order.no), ~Q(id=id)).first()
+                if exist_rows:
+                    raise CustomError(u'该采购合同单号已存在')
+                order.status = PurchaseOrder.PASS
+                order.check_user = request.user
+                order.check_time = timezone.now()
+                BizLog.objects.addnew(
+                    request.user,
+                    BizLog.CHECK,
+                    u"审核采购合同[%s],id=%d" % (order.no, order.id),
+                )
+            else:
+                if order.status == PurchaseOrder.DEFAULT:
+                    raise CustomError(u'该采购合同尚未审核')
+                g_row = GodownEntry.objects.filter(purchase_order=order).first()
+                if g_row:
+                    raise CustomError(u'该合同已存在入库单, 不允许撤销审核')
+                pay = PurchasePayment.objects.filter(order=order).first()
+                if pay:
+                    raise CustomError(u'该合同已存在付款单, 不允许撤销审核')
+
+                d_row = PurchaseOrderDetail.objects.filter(main=order, invoice_no__isnull=False, check_status=settings.PASS).first()
+                if d_row:
+                    raise CustomError(u'该合同已审核发票, 不允许撤销审核')
+                order.status = PurchaseOrder.DEFAULT
+                order.check_user = None
+                order.check_time = None
+                BizLog.objects.addnew(
+                    request.user,
+                    BizLog.CHECK,
+                    u"采购合同取消审核[%s],id=%d" % (order.no, order.id),
+                )
             order.save()
     except CustomError, e:
         return JSONError(e.get_error_msg())
@@ -1247,7 +1182,7 @@ def purchase_payment_check(request):
             if status == settings.PASS:
                 if order.status == settings.PASS:
                     raise CustomError(u'该付款单已审核')
-                order.status = settings.CHECKING
+                order.status = settings.PASS
                 order.check_user = request.user
                 order.check_time = timezone.now()
                 BizLog.objects.addnew(
@@ -1258,8 +1193,8 @@ def purchase_payment_check(request):
             else:
                 if order.status == settings.DEFAULT:
                     raise CustomError(u'该付款单尚未审核')
-                if order.review_time:
-                    raise CustomError(u'该付款单已复核,请先撤销复核')
+                # if order.review_time:
+                #     raise CustomError(u'该付款单已复核,请先撤销复核')
                 if order.is_pay:
                     raise CustomError(u'该付款单已付款,禁止撤销审核')
                 order.status = settings.DEFAULT
@@ -1278,92 +1213,6 @@ def purchase_payment_check(request):
         return JSONError(u'审核失败')
     return JSONResponse({})
 
-@csrf_exempt
-@permission_required('purchase.review_purchase_payment')
-def purchase_payment_review(request):
-    id = request.GET.get('id')
-    status = int(request.GET.get('status'))
-    try:
-        with transaction.atomic():
-            order = PurchasePayment.getById(id)
-            if status == 1:
-                if order.status == settings.DEFAULT:
-                    raise CustomError(u'该付款单尚未审核')
-                if order.review_time:
-                    raise CustomError(u'该付款单已复核')
-                order.review_user = request.user
-                order.review_time = timezone.now()
-                BizLog.objects.addnew(
-                    request.user,
-                    BizLog.CHECK,
-                    u"复核采购付款[%s],id=%d" % (order.no, order.id),
-                )
-            else:
-                if not order.review_time:
-                    raise CustomError(u'该付款单尚未复核')
-                if order.ratify_time:
-                    raise CustomError(u'该付款单已批准')
-                if order.is_pay:
-                    raise CustomError(u'该付款单已付款,禁止撤销复核')
-                order.review_user = None
-                order.review_time = None
-                BizLog.objects.addnew(
-                    request.user,
-                    BizLog.CHECK,
-                    u"采购付款单撤销复核[%s],id=%d" % (order.no, order.id),
-                )
-            order.save()
-    except CustomError, e:
-        return JSONError(e.get_error_msg())
-    except Exception, e:
-        traceback.print_exc()
-        return JSONError(u'复核失败')
-    return JSONResponse({})
-
-
-@csrf_exempt
-@permission_required('purchase.ratify_purchase_payment')
-def purchase_payment_ratify(request):
-    id = request.GET.get('id')
-    status = int(request.GET.get('status'))
-    try:
-        with transaction.atomic():
-            order = PurchasePayment.getById(id)
-            if status == 1:
-                if order.status == settings.DEFAULT:
-                    raise CustomError(u'该付款单尚未审核')
-                if not order.review_time:
-                    raise CustomError(u'该付款单尚未复核,请先复核')
-                if order.ratify_time:
-                    raise CustomError(u'该付款单已批准')
-                order.status = settings.PASS
-                order.ratify_user = request.user
-                order.ratify_time = timezone.now()
-                BizLog.objects.addnew(
-                    request.user,
-                    BizLog.CHECK,
-                    u"批准采购付款[%s],id=%d" % (order.no, order.id),
-                )
-            else:
-                if not order.ratify_time:
-                    raise CustomError(u'该付款单尚未批准')
-                if order.is_pay:
-                    raise CustomError(u'该付款单已付款,禁止撤销复核')
-                order.status = settings.CHECKING
-                order.ratify_user = None
-                order.ratify_time = None
-                BizLog.objects.addnew(
-                    request.user,
-                    BizLog.CHECK,
-                    u"采购付款单撤销批准[%s],id=%d" % (order.no, order.id),
-                )
-            order.save()
-    except CustomError, e:
-        return JSONError(e.get_error_msg())
-    except Exception, e:
-        traceback.print_exc()
-        return JSONError(u'批准失败')
-    return JSONResponse({})
 
 @csrf_exempt
 @permission_required('purchase.export_purchase_payment')
@@ -1389,10 +1238,12 @@ def purchase_payment_pay(request):
             if payment.apply_amount <= payment.actual_amount:
                 raise CustomError(u'付款单已付款完毕')
 
-            if not payment.ratify_time:
-                raise CustomError(u'付款单未批准,禁止付款')
-            if not payment.review_time:
-                raise CustomError(u'付款单未复核,禁止付款')
+            # if not payment.ratify_time:
+            #     raise CustomError(u'付款单未批准,禁止付款')
+            # if not payment.review_time:
+            #     raise CustomError(u'付款单未复核,禁止付款')
+            if payment.status == settings.DEFAULT:
+                raise CustomError(u'付款单未审核,禁止付款')
             try:
                 data['actual_amount'] = Formater.formatAmount(data['actual_amount'])
             except:
@@ -1446,7 +1297,8 @@ def purchase_payment_pay_detail(request):
 @permission_required('purchase.view_purchase_invoice')
 def purchase_invoice_list(request):
     invoice = request.GET.get('invoice')
-    rows = PurchaseOrderDetail.objects.filter(main__status=PurchaseOrder.TAKE_EFFECT)
+    # rows = PurchaseOrderDetail.objects.filter(main__status=PurchaseOrder.TAKE_EFFECT)
+    rows = PurchaseOrderDetail.objects.filter(main__status=PurchaseOrder.PASS)
     department_ids = request.user.getSubDepartmentIds()
     user_ids = request.user.getSubEmployeeIds()
     rows = rows.filter(Q(main__create_user_id__in=user_ids) | Q(main__department_id__in=department_ids) | Q(main__create_user=request.user))
@@ -1471,7 +1323,8 @@ def purchase_invoice_list(request):
 @permission_required('purchase.export_purchase_invoice')
 def purchase_invoice_export(request):
     invoice = request.GET.get('invoice')
-    rows = PurchaseOrderDetail.objects.filter(main__status=PurchaseOrder.TAKE_EFFECT)
+    # rows = PurchaseOrderDetail.objects.filter(main__status=PurchaseOrder.TAKE_EFFECT)
+    rows = PurchaseOrderDetail.objects.filter(main__status=PurchaseOrder.PASS)
     department_ids = request.user.getSubDepartmentIds()
     user_ids = request.user.getSubEmployeeIds()
     rows = rows.filter(Q(main__create_user_id__in=user_ids) | Q(main__department_id__in=department_ids) | Q(

+ 0 - 33
requeirements.txt

@@ -1,33 +0,0 @@
-certifi==2018.11.29
-chardet==3.0.4
-defusedxml==0.5.0
-diff-match-patch==20181111
-Django==1.11.13
-django-filter==1.1.0
-django-filters==0.2.1
-django-import-export==1.0.1
-django-validator==0.2.7
-djangorestframework==3.9.0
-djangorestframework-stubs==0.3.0
-et-xmlfile==1.0.1
-factory-boy==2.11.1
-Faker==1.0.1
-idna==2.8
-ipaddress==1.0.22
-jdcal==1.4
-MySQL-python==1.2.5
-odfpy==1.4.0
-openpyxl==2.5.12
-Pillow==5.4.1
-PyMySQL==0.9.3
-python-dateutil==2.7.5
-pytz==2018.9
-PyYAML==3.13
-requests==2.21.0
-six==1.12.0
-tablib==0.11.4
-text-unidecode==1.2
-unicodecsv==0.14.1
-urllib3==1.24.1
-xlrd==1.2.0
-xlwt==1.3.0

+ 1 - 1
scj/app_settings.py

@@ -8,7 +8,7 @@ DATABASES = {
         'NAME': 'scj',
         'USER': 'carwin',  # Not used with sqlite3.
         'PASSWORD': 'carwin!@#',  # Not used with sqlite3.
-        'HOST': '39.106.109.89',
+        'HOST': '127.0.0.1',
     },
 }
 # DATABASES = {

+ 1 - 1
scj/local_settings.py

@@ -1,2 +1,2 @@
-LICENSE_KEY = 'dev-wushaodong'
+LICENSE_KEY = 'dev-luyuhang'
 # LICENSE_KEY = 'jsyc'

+ 1 - 0
scj/settings.py

@@ -63,6 +63,7 @@ INSTALLED_APPS = [
     'apps.touch',
     'apps.office',
     'apps.config',
+    'apps.finance',
 ]
 
 MIDDLEWARE_CLASSES = [

+ 1 - 0
scj/urls.py

@@ -37,6 +37,7 @@ urlpatterns = [
     url(r'^touch/', include('apps.touch.urls')),
     url(r'^office/', include('apps.office.urls')),
     url(r'^config/', include('apps.config.urls')),
+    url(r'^finance/', include('apps.finance.urls')),
 ]
 
 urlpatterns += static(settings.TMP_URL, document_root=settings.TMP_ROOT)

+ 96 - 0
uis/views/finance/finance_category_edit.html

@@ -0,0 +1,96 @@
+<!DOCTYPE html>
+<html>
+<head>
+  <meta charset="utf-8">
+  <title>添加财务收支类别</title>
+  <meta name="renderer" content="webkit">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+  <meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=0">
+  <link rel="stylesheet" href="../../layuiadmin/layui/css/layui.css" media="all">
+  <link rel="stylesheet" href="../../layuiadmin/style/admin.css" media="all">
+  <link rel="stylesheet" type="text/css" href="../../layuiadmin/style/formSelects-v4.css"/>
+     <style>
+    </style>
+</head>
+<body>
+
+  <div class="layui-fluid">
+    <div class="layui-row layui-col-space15">
+      <div class="layui-col-md6">
+        <div class="layui-card">
+
+          <div class="layui-card-body">
+            <form class="layui-form" action="" lay-filter="component-form-element">
+              <div class="layui-row layui-col-space10 layui-form-item">
+
+                <div class="layui-col-lg6">
+                  <label class="layui-form-label"><font color='red' size="4">*</font>名称:</label>
+                  <div class="layui-input-block">
+                    <input type="text" name="name" lay-verify="required" placeholder="请输入名称" autocomplete="off" class="layui-input">
+                  </div>
+                </div>
+                <div class="layui-col-lg6">
+                  <label class="layui-form-label">是否在用:</label>
+                  <div class="layui-input-block">
+                    <input type="checkbox" name="enabled" lay-skin="switch" lay-text="是|否" checked="" value="1">
+                  </div>
+                </div>
+                <button id="id_save" class="layui-btn" lay-submit lay-filter="component-form-element" style="display: none">保存</button>
+              </div>
+            </form>
+          </div>
+        </div>
+      </div>
+    </div>
+  </div>
+
+
+  <script src="../../layuiadmin/layui/layui.js"></script>
+  <script>
+  layui.config({
+    base: '../../../layuiadmin/' //静态资源所在路径
+  }).extend({
+    index: 'lib/index',
+    formSelects: 'formSelects-v4'
+  }).use(['index', 'form', 'utils'], function(){
+    var $ = layui.$
+    ,admin = layui.admin
+    ,upload = layui.upload
+    ,form = layui.form;
+    var id = layui.view.getParameterByName('id');
+
+    if(id){
+        var editdata = JSON.parse(JSON.stringify(parent.layui.table.editdata)); // 框架有Bug所以这么转换
+        form.val("component-form-element", editdata);
+    }
+    form.on('submit(component-form-element)', function(data){
+
+      //layer.msg(JSON.stringify(data.field));
+        if (id){
+            var url =  '/finance/finance_category/save/?id=' + id;
+        }else{
+            url =  '/finance/finance_category/save/';
+        }
+        if(!('enabled' in data.field)){
+            data.field.enabled = false;
+        }
+
+         admin.req({
+            url: url
+            ,data: JSON.stringify(data.field)
+            ,type: 'post'
+            ,done: function(res){
+                parent.layui.onSubmitChild(res.data);
+            }
+      });
+
+      return false;
+    });
+
+    parent.layui.submitChild = function () {
+      $("#id_save").click();
+    };
+  });
+  </script>
+</body>
+</html>

+ 128 - 0
uis/views/finance/finance_purpose_edit.html

@@ -0,0 +1,128 @@
+<!DOCTYPE html>
+<html>
+<head>
+  <meta charset="utf-8">
+  <title>添加财务收支用途</title>
+  <meta name="renderer" content="webkit">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+  <meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=0">
+  <link rel="stylesheet" href="../../layuiadmin/layui/css/layui.css" media="all">
+  <link rel="stylesheet" href="../../layuiadmin/style/admin.css" media="all">
+  <link rel="stylesheet" type="text/css" href="../../layuiadmin/style/formSelects-v4.css"/>
+     <style>
+    </style>
+</head>
+<body>
+
+  <div class="layui-fluid">
+    <div class="layui-row layui-col-space15">
+        <div class="layui-card">
+
+          <div class="layui-card-body" pad15>
+            <form class="layui-form" action="" lay-filter="component-form-element">
+              <div class="layui-row layui-col-space10 layui-form-item">
+                <div>
+                  <label class="layui-form-label"><font color='red' size="4">*</font>收支类型:</label>
+                  <div class="layui-input-block">
+                    <select id="id_type" name="type" lay-verify="required">
+                        <option value="1">收入</option>
+                        <option value="2">支出</option>
+                    </select>
+                  </div>
+              </div>
+                  <div>
+                  <label class="layui-form-label"><font color='red' size="4">*</font>类别:</label>
+                  <div class="layui-input-block">
+                    <select id="id_category" name="category" lay-verify="required">
+                    </select>
+                  </div>
+              </div>
+                <div>
+                  <label class="layui-form-label"><font color='red' size="4">*</font>名称:</label>
+                  <div class="layui-input-block">
+                    <input type="text" name="name" lay-verify="required" placeholder="请输入名称" autocomplete="off" class="layui-input">
+                  </div>
+                </div>
+                <div>
+                  <label class="layui-form-label">在用:</label>
+                  <div class="layui-input-block">
+                    <input type="checkbox" name="enabled" lay-skin="switch" lay-text="是|否" checked="" value="1">
+                  </div>
+                </div>
+                <button id="id_save" class="layui-btn" lay-submit lay-filter="component-form-element" style="display: none">保存</button>
+              </div>
+            </form>
+          </div>
+        </div>
+      </div>
+    </div>
+
+
+  <script src="../../layuiadmin/layui/layui.js"></script>
+  <script>
+  layui.config({
+    base: '../../../layuiadmin/' //静态资源所在路径
+  }).extend({
+    index: 'lib/index',
+    formSelects: 'formSelects-v4'
+  }).use(['index', 'form', 'utils', 'upload'], function(){
+    var $ = layui.$
+    ,admin = layui.admin
+    ,upload = layui.upload
+    ,form = layui.form;
+    var id = layui.view.getParameterByName('id');
+
+     admin.req({
+        url: '/finance/finance_category/dict/',
+        done: function (res) {
+            var category = res.data.category;
+            var category_node = $('#id_category');
+            for (var i in category) {
+                var pid = category[i].id;
+                var value = category[i].name;
+                category_node.append("<option value='" + pid + "'>" + value + "</option>");
+            }
+            form.render();
+            loadData();
+        }
+    });
+     var loadData = function(){
+        if(id){
+            var editdata = JSON.parse(JSON.stringify(parent.layui.table.editdata)); // 框架有Bug所以这么转换
+            form.val("component-form-element", editdata);
+        }
+    };
+     form.render(null, 'component-form-element');
+
+    if (id){
+          var url = '/finance/finance_purpose/save/?id='+id;
+      }else{
+          url =  '/finance/finance_purpose/save/';
+      }
+
+    form.on('submit(component-form-element)', function(data){
+      //layer.msg(JSON.stringify(data.field));
+
+        if(!('enabled' in data.field)){
+            data.field.enabled = false;
+        }
+
+        admin.req({
+            url: url
+            ,data: JSON.stringify(data.field)
+            ,type: 'post'
+            ,done: function(res){
+                parent.layui.onSubmitChild(res.data);
+            }
+          });
+
+      return false;
+    });
+
+    parent.layui.submitChild = function () {
+      $("#id_save").click();
+    };
+  });
+  </script>
+</body>
+</html>

+ 259 - 0
uis/views/finance/index.html

@@ -0,0 +1,259 @@
+<!DOCTYPE html>
+<html>
+<head>
+  <meta charset="utf-8">
+  <title>收支类别设置</title>
+  <meta name="renderer" content="webkit">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+  <meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=0">
+  <link rel="stylesheet" href="../../layuiadmin/layui/css/layui.css" media="all">
+  <link rel="stylesheet" href="../../layuiadmin/style/admin.css" media="all">
+    <style type="text/css">
+        .seach_items {float:right;margin-left: 10px;}
+    </style>
+
+</head>
+<body>
+
+  <div class="layui-fluid">
+    <div class="layui-card">
+        <div class="layui-card-body" pad15>
+        <div class="layui-row layui-col-space15">
+          <div class="layui-col-md5">
+            <div class="LAY-btns" style="margin-bottom: 10px;">
+                <div class="layui-col-xs2">
+                    <button class="layui-btn" id="finance_category_add" data-permission="finance.add_finance_category"><i class="layui-icon layui-icon-add-circle"></i>添加</button>
+                </div>
+                    <form class="layui-form" lay-filter="query-form-element1">
+                        <div class="seach_items">
+                            <button class="layui-btn" lay-submit lay-filter="query-form-element1"><i class="layui-icon layui-icon-search"></i>查询</button>
+                        </div>
+                        <div class="seach_items">
+                            <input type="text"  name="name" autocomplete="off" class="layui-input" placeholder="名称"/>
+                        </div>
+                    </form>
+                <div style="clear: both;"></div>
+            </div>
+            <table class="layui-hide" id="finance_category_datagrid" lay-filter="finance_category-operate"></table>
+
+            <script type="text/html" id="finance_category-operate-bar">
+                <div class="layui-btn-group">
+              <a class="layui-btn layui-btn-xs" lay-event="finance_category_edit" data-permission="finance.add_finance_category">修改</a>
+              <a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="finance_category_del" data-permission="finance.delete_finance_category">删除</a>
+                </div>
+            </script>
+          </div>
+
+          <div class="layui-col-md7">
+            <div class="LAY-btns" style="margin-bottom: 10px;">
+              <div class="layui-col-xs2">
+                    <button class="layui-btn" id="finance_purpose_add" data-permission="finance.add_finance_category"><i class="layui-icon layui-icon-add-circle"></i>添加</button>
+                </div>
+
+                    <form class="layui-form" lay-filter="query-form-element2">
+                        <div class="seach_items">
+                            <button class="layui-btn" lay-submit lay-filter="query-form-element2"><i class="layui-icon layui-icon-search"></i>查询</button>
+                        </div>
+                        <div class="seach_items">
+                            <input type="text"  name="name" autocomplete="off" class="layui-input" placeholder="名称"/>
+                        </div>
+                        <div class="seach_items">
+                            <input type="text"  name="category_name" autocomplete="off" class="layui-input" placeholder="类别名称"/>
+                        </div>
+                    </form>
+                <div style="clear: both;"></div>
+                </div>
+
+            <table class="layui-hide" id="finance_purpose_datagrid" lay-filter="series-operate"></table>
+
+            <script type="text/html" id="series-operate-bar">
+                <div class="layui-btn-group">
+              <a class="layui-btn layui-btn-xs" lay-event="finance_purpose_edit" data-permission="finance.add_finance_category">修改</a>
+              <a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="finance_purpose_del" data-permission="finance.delete_finance_category">删除</a>
+                </div>
+            </script>
+          </div>
+        </div>
+        </div>
+    </div>
+  </div>
+  <script src="../../layuiadmin/layui/layui.js?t=1"></script>
+  <script>
+  layui.config({
+    base: '../../../layuiadmin/' //静态资源所在路径
+  }).extend({
+    index: 'lib/index' //主入口模块
+  }).use(['index', 'table', 'form'], function(){
+    var $ = layui.$;
+    var table = layui.table
+        ,form = layui.form
+        ,admin = layui.admin;
+      //品牌
+    table.render({
+      elem: '#finance_category_datagrid'
+      ,url: '/finance/finance_category/data/'
+      ,cols: [[
+        {field:'name', title:'名称', width:200}
+        ,{field:'enabled_text', title:'在用', minWidth: 80}
+        ,{width:110, align:'center', fixed: 'right', toolbar: '#finance_category-operate-bar'}
+      ]]
+      ,page: true
+      ,height: 'full-108'
+      , done: function () {
+        layui.index.removeNoPermButtons()
+      }
+    });
+    //车系
+    table.render({
+      elem: '#finance_purpose_datagrid'
+      ,url: '/finance/finance_purpose/data/'
+      ,cols: [[
+        {field:'category_text', title:'类别', width:200}
+        ,{field:'name', title:'名称', width:200}
+        ,{field:'type_text', title:'类型', width:80}
+        ,{field:'enabled_text', title:'在用', width: 100}
+        ,{width:110, align:'center', fixed: 'right', toolbar: '#series-operate-bar'}
+      ]]
+      ,page: true
+      ,height: 'full-108'
+      , done: function () {
+        layui.index.removeNoPermButtons()
+      }
+    });
+
+    //监听品牌工具条
+    table.on('tool(finance_category-operate)', function(obj) {
+        var data = obj.data;
+        if (obj.event === 'finance_category_del') {
+            layer.confirm('确定要删除吗?', function (index) {
+                layer.close(index);
+                layui.admin.req({
+                    url: '/finance/finance_category/delete/?id=' + data.id
+                    ,type: 'get'
+                    , done: function (res) {
+                        table.reload('finance_category_datagrid', {});
+                    }
+                });
+            });
+        } else if (obj.event === 'finance_category_edit') {
+            table.editdata = data;
+            layer.open({
+                type: 2,
+                title: '修改',
+                shadeClose: false,
+                area: ['450px', '350px'],
+                btn:['保存','取消'],
+                yes: function (index, dom) {
+                    layui.onSubmitChild = function (data) {
+                        layer.close(index);
+                        table.reload('finance_category_datagrid', {});
+                        table.reload('finance_purpose_datagrid', {});
+                      };
+                      layui.submitChild();
+                  },
+                  btn2: function(index, layero){
+                    layer.close(index);//关闭当前按钮
+                  },
+                content: 'finance_category_edit.html?id=' + data.id
+            });
+        }
+    });
+    //监听车系工具条
+    table.on('tool(series-operate)', function(obj){
+      var data = obj.data;
+        if(obj.event === 'finance_purpose_del'){
+        layer.confirm('确定要删除吗?', function(index){
+          layui.admin.req({
+            url: '/finance/finance_purpose/delete/?id='+data.id
+            ,type: 'get'
+            ,done: function(res){
+              table.reload('finance_purpose_datagrid',{});
+              layer.close(index);
+            }
+          });
+        });
+      } else if(obj.event === 'finance_purpose_edit'){
+        table.editdata = data;
+        layer.open({
+          type: 2,
+          title: '修改',
+         area: ['500px', '500px'],
+          btn:['保存','取消'],
+          yes: function (index, dom) {
+            layui.onSubmitChild = function (data) {
+                layer.close(index);
+                table.reload('finance_category_datagrid', {});
+                table.reload('finance_purpose_datagrid', {});
+              };
+              layui.submitChild();
+          },
+          btn2: function(index, layero){
+            layer.close(index);//关闭当前按钮
+          },
+          content: 'finance_purpose_edit.html?id='+data.id
+        });
+      }
+    });
+    form.on('submit(query-form-element1)', function(data){
+      table.reload('finance_category_datagrid', {
+          where: data.field
+          ,page:{curr:1}
+      });
+      layer.closeAll();
+      return false
+    });
+    form.on('submit(query-form-element2)', function(data){
+      table.reload('finance_purpose_datagrid', {
+          where: data.field
+          ,page:{curr:1}
+      });
+      layer.closeAll();
+      return false
+    });
+    $('#finance_category_add').on('click', function(){
+        layer.open({
+          type: 2,
+          title: '添加',
+          area: ['450px', '280px'],
+          btn:['保存','取消'],
+          yes: function (index, dom) {
+            layui.onSubmitChild = function (data) {
+                layer.close(index);
+                table.reload('finance_category_datagrid', {});
+                table.reload('finance_purpose_datagrid', {});
+              };
+              layui.submitChild();
+          },
+          btn2: function(index, layero){
+            layer.close(index);//关闭当前按钮
+          },
+          content: 'finance_category_edit.html'
+        });
+    });
+    $('#finance_purpose_add').on('click', function(){
+        layer.open({
+          type: 2,
+          title: '添加',
+          area: ['500px', '500px'],
+          btn:['保存','取消'],
+          yes: function (index, dom) {
+            layui.onSubmitChild = function (data) {
+                layer.close(index);
+                table.reload('finance_category_datagrid', {});
+                table.reload('finance_purpose_datagrid', {});
+              };
+              layui.submitChild();
+          },
+          btn2: function(index, layero){
+            layer.close(index);//关闭当前按钮
+          },
+          content: 'finance_purpose_edit.html'
+        });
+    });
+});
+
+
+
+  </script>
+</body>
+</html>

+ 3 - 0
uis/views/index.html

@@ -281,6 +281,9 @@
                 </dd>
                 <dd data-name="nav" data-permission="foundation.view_option">
                   <a lay-href="foundation/option.html">自定义项管理</a>
+                </dd>
+                  <dd data-name="nav" data-permission="finance.view_finance_category">
+                  <a lay-href="finance/index.html">收支类别设置</a>
                 </dd>
                 <dd data-name="nav" data-permission="supplier.view_supplier">
                   <a lay-href="supplier/supplier.html">供应商管理</a>

+ 166 - 2
uis/views/order/sale_order.html

@@ -27,6 +27,11 @@
             <div class="LAY-btns" style="margin-bottom: 10px;">
               <button class="layui-btn layui-btn-sm" id="btn_add" data-permission="order.add_sale_order"><i class="layui-icon layui-icon-add-circle" ></i>添加</button>
               <button class="layui-btn layui-btn-sm" id="btn_deliver" data-permission="order.add_goods_deliver"><i class="layui-icon layui-icon-add-circle" ></i>转出库</button>
+              <button class="layui-btn layui-btn-sm" id="btn_loss" data-permission="order.loss_sale_order"><i class="layui-icon layui-icon-layer" ></i>扣减</button>
+              <button class="layui-btn layui-btn-sm" id="btn_receive"><i class="layui-icon layui-icon-ok-circle" ></i>完善发货</button>
+              <button class="layui-btn layui-btn-sm" id="btn_ship" data-permission="order.pay_sale_order"><i class="layui-icon layui-icon-dollar" ></i>装运</button>
+              <button class="layui-btn layui-btn-sm" id="btn_pay" data-permission="order.pay_sale_order"><i class="layui-icon layui-icon-dollar" ></i>结算</button>
+              <button class="layui-btn layui-btn-sm" id="btn_clear" data-permission="order.pay_sale_order"><i class="layui-icon layui-icon-dollar" ></i>结清</button>
 
                 <button class="layui-nav" data-permission="order.export_sale_order">
                 <div class="layui-nav-item">
@@ -108,6 +113,16 @@
                         <input type="text" autocomplete="off" name="customer_tel" class="layui-input">
                     </div>
                 </div>
+                 <div class="layui-col-xs12 layui-col-sm12">
+                    <label class="layui-form-label">结清:</label>
+                    <div class="layui-input-block">
+                        <select name="cleared">
+                            <option value="" selected>全部</option>
+                            <option value="0">未结清</option>
+                            <option value="1">已结清</option>
+                        </select>
+                    </div>
+                </div>
             </div>
             <div class="layui-form-item" style="display: none">
                 <button id="query_search" class="layui-btn" lay-submit lay-filter="query-form-element">查询</button>
@@ -135,13 +150,22 @@
       elem: '#datagrid'
       ,url: '/order/sale_order/data/'
       ,cols: [[
-          {type:'checkbox',width:50}
+          {type:'radio',width:50}
         ,{field:'no', title:'单号', width:150}
         ,{field:'customer_name', title:'客户', width:120}
         ,{field:'customer_tel', title:'客户电话', width: 150}
         ,{field:'products', title:'产品', width:120}
         ,{field:'count', title:'合计数量', width:100, align:'right'}
         ,{field:'amount', title:'合计金额', width:100, align:'right'}
+        ,{field:'receive_count', title:'收货数量', width:100, align:'right'}
+        ,{field:'receive_amount', title:'收货金额', width:100, align:'right'}
+        ,{field:'loss_amount', title:'扣减金额', width:100, align:'right'}
+        ,{field:'total_amount', title:'应付金额', width:100, align:'right'}
+        ,{field:'pay_amount', title:'结算金额', width:100, align:'right'}
+        ,{field:'put_amount', title:'装车费用', width:100, align:'right'}
+        ,{field:'fare_amount', title:'运输费用', width:100, align:'right'}
+        ,{field:'clear_text', title:'结清', width:60}
+        ,{field:'loss_notes', title:'扣减备注', width:100, align:'right'}
         ,{field:'create_time', title:'创建时间', width:150}
         ,{field:'create_user_text', title:'创建人', width:150}
         ,{field:'check_status_text', title:'审核状态', width:120}
@@ -163,7 +187,27 @@
             if (cols[i].field == 'amount') {
                 cols[i].totalRowText = res.more.sum_amount;
             }
-
+            if (cols[i].field == 'receive_count') {
+                cols[i].totalRowText = res.more.sum_receive_count;
+            }
+            if (cols[i].field == 'receive_amount') {
+                cols[i].totalRowText = res.more.sum_receive_amount;
+            }
+            if (cols[i].field == 'loss_amount') {
+                cols[i].totalRowText = res.more.sum_loss_amount;
+            }
+            if (cols[i].field == 'total_amount') {
+                cols[i].totalRowText = res.more.sum_total_amount;
+            }
+            if (cols[i].field == 'pay_amount') {
+                cols[i].totalRowText = res.more.sum_pay_amount;
+            }
+            if (cols[i].field == 'put_amount') {
+                cols[i].totalRowText = res.more.sum_put_amount;
+            }
+            if (cols[i].field == 'fare_amount') {
+                cols[i].totalRowText = res.more.sum_fare_amount;
+            }
         }
         return {
           "code": res.code, //解析接口状态
@@ -357,6 +401,126 @@
         });
     });
 
+    $('#btn_loss').on('click', function(){
+        var data = utils.getSelectedRow('datagrid');
+         if(data == false){
+             return;
+         }
+
+         if (data.status == 0) {
+             layer.msg('该订单未审核,不允许扣减');
+             return;
+         }
+
+         table.editdata = data;
+
+         layer.open({
+          type: 2,
+          title: '扣减[' + data.no + ']',
+          shadeClose: false,
+          area: ['90%', '90%'],
+          btn: ['保存', '取消'],
+          yes: function(index, dom){
+              layui.onSubmitChild = function (data) {
+                  layer.close(index);
+                  table.reload('datagrid',{});
+              };
+              layui.submitChild();
+          },
+          btn2: function(index, layero){
+            layer.close(index);//关闭当前按钮
+          },
+          content: 'sale_order_loss.html?order_id='+data.id
+        });
+    });
+
+    $('#btn_pay').on('click', function(){
+        var data = utils.getSelectedRow('datagrid');
+         if(data == false){
+             return;
+         }
+
+         if (data.status == 0) {
+             layer.msg('该订单未审核,不允许收银');
+             return;
+         }
+
+         table.editdata = data;
+
+         layer.open({
+          type: 2,
+          title: '付款['+ data.no +']',
+          shadeClose: false,
+          area: ['40%', '80%'],
+          btn: ['保存', '取消'],
+          yes: function(index, dom){
+              layui.onSubmitChild = function (data) {
+                  layer.close(index);
+                  table.reload('datagrid',{});
+              };
+              layui.submitChild();
+          },
+          btn2: function(index, layero){
+            layer.close(index);//关闭当前按钮
+          },
+          content: 'sale_order_pay.html?order_id='+data.id
+        });
+    });
+
+    $('#btn_ship').on('click', function(){
+        var data = utils.getSelectedRow('datagrid');
+         if(data == false){
+             return;
+         }
+
+         table.editdata = data;
+
+         layer.open({
+          type: 2,
+          title: '添加装运费[' + data.no + ']',
+          shadeClose: false,
+          area: ['80%', '70%'],
+          btn: ['保存', '取消'],
+          yes: function(index, dom){
+              layui.onSubmitChild = function (data) {
+                  layer.close(index);
+                  table.reload('datagrid',{});
+              };
+              layui.submitChild();
+          },
+          btn2: function(index, layero){
+            layer.close(index);//关闭当前按钮
+          },
+          content: 'sale_order_fare.html?order_id='+data.id
+        });
+    });
+
+    $('#btn_clear').on('click', function(){
+        var data = utils.getSelectedRow('datagrid');
+         if(data == false){
+             return;
+         }
+
+         if (data.status === 0){
+            layer.msg('该订单未审核');
+            return;
+          }
+          if (data.cleared){
+            layer.msg('该订单已结清');
+            return;
+          }
+          layer.confirm('确定要结清吗?', function(index){
+              layer.close(index);
+              layui.admin.req({
+                url: '/order/sale_order/clear/?id='+data.id
+                ,done: function(res){
+                  table.reload('datagrid',{});
+                }
+              });
+        });
+
+    });
+
    $('#btn_query').on('click', function(){
         layer.open({
           type: 1,

+ 2 - 0
uis/views/order/sale_order_detail.html

@@ -42,6 +42,7 @@
                         <td>产品代码</td>
                         <td>质量要求</td>
                         <td align="right">数量</td>
+                        <td align="right">收货数量</td>
                         <td align="right">单价</td>
                         <td align="right">金额</td>
                     </tr>
@@ -82,6 +83,7 @@
                     "                        <td>"+items[n].model+"</td>\n" +
                     "                        <td>"+items[n].quality_request_text+"</td>\n" +
                     "                        <td align=\"right\">"+items[n].count+"</td>\n" +
+                    "                        <td align=\"right\">"+items[n].receive_count+"</td>\n" +
                     "                        <td align=\"right\">"+items[n].price+"</td>\n" +
                     "                        <td align=\"right\">"+items[n].amount+"</td>\n" +
                     "                    </tr>");

+ 135 - 0
uis/views/order/sale_order_fare.html

@@ -0,0 +1,135 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <meta charset="utf-8">
+    <title></title>
+    <meta name="renderer" content="webkit">
+    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+    <meta name="viewport"
+          content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=0">
+    <link rel="stylesheet" href="../../layuiadmin/layui/css/layui.css" media="all">
+    <link rel="stylesheet" href="../../layuiadmin/style/admin.css" media="all">
+    <link rel="stylesheet" href="../../jquery-easyui-1.5.2/themes/icon.css" type="text/css">
+    <style type="text/css">
+        .table-overlay .layui-table-view,
+        .table-overlay .layui-table-header,
+        .table-overlay .layui-table-box,
+        .table-overlay .layui-table-body {
+            overflow: visible;
+        }
+
+        .table-overlay .layui-table-cell {
+            height: auto;
+            overflow: visible;
+        }
+    </style>
+</head>
+<body>
+
+<div class="layui-fluid">
+    <div class="layui-card">
+        <div class="layui-card-body" pad15>
+            <form class="layui-form" action="" lay-filter="component-form-element">
+
+                <div class="layui-row layui-col-space10">
+                    <div class="layui-col-xs6 layui-col-sm4">
+                        <label class="layui-form-label">运输费用:</label>
+                        <div class="layui-input-block">
+                            <input type="text" name="fare_amount" lay-verify="number" value="0"
+                                   class="layui-input">
+                        </div>
+                    </div>
+                    <div class="layui-col-xs6 layui-col-sm4">
+                        <label class="layui-form-label">付款账户:</label>
+                        <div class="layui-input-block">
+                            <select id="id_fare_account" name="fare_account" lay-search>
+                                <option value=""></option>
+                            </select>
+                        </div>
+                    </div>
+                </div>
+
+                <div class="layui-row layui-col-space10">
+                    <div class="layui-col-xs6 layui-col-sm4">
+                        <label class="layui-form-label">装卸费用:</label>
+                        <div class="layui-input-block">
+                            <input type="text" name="put_amount" lay-verify="number" value="0" class="layui-input">
+                        </div>
+                    </div>
+                    <div class="layui-col-xs6 layui-col-sm4">
+                        <label class="layui-form-label">付款账户:</label>
+                        <div class="layui-input-block">
+                            <select id="id_put_account" name="put_account" lay-search>
+                                <option value=""></option>
+                            </select>
+                        </div>
+                    </div>
+                </div>
+
+                <button class="layui-btn" id="material-pay-submit" lay-submit
+                        lay-filter="component-form-element" style="display: none">确定
+                </button>
+            </form>
+        </div>
+    </div>
+</div>
+
+<script src="../../jquery-easyui-1.5.2/jquery.min.js"></script>
+<script src="../../layuiadmin/layui/layui.js"></script>
+<script>
+    layui.config({
+        base: '../../../layuiadmin/' //静态资源所在路径
+    }).extend({
+        index: 'lib/index' //主入口模块
+    }).use(['index', 'form', 'utils',], function () {
+        var $ = layui.$;
+        var admin = layui.admin;
+        var form = layui.form;
+        var id = layui.view.getParameterByName('order_id');
+
+        admin.req({
+            url: '/foundation/search_options/?type=5',
+            done: function (res) {
+                var data = res.data;
+                var transport_account = $('#id_fare_account');
+                var handing_account = $('#id_put_account');
+                for (var i in data) {
+                    var pid = data[i].id;
+                    var value = data[i].name;
+                    transport_account.append("<option value='" + pid + "'>" + value + "</option>");
+                    handing_account.append("<option value='" + pid + "'>" + value + "</option>");
+                }
+                form.render();
+            }
+        });
+
+        form.on('submit(component-form-element)', function (data) {
+
+            if (parseFloat(data.field.put_amount) > 0 && !data.field.put_account) {
+                layer.msg('请选择装卸费用付款账户!', {icon: 5});
+                return false;
+            }
+
+            if (parseFloat(data.field.fare_amount) > 0 && !data.field.fare_account) {
+                layer.msg('请选择运输费用付款账户!', {icon: 5});
+                return false;
+            }
+            admin.req({
+                url: '/order/sale_order/fare_save/?id=' + id
+                , data: JSON.stringify(data.field)
+                , type: 'post'
+                , done: function (res) {
+                    parent.layui.onSubmitChild();
+                }
+            });
+            return false;
+        });
+
+        parent.layui.submitChild = function () {
+            $("#material-pay-submit").click();
+        };
+
+    })
+</script>
+</body>
+</html>

+ 208 - 0
uis/views/order/sale_order_loss.html

@@ -0,0 +1,208 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <meta charset="utf-8">
+    <title>配件出库</title>
+    <meta name="renderer" content="webkit">
+    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+    <meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=0">
+    <link rel="stylesheet" href="../../layuiadmin/layui/css/layui.css" media="all">
+    <link rel="stylesheet" href="../../layuiadmin/style/admin.css" media="all">
+     <style type="text/css">
+        .table-overlay .layui-table-view,
+        .table-overlay .layui-table-header,
+        .table-overlay .layui-table-box,
+        .table-overlay .layui-table-body{overflow: visible;}
+        .table-overlay .layui-table-cell{height: auto; overflow: visible;}
+    </style>
+</head>
+<body>
+
+<div class="layui-fluid">
+    <div class="layui-card">
+        <div class="layui-card-body" pad15>
+            <div class="layui-row layui-col-space15">
+                <div class="layui-col-md12">
+
+                    <form class="layui-form" action="" lay-filter="component-form-element">
+                        <div class="layui-row layui-col-space10 layui-form-item">
+
+                            <div class="layui-col-md12">
+                                <label class="layui-form-label"><font color='red' size="4">*</font>扣减金额:</label>
+                                <div class="layui-input-block">
+                                    <div class="layui-col-sm8">
+                                        <input id="id_loss_amount" type="text" autocomplete="off" name="notes"  class="layui-input">
+                                    </div>
+                                </div>
+                            </div>
+
+                            <div class="layui-col-md12">
+                                <label class="layui-form-label">扣减备注:</label>
+                                <div class="layui-input-block">
+                                    <div class="layui-col-sm8">
+                                        <input id="id_loss_notes" type="text" autocomplete="off" name="notes"  class="layui-input">
+                                    </div>
+                                </div>
+                            </div>
+                        </div>
+
+                        <fieldset class="layui-elem-field layui-field-title">
+                            <legend>产品明细&nbsp;&nbsp;</legend>
+                        </fieldset>
+
+                        <div class="table-overlay">
+                            <table id="part_dataTable" lay-filter="part_dataTable" class="layui-hide"></table>
+                        </div>
+
+                        <button id="submit_btn" lay-submit lay-filter="component-form-element" style="display: none">保存</button>
+
+                    </form>
+
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+
+  <script src="../../layuiadmin/layui/layui.js"></script>
+  <script>
+
+
+  layui.config({
+    base: '../../../layuiadmin/' //静态资源所在路径
+  }).extend({
+    index: 'lib/index'
+  }).use(['index', 'form', 'table', 'utils'], function(){
+    var $ = layui.$
+    ,admin = layui.admin
+    ,element = layui.element
+    ,form = layui.form
+    ,table = layui.table
+    ,utils = layui.utils;
+
+    var id = layui.view.getParameterByName('order_id');
+
+    admin.req({
+        url: '/foundation/search_options/?type=4',
+        done: function(res){
+            _options = res.data;
+        }
+    });
+
+    function fillData(data){
+        $('#id_loss_amount').val(data.amount);
+        $('#id_loss_notes').val(data.notes);
+    }
+
+    var part_layTableId = "part_layTable";
+	var part_tableIns = table.render({
+        elem: '#part_dataTable',
+        id: part_layTableId,
+        data: [],
+        page: false,
+        limit: 1000,
+        loading: true,
+        even: true, //不开启隔行背景
+        cols: [[
+            {title: '序号', type: 'numbers'},
+            {field: 'name', title: '产品名称', width: 150},
+            {field: 'model', title: '产品代码', width: 150},
+            {field: 'unit', title: '单位', width: 80},
+            {field: 'count', title: '数量', width: 80},
+            {field: 'price', title: '单价', width: 80},
+            {field: 'receive_count', title: '收货数量', width: 100,  templet: function (d){
+            return '<input id="receive_count'+d.id+'" type="text" value="'+d.receive_count+'" lay-verify="required|numberGtZ" autocomplete="off" class="layui-input">';
+            }},
+            {field: 'quality_request_text', title: '质量要求', width: 80},
+        ]],
+    });
+
+    table.on('tool(part_dataTable)', function (obj) {
+        var data = obj.data, event = obj.event, tr = obj.tr; //获得当前行 tr 的DOM对象;
+        switch(event){
+            case "del":
+                obj.del();
+                layer.msg('删除成功', {icon: 6});
+                break;
+        }
+    });
+
+    var getItemsData = function () {
+        var rows = table.cache[part_layTableId];
+        var items = [];
+        for(var k in rows){
+            if (rows[k] == false) {
+                continue;
+            }
+
+            var receive_count = $('#receive_count'+rows[k].id).val();
+            var item = {
+                detail_id:rows[k].id,
+                receive_count:receive_count
+            };
+            items.push(item);
+        }
+        return items
+    };
+    form.on('submit(component-form-element)', function(data){
+        var items = getItemsData();
+
+
+        var order_data = {'amount': $('#id_loss_amount').val(), 'notes': $('#id_loss_notes').val()};
+
+        data.field.order_data = order_data;
+        data.field.items = items;
+        admin.req({
+            url: '/order/sale_order/loss_save/?id='+id
+            ,data: JSON.stringify(data.field)
+            ,type: 'post'
+            ,done: function(res){
+                customer_id = null;
+                parent.layui.onSubmitChild();
+            }
+        });
+        return false;
+    });
+
+    if (id) {
+        admin.req({
+          url: '/order/sale_order/detail/?id='+id,
+          done: function(res){
+            var data = res.data.items_data;
+            var oldData = [];
+            for (var i in data) {
+                var item = data[i];
+                var newRow = {
+                    id: item.id,
+                    name: item.name,
+                    model:item.model,
+                    unit:item.unit,
+                    price: item.price,
+                    count: item.count,
+                    receive_count: item.receive_count,
+                    quality_request_text: item.quality_request_text,
+                    part_data:item
+                };
+                oldData.push(newRow);
+            }
+            part_tableIns.reload({
+                data: oldData
+            });
+
+             var orderData = JSON.parse(JSON.stringify(parent.layui.table.editdata));
+             fillData({
+                 amount:orderData.loss_amount,
+                 notes:orderData.loss_notes
+             });
+          }
+        });
+    }
+
+    parent.layui.submitChild = function () {
+      $("#submit_btn").click();
+    };
+
+  });
+  </script>
+</body>
+</html>

+ 157 - 0
uis/views/order/sale_order_pay.html

@@ -0,0 +1,157 @@
+<!DOCTYPE html>
+<html>
+<head>
+  <meta charset="utf-8">
+  <title>配件出库</title>
+  <meta name="renderer" content="webkit">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+  <meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=0">
+  <link rel="stylesheet" href="../../layuiadmin/layui/css/layui.css" media="all">
+  <link rel="stylesheet" href="../../layuiadmin/style/admin.css" media="all">
+      <style type="text/css">
+        .table-overlay .layui-table-view,
+        .table-overlay .layui-table-header,
+        .table-overlay .layui-table-box,
+        .table-overlay .layui-table-body{overflow: visible;}
+        .table-overlay .layui-table-cell{height: auto; overflow: visible;}
+        .layui-form-select dl{max-height: 150px;}
+    </style>
+</head>
+<body>
+
+<div class="layui-fluid">
+    <div class="layui-card">
+        <div class="layui-card-body" pad15>
+            <div class="layui-row layui-col-space15">
+                <div class="layui-col-md12">
+
+                    <form class="layui-form" action="" lay-filter="component-form-element">
+                        <div class="layui-row layui-col-space10">
+                            <div class="layui-col-xs12 layui-col-sm4 layui-col-md4">
+                                <label class="layui-form-label">应付金额:</label>
+                                <div class="layui-input-block" style="line-height: 36px;">
+                                    <span id="id_amount"></span>
+                                </div>
+                            </div>
+                            <div class="layui-col-xs12 layui-col-sm4 layui-col-md4">
+                                <label class="layui-form-label">已付金额:</label>
+                                <div class="layui-input-block" style="line-height: 36px;">
+                                    <span id="id_pay_amount"></span>
+                                </div>
+                            </div>
+                        </div>
+
+                        <div class="layui-row layui-col-space10">
+                            <div class="layui-col-xs12 layui-col-sm4 layui-col-md4">
+                                <label class="layui-form-label"><font color='red' size="4">*</font>结算账户:</label>
+                                <div class="layui-input-block">
+                                    <select id="id_payment_account" name="account" lay-verify="required">
+                                        <option value="">请选择结算账户</option>
+                                    </select>
+                                </div>
+                            </div>
+                        </div>
+
+                        <div class="layui-row layui-col-space10">
+                            <div class="layui-col-xs12 layui-col-sm4 layui-col-md4">
+                                <label class="layui-form-label"><font color='red' size="4">*</font>付款金额:</label>
+                                <div class="layui-input-block">
+                                    <input id="id_actual_amount" type="text" name="actual_amount"  autocomplete="off" lay-verify="required|numberGtZ" class="layui-input">
+                                </div>
+                            </div>
+                        </div>
+
+                        <div class="layui-row layui-col-space10">
+                            <div class="layui-col-xs12 layui-col-sm4 layui-col-md4">
+                                <label class="layui-form-label">备注:</label>
+                                <div class="layui-input-block">
+                                    <input id="id_notes" type="text" name="notes"  autocomplete="off" class="layui-input">
+                                </div>
+                            </div>
+                        </div>
+                        <button class="layui-btn" id="purchase-order-submit" lay-submit lay-filter="component-form-element" style="display: none">保存</button>
+                    </form>
+
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+
+  <script src="../../layuiadmin/layui/layui.js"></script>
+  <script>
+
+  layui.link('../../../layuiadmin/style/autocomplete.css');
+  layui.config({
+    base: '../../../layuiadmin/' //静态资源所在路径
+  }).extend({
+    index: 'lib/index',
+    autocomplete: 'autocomplete'
+  }).use(['index', 'utils','form', 'element'], function(){
+    var $ = layui.$
+    ,admin = layui.admin
+    ,element = layui.element
+    ,form = layui.form;
+
+    var editdata = JSON.parse(JSON.stringify(parent.layui.table.editdata));
+    $('#id_amount').html(editdata.total_amount);
+    $('#id_pay_amount').html(editdata.pay_amount);
+
+    var payment_type_option = '';
+
+     admin.req({
+        url: '/foundation/search_options/?type=5',
+        done: function(res){
+            var payment_types = res.data;
+            for (var i in payment_types) {
+                 payment_type_option += "<option value="+ payment_types[i].id+">"+ payment_types[i].name+"</option>";
+            }
+            $("#id_payment_account").append(payment_type_option);
+            form.render();
+        }
+    });
+
+
+    form.render(null, 'component-form-element');
+    element.render('breadcrumb', 'breadcrumb');
+
+    form.on('submit(component-form-element)', function(data){
+        var actual_amount = $('#id_actual_amount').val();
+        var amount = parseFloat(editdata.total_amount);
+        actual_amount = parseFloat(actual_amount);
+        var actual_amount_old = parseFloat(editdata.pay_amount);
+        if (actual_amount + actual_amount_old > amount) {
+            layer.confirm('实收金额大于应收金额, 确定要付款吗?', function(index){
+                layer.close(index);
+                admin.req({
+                    url: '/order/sale_order/pay/?id='+editdata.id
+                    ,data: JSON.stringify(data.field)
+                    ,type: 'post'
+                    ,done: function(res){
+                         parent.layui.onSubmitChild();
+                    }
+                });
+            });
+        }else{
+            admin.req({
+            url: '/order/sale_order/pay/?id='+editdata.id
+                ,data: JSON.stringify(data.field)
+                ,type: 'post'
+                , done: function (res) {
+                    parent.layui.onSubmitChild();
+                }
+            });
+        }
+
+        return false;
+    });
+
+    parent.layui.submitChild = function () {
+      $("#purchase-order-submit").click();
+    };
+
+  });
+
+  </script>
+</body>
+</html>

+ 10 - 114
uis/views/purchase/purchase_order.html

@@ -34,24 +34,6 @@
                   </dl>
                 </div>
               </button>
-                <button class="layui-nav" data-permission="purchase.check2_purchase_plan">
-                            <div class="layui-nav-item">
-                                <a href="javascript:;" style="color:#fff;">复核</a>
-                                <dl class="layui-nav-child"> <!-- 二级菜单 -->
-                                    <dd><a href="#" id="btn_check2">复核</a></dd>
-                                    <dd><a href="#" id="btn_check2_back">撤销</a></dd>
-                                </dl>
-                            </div>
-                        </button>
-                        <button class="layui-nav" data-permission="purchase.check3_purchase_plan">
-                            <div class="layui-nav-item">
-                                <a href="javascript:;" style="color:#fff;">批准</a>
-                                <dl class="layui-nav-child"> <!-- 二级菜单 -->
-                                    <dd><a href="#" id="btn_check3">批准</a></dd>
-                                    <dd><a href="#" id="btn_check3_back">撤销</a></dd>
-                                </dl>
-                            </div>
-                        </button>
                 <button class="layui-nav" data-permission="purchase.export_purchase_order">
                 <div class="layui-nav-item">
                   <a href="javascript:;" style="color:#fff;">导出</a>
@@ -78,7 +60,7 @@
                   <a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del" data-permission="purchase.delete_purchase_order">删除</a>
                   <a class="layui-btn layui-btn-xs" lay-event="check_pass" data-permission="purchase.check_purchase_order">审核</a>
                   {{#  } }}
-                  {{#  if(d.status ==2){ }}
+                  {{#  if(d.status ==1){ }}
                   <a class="layui-btn layui-btn-xs" lay-event="check_revoke" data-permission="purchase.check_purchase_order">撤销审核</a>
                     {{#  } }}
                 </div>
@@ -117,10 +99,8 @@
                 <div class="layui-input-block">
                     <select id="id_check_status" name="status">
                         <option value="" selected></option>
-                        <option value="0">草拟</option>
-                        <option value="1">生效</option>
-                        <option value="2">审核中</option>
-                        <option value="3" selected>待处理</option>
+                        <option value="0">未审核</option>
+                        <option value="1">已审核</option>
                     </select>
                 </div>
             </div>
@@ -153,7 +133,7 @@
 
   <script src="../../layuiadmin/layui/layui.js?t=1"></script>
   <script>
-  var _params = {status:3};
+  var _params = {};
   layui.config({
     base: '../../../layuiadmin/' //静态资源所在路径
   }).extend({
@@ -187,10 +167,6 @@
         ,{field:'create_user_text', title:'创建人', width:90}
         ,{field:'check_time', title:'审核时间', width:150}
         ,{field:'check_user_text', title:'审核人', width:90}
-        ,{field:'check_time2', title:'复核时间', width:150}
-        ,{field:'check_user_text2', title:'复核人', width: 100}
-        ,{field:'check_time3', title:'批准时间', width:150}
-        ,{field:'check_user_text3', title:'批准人', width: 100}
         ,{field:'notes', title:'备注', minWidth:200}
         ,{field:'deliver_time', title:'交货时间', minWidth:200}
         ,{width:250, align:'left', fixed: 'right', toolbar: '#datagrid-operate-bar'}
@@ -235,7 +211,7 @@
         });
       } else if(obj.event === 'del'){
           if (data.status != 0){
-            layer.msg('该合同已生效,不允许删除');
+            layer.msg('该合同已审核,不允许删除');
             return;
           }
         layer.confirm('确定要删除吗?', function(index){
@@ -250,7 +226,7 @@
         });
       }else if(obj.event === 'edit'){
           if (data.status != 0){
-            layer.msg('该订单已生效,不允许修改');
+            layer.msg('该订单已审核,不允许修改');
             return;
         }
         table.editdata = data;
@@ -273,7 +249,7 @@
         });
       } else if(obj.event === 'senior'){
           if (data.status != 0){
-            layer.msg('该订单已生效,不允许修改');
+            layer.msg('该订单已审核,不允许修改');
             return;
         }
         table.editdata = data;
@@ -295,7 +271,7 @@
           content: 'purchase_order_senior.html?id='+data.id+ '&type=' + data.supplier_type
         });
       } else if(obj.event === 'check_pass'){
-          if (data.status != 0){
+          if (data.status !== 0){
             layer.msg('该合同已审核, 禁止重复操作');
             return;
           }
@@ -306,7 +282,7 @@
           layer.confirm('确定要通过审核吗?', function(index){
               layer.close(index);
               layui.admin.req({
-                url: '/purchase/purchase_order/check/?c_type=check&id='+data.id + '&status=1'
+                url: '/purchase/purchase_order/check/?id='+data.id + '&status=1'
                 ,done: function(res){
                   table.reload('datagrid',{});
                 }
@@ -314,10 +290,6 @@
               layer.close(index);
         });
       }else if(obj.event === 'check_revoke'){
-          if(data.check_user2){
-            layer.msg('该采购合同已复核');
-            return;
-          }
           if (data.status == 0){
             layer.msg('该合同尚未审核');
             return;
@@ -337,7 +309,7 @@
         layer.confirm('确定要撤销审核吗?', function(index){
               layer.close(index);
               layui.admin.req({
-                url: '/purchase/purchase_order/check/?c_type=check&id='+data.id + '&status=0'
+                url: '/purchase/purchase_order/check/?id='+data.id + '&status=0'
                 ,done: function(res){
                   table.reload('datagrid',{});
                 }
@@ -366,82 +338,6 @@
           content: 'purchase_order_senior.html?type=0'
         });
     });
-    $('#btn_check2').on('click', function(){
-        var data = utils.getSelectedRow('datagrid');
-        if(data.check_user2){
-            layer.msg('该采购合同已复核');
-            return;
-        }
-        if(data.status == '0' ){
-            layer.msg('该采购合同未审核,禁止复核');
-            return;
-        }
-        layer.confirm('确定要复核吗?', function(index){
-            layer.close(index);
-            layui.admin.req({
-                url: '/purchase/purchase_order/check/?c_type=check2&status=1&id='+data.id
-                ,done: function(res){
-                    table.reload('datagrid',{});
-                }
-            });
-        });
-    });
-    $('#btn_check2_back').on('click', function(){
-        var data = utils.getSelectedRow('datagrid');
-        if(!data.check_user2){
-            layer.msg('该采购合同未复核,禁止撤销复核');
-            return;
-        }
-        if(data.check_user3){
-            layer.msg('该采购合同已批准,禁止撤销复核');
-            return;
-        }
-        layer.confirm('确定要撤销复核吗?', function(index){
-            layer.close(index);
-            layui.admin.req({
-                url: '/purchase/purchase_order/check/?c_type=check2&status=0&id='+data.id
-                ,done: function(res){
-                    table.reload('datagrid',{});
-                }
-            });
-        });
-    });
-    $('#btn_check3').on('click', function(){
-        var data = utils.getSelectedRow('datagrid');
-        if(data.check_user3){
-            layer.msg('该采购合同已批准');
-            return;
-        }
-        if(!data.check_user2){
-            layer.msg('该采购合同未复核,禁止批准');
-            return;
-        }
-        layer.confirm('确定要批准吗?', function(index){
-            layer.close(index);
-            layui.admin.req({
-                url: '/purchase/purchase_order/check/?c_type=check3&status=1&id='+data.id
-                ,done: function(res){
-                    table.reload('datagrid',{});
-                }
-            });
-        });
-    });
-    $('#btn_check3_back').on('click', function(){
-        var data = utils.getSelectedRow('datagrid');
-        if(!data.check_user3){
-            layer.msg('该计划未批准,禁止撤销批准');
-            return;
-        }
-        layer.confirm('确定要撤销批准吗?', function(index){
-            layer.close(index);
-            layui.admin.req({
-                url: '/purchase/purchase_order/check/?c_type=check3&status=0&id='+data.id
-                ,done: function(res){
-                    table.reload('datagrid',{});
-                }
-            });
-        });
-    });
     $('#btn_add_con').on('click', function(){
         layer.open({
           type: 2,

+ 2 - 124
uis/views/purchase/purchase_payment.html

@@ -26,24 +26,6 @@
 
                     <div class="LAY-btns" style="margin-bottom: 10px;">
                         <button class="layui-btn layui-btn-sm" data-permission="purchase.add_purchase_payment" id="btn_add"><i class="layui-icon layui-icon-add-1"></i>添加</button>
-                         <button class="layui-nav" data-permission="purchase.review_purchase_payment">
-                            <div class="layui-nav-item">
-                                <a href="javascript:;" style="color:#fff;">复核</a>
-                                <dl class="layui-nav-child">
-                                    <dd><a href="#" id="btn_review">复核</a></dd>
-                                    <dd><a href="#" id="btn_review_back">撤销</a></dd>
-                                </dl>
-                            </div>
-                        </button>
-                        <button class="layui-nav" data-permission="purchase.ratify_purchase_payment">
-                            <div class="layui-nav-item">
-                                <a href="javascript:;" style="color:#fff;">批准</a>
-                                <dl class="layui-nav-child">
-                                    <dd><a href="#" id="btn_ratify">批准</a></dd>
-                                    <dd><a href="#" id="btn_ratify_back">撤销</a></dd>
-                                </dl>
-                            </div>
-                        </button>
                         <button class="layui-btn layui-btn-sm" data-permission="purchase.pay_purchase_payment" id="btn_pay"><i class="layui-icon layui-icon-add-1"></i>付款</button>
 
                         <button class="layui-nav" data-permission="purchase.export_purchase_payment">
@@ -164,10 +146,6 @@
                 ,{field:'status_text', title:'审核状态', width: 100}
                 ,{field:'check_time', title:'审核时间', width:150}
                 ,{field:'check_user_text', title:'审核人', width: 100}
-                ,{field:'review_time', title:'复核时间', width:150}
-                ,{field:'review_user_text', title:'复核人', width: 100}
-                ,{field:'ratify_time', title:'批准时间', width:150}
-                ,{field:'ratify_user_text', title:'批准人', width: 100}
                 ,{field:'notes', title:'备注', minWidth:120}
                 ,{width:193, align:'left', fixed: 'right', toolbar: '#datagrid-operate-bar'}
               ]]
@@ -246,10 +224,6 @@
                       layer.msg('该单据尚未审核');
                       return false;
                   }
-                  if (data.review_time){
-                      layer.msg('该单据已复核');
-                      return false;
-                  }
                   if (data.is_pay){
                       layer.msg('该单据已付款,禁止撤销审核');
                       return false;
@@ -331,110 +305,14 @@
                   content: 'purchase_payment_edit.html'
                 });
             });
-            $('#btn_review').on('click', function(){
-                var data = utils.getSelectedRow('datagrid');
-                if (!data) {
-                    layer.msg('请选择一条记录');
-                    return;
-                }
-                if(data.review_time){
-                    layer.msg('该付款单已复核');
-                    return;
-                }
-                if(data.status == '0' ){
-                    layer.msg('该付款单未审核,禁止复核');
-                    return;
-                }
-                layer.confirm('确定要复核吗?', function(index){
-                    layer.close(index);
-                    layui.admin.req({
-                        url: '/purchase/purchase_payment/review/?status=1&id='+data.id
-                        ,done: function(res){
-                            table.reload('datagrid',{});
-                        }
-                    });
-                });
-            });
-            $('#btn_review_back').on('click', function(){
-                var data = utils.getSelectedRow('datagrid');
-                if (!data) {
-                    layer.msg('请选择一条记录');
-                    return;
-                }
-                if(!data.review_time){
-                    layer.msg('该付款单未复核,禁止撤销复核');
-                    return;
-                }
-                if(data.ratify_time){
-                    layer.msg('该付款单已批准,禁止撤销复核');
-                    return;
-                }
-                layer.confirm('确定要撤销复核吗?', function(index){
-                    layer.close(index);
-                    layui.admin.req({
-                        url: '/purchase/purchase_payment/review/?status=0&id='+data.id
-                        ,done: function(res){
-                            table.reload('datagrid',{});
-                        }
-                    });
-                });
-            });
-            $('#btn_ratify').on('click', function(){
-                var data = utils.getSelectedRow('datagrid');
-                if (!data) {
-                    layer.msg('请选择一条记录');
-                    return;
-                }
-                if(!data.review_time){
-                    layer.msg('该付款单未复核');
-                    return;
-                }
-                if(data.ratify_time){
-                    layer.msg('该付款单已批准');
-                    return;
-                }
-                layer.confirm('确定要批准吗?', function(index){
-                    layer.close(index);
-                    layui.admin.req({
-                        url: '/purchase/purchase_payment/ratify/?status=1&id='+data.id
-                        ,done: function(res){
-                            table.reload('datagrid',{});
-                        }
-                    });
-                });
-            });
-            $('#btn_ratify_back').on('click', function(){
-                var data = utils.getSelectedRow('datagrid');
-                if (!data) {
-                    layer.msg('请选择一条记录');
-                    return;
-                }
-                if(!data.ratify_time){
-                    layer.msg('该付款单未批准');
-                    return;
-                }
-                if(data.is_pay){
-                    layer.msg('该付款单已付款');
-                    return;
-                }
-                layer.confirm('确定要撤销批准吗?', function(index){
-                    layer.close(index);
-                    layui.admin.req({
-                        url: '/purchase/purchase_payment/ratify/?status=0&id='+data.id
-                        ,done: function(res){
-                            table.reload('datagrid',{});
-                        }
-                    });
-                });
-            });
             $('#btn_pay').on('click', function(){
                 var data = utils.getSelectedRow('datagrid');
                      if(data == false){
                          return;
                      }
 
-                 if (!data.ratify_time) {
-                     layer.msg('该付款单尚未批准,不允许付款');
+                 if (data.status === 0) {
+                     layer.msg('该付款单尚未审核,不允许付款');
                      return false;
                  }
                     var actual_amount = parseFloat(data.actual_amount);

+ 0 - 8
uis/views/purchase/purchase_payment_print.html

@@ -69,8 +69,6 @@
                     <tr style="height: 80px;">
                         <td align="center" width="25%">申请人:<span id="create_user"></span></td>
                         <td align="center" width="25%">审核人:<span id="check_user"></span></td>
-                        <td align="center" width="25%">复核人:<span id="review_user"></span></td>
-                        <td align="center" width="25%">批准人:<span id="approval_user"></span></td>
                     </tr>
                 </table>
             </div>
@@ -96,12 +94,6 @@
     if (data.check_user_text) {
         $('#check_user').html(data.check_user_text+ ',' + data.check_time);
     }
-    if (data.review_user_text){
-        $('#review_user').html(data.review_user_text + ',' + data.review_time);
-    }
-    if (data.ratify_user_text) {
-        $('#approval_user').html(data.ratify_user_text + ',' + data.ratify_time);
-    }
 
     $('.cell').each(function (index, element) {
         element.innerHTML += ':' + (data[element.id]||'')