Browse Source

Merge remote-tracking branch 'origin/master'

# Conflicts:
#	apps/foundation/models.py
lyh 3 years ago
parent
commit
cac6820c93

+ 9 - 1
apps/config/models.py

@@ -5,7 +5,7 @@ from django.db import models
 class Config(models.Model):
     KEY_CONSIGNEE_NAME = "consignee_name"       # 收货人姓名
     KEY_CONSIGNEE_TEL = "consignee_tel"         # 收货人电话
-    GODOWNENTRY_PROCESS = "godownentry_process"         # 收货人电话
+    GODOWNENTRY_PROCESS = "godownentry_process"         # 1简易流程,0标准流程
 
     property = models.CharField(max_length=100, verbose_name=u'属性')
     value = models.TextField(verbose_name=u'值')
@@ -36,3 +36,11 @@ class Config(models.Model):
             return row.value
         except:
             return ""
+
+    @staticmethod
+    def getValue(property):
+        try:
+            row = Config.objects.get(property=property)
+            return row.value
+        except:
+            return ""

+ 2 - 1
apps/config/urls.py

@@ -6,4 +6,5 @@ from views import *
 urlpatterns = (
     url(r'^data/$', config_list),
     url(r'^save/$', config_save),
-)
+    url(r'^get_value/$', get_value),
+)

+ 7 - 1
apps/config/views.py

@@ -5,7 +5,6 @@ import json
 
 from django.views.decorators.csrf import csrf_exempt
 from django.db import transaction
-
 from apps.exceptions import CustomError
 from apps.foundation.models import BizLog
 from libs.http import JSONResponse, JSONError, DataGridJSONResponse
@@ -13,6 +12,13 @@ from apps.account.decorators import permission_required, token_required
 from models import Config
 from serializers import  ConfigSerializer
 
+@token_required
+def get_value(request):
+    property = request.GET.get('property')
+    value = Config.getValue(property)
+
+    return JSONResponse(value)
+
 @csrf_exempt
 @permission_required('config.edit_config')
 def config_save(request):

+ 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__"

+ 27 - 10
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):

+ 106 - 0
apps/finance/serializers.py

@@ -3,7 +3,113 @@
 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))

+ 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 - 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')

+ 31 - 28
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,15 +214,19 @@ 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)
+
+    handing_amount = models.BigIntegerField(u'装卸费用', default=0)
+    transport_amount = models.BigIntegerField(u'运输费用', default=0)
+
     class Meta:
         db_table = "purchase_order"
         verbose_name = u"合同管理"
@@ -245,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):
@@ -380,9 +382,9 @@ class PurchasePayment(models.Model):
     no = models.CharField(max_length=20, verbose_name=u"单号", editable=False)
     order = models.ForeignKey(PurchaseOrder, verbose_name=u"合同", on_delete=models.PROTECT)
     status = models.PositiveSmallIntegerField(choices=settings.CHECK_STATUS_CHOICES, default=settings.DEFAULT, verbose_name=u"状态")
-    amount = models.BigIntegerField(verbose_name=u'合同金额', default=0)
-    actual_amount = models.BigIntegerField(verbose_name=u'实付金额', default=0)
-    apply_amount = models.BigIntegerField(verbose_name=u'申请金额', default=0)
+    amount = models.BigIntegerField(verbose_name=u'合同金额', default=0) # 1、标准模式:材料费用+ 运费+装卸费。2、简易模式:材料费用
+    actual_amount = models.BigIntegerField(verbose_name=u'实付金额', default=0) # 已付金额
+    apply_amount = models.BigIntegerField(verbose_name=u'申请金额', default=0) # 简易费用,此值为材料费用
     is_pay = models.BooleanField(verbose_name=u"是否付款", default=0)
     notes = models.CharField(max_length=200, verbose_name=u"申请备注", blank=True, null=True)
     create_time = models.DateTimeField(verbose_name=u"创建时间", default=timezone.now)
@@ -390,13 +392,14 @@ 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:
         db_table = "purchase_payment"
@@ -413,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

+ 2 - 3
apps/purchase/urls.py

@@ -15,6 +15,7 @@ urlpatterns = (
     url(r'^purchase_order/delete/$', purchase_order_delete),
     url(r'^purchase_order/check/$', purchase_order_check),
     url(r'^purchase_order/export_detail/$', purchase_order_export_detail),
+    url(r'^purchase_order/payment/$', purchase_order_payment),
 
     url(r'^purchase/data/$', purchase_list),
     url(r'^purchase/export/$', purchase_export),
@@ -40,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),
@@ -85,4 +84,4 @@ urlpatterns = (
     url(r'^godownentry_return_query/export/$', godownentry_return_query_export),
     url(r'^godownentry_return_query/detail/$', godownentry_return_query_detail),
 
-)
+)

+ 90 - 211
apps/purchase/views.py

@@ -624,7 +624,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']
@@ -653,7 +654,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()
@@ -766,10 +768,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,
         }
@@ -828,9 +830,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 = {
@@ -860,8 +863,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)
@@ -900,116 +904,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())
@@ -1029,6 +964,31 @@ def purchase_order_export_detail(request):
     BizLog.objects.addnew(request.user, BizLog.EXPORT, u"导出采购合同明细")
     return JSONResponse({'filename': filename})
 
+@csrf_exempt
+@permission_required('purchase.check_purchase_order')
+def purchase_order_payment(request):
+    #todo 简易模式,入库单付款,自动生成付款单,并自动审核。同时创建收支单(创建收支单,放到付款单审核流程中)
+    id = request.GET.get('id') # 入库单id
+    handing_amount = request.POST.get('handing_amount')
+    handing_account = request.POST.get('handing_account')
+
+    transport_account = request.POST.get('transport_account')
+    transport_amount = request.POST.get('transport_amount')
+
+    order_amount = request.POST.get('order_amount')
+    order_account = request.POST.get('order_account')
+
+    try:
+        with transaction.atomic():
+            order = PurchaseOrder.getById(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('purchase.view_purchase_payment')
 def purchase_payment_list(request):
@@ -1177,7 +1137,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(
@@ -1188,8 +1148,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
@@ -1208,92 +1168,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')
@@ -1319,10 +1193,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:
@@ -1376,7 +1252,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))
@@ -1401,7 +1278,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(
@@ -1693,6 +1571,7 @@ def godownentry_list(request):
 @csrf_exempt
 @token_required
 def godownentry_save(request):
+    #todo 简易流程:添加入库单,同时生成合同,自动审核合同。
     id = request.GET.get('id')
     main_data = json.loads(request.POST.get('main'))
     items_data = json.loads(request.POST.get('item'))

+ 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>

+ 141 - 64
uis/views/purchase/material_godownentry.html

@@ -10,12 +10,36 @@
     <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">
-    .LAY-btns .layui-nav {padding-left:0;padding-right:10px;top:-4px;margin: 0 10px;border: 0;background-color: #009688;}
-    .LAY-btns .layui-nav .layui-nav-item{line-height: 30px;}
-    .LAY-btns .layui-nav .layui-nav-child{top:34px;}
-    .LAY-btns .layui-nav .layui-nav-bar{display: none;}
-    .LAY-btns .layui-nav .layui-nav-child dd.layui-this a{color:#333;background-color:#fff;}
-    .LAY-btns .layui-nav .layui-nav-child dd.layui-this a:hover {background-color: #f2f2f2;color: #000;}
+        .LAY-btns .layui-nav {
+            padding-left: 0;
+            padding-right: 10px;
+            top: -4px;
+            margin: 0 10px;
+            border: 0;
+            background-color: #009688;
+        }
+
+        .LAY-btns .layui-nav .layui-nav-item {
+            line-height: 30px;
+        }
+
+        .LAY-btns .layui-nav .layui-nav-child {
+            top: 34px;
+        }
+
+        .LAY-btns .layui-nav .layui-nav-bar {
+            display: none;
+        }
+
+        .LAY-btns .layui-nav .layui-nav-child dd.layui-this a {
+            color: #333;
+            background-color: #fff;
+        }
+
+        .LAY-btns .layui-nav .layui-nav-child dd.layui-this a:hover {
+            background-color: #f2f2f2;
+            color: #000;
+        }
     </style>
 </head>
 <body>
@@ -25,7 +49,9 @@
             <div class="layui-row">
 
                 <div class="LAY-btns" style="margin-bottom: 10px;">
-                    <button class="layui-btn layui-btn-sm" data-permission="purchase.add_material_godown_entry" id="btn_add"><i class="layui-icon layui-icon-add-1"></i>添加</button>
+                    <button class="layui-btn layui-btn-sm" data-permission="purchase.add_material_godown_entry"
+                            id="btn_add"><i class="layui-icon layui-icon-add-1"></i>添加
+                    </button>
                     <button class="layui-nav" data-permission="purchase.export_material_godown_entry">
                         <div class="layui-nav-item">
                             <a href="javascript:;" style="color:#fff;">导出</a>
@@ -44,22 +70,33 @@
                             </dl>
                         </div>
                     </button>
-                    <button class="layui-btn layui-btn-sm" id="btn_print" data-permission="purchase.print_material_godown_entry"><i class="layui-icon layui-icon-form"></i>打印</button>
-                    <button class="layui-btn layui-btn-sm" id="btn_query"><i class="layui-icon layui-icon-search"></i>查询</button>
+                    <button class="layui-btn layui-btn-sm" id="btn_print"
+                            data-permission="purchase.print_material_godown_entry"><i
+                            class="layui-icon layui-icon-form"></i>打印
+                    </button>
+                    <button class="layui-btn layui-btn-sm layui-hide" id="btn_pay"><i
+                            class="layui-icon layui-icon-form"></i>付款
+                    </button>
+                    <button class="layui-btn layui-btn-sm" id="btn_query"><i class="layui-icon layui-icon-search"></i>查询
+                    </button>
                 </div>
                 <table class="layui-hide" id="datagrid" lay-filter="datagrid-operate"></table>
                 <script type="text/html" id="datagrid-operate-bar">
                     <div class="layui-btn-group">
-                    <a class="layui-btn layui-btn-xs" lay-event="detail">查看</a>
-                    {{# if(d.status == 0){ }}
-                    <a class="layui-btn layui-btn-xs" lay-event="edit" data-permission="purchase.add_material_godown_entry">修改</a>
+                        <a class="layui-btn layui-btn-xs" lay-event="detail">查看</a>
+                        {{# if(d.status == 0){ }}
+                        <a class="layui-btn layui-btn-xs" lay-event="edit"
+                           data-permission="purchase.add_material_godown_entry">修改</a>
 
-                    <a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del" data-permission="purchase.delete_material_godown_entry">删除</a>
-                    <a class="layui-btn layui-btn-xs" lay-event="check" data-permission="purchase.check_material_godown_entry">审核</a>
-                    {{# } }}
-                    {{# if(d.status == 1){ }}
-                    <a class="layui-btn layui-btn-xs" lay-event="senior_edit" data-permission="purchase.edit_material_godown_entry">高级修改</a>
-                    {{# } }}
+                        <a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del"
+                           data-permission="purchase.delete_material_godown_entry">删除</a>
+                        <a class="layui-btn layui-btn-xs" lay-event="check"
+                           data-permission="purchase.check_material_godown_entry">审核</a>
+                        {{# } }}
+                        {{# if(d.status == 1){ }}
+                        <a class="layui-btn layui-btn-xs" lay-event="senior_edit"
+                           data-permission="purchase.edit_material_godown_entry">高级修改</a>
+                        {{# } }}
                     </div>
                 </script>
             </div>
@@ -73,13 +110,15 @@
                 <div class="layui-col-xs12 layui-col-sm12">
                     <label class="layui-form-label">创建时间:</label>
                     <div class="layui-input-block">
-                        <input type="text" class="layui-input" autocomplete="off" name="create_time" id="create_time" placeholder=" - ">
+                        <input type="text" class="layui-input" autocomplete="off" name="create_time" id="create_time"
+                               placeholder=" - ">
                     </div>
                 </div>
                 <div class="layui-col-xs12 layui-col-sm12">
                     <label class="layui-form-label">审核时间:</label>
                     <div class="layui-input-block">
-                        <input type="text" class="layui-input" autocomplete="off" name="check_time" id="check_time" placeholder=" - ">
+                        <input type="text" class="layui-input" autocomplete="off" name="check_time" id="check_time"
+                               placeholder=" - ">
                     </div>
                 </div>
                 <div class="layui-col-xs12 layui-col-sm12">
@@ -123,7 +162,7 @@
                     </div>
                 </div>
             </div>
-            <div style="display: none" >
+            <div style="display: none">
                 <button id="query-submit" lay-submit lay-filter="query-form-element">查询</button>
             </div>
         </form>
@@ -143,21 +182,21 @@
         var table = layui.table
             , form = layui.form
             , utils = layui.utils
-            ,laydate = layui.laydate;
+            , laydate = layui.laydate;
         var is_has = utils.isHasPermissions('material.view_material_cost');
         var cols = [];
-        cols.push({type: 'checkbox', width: 50});
+        cols.push({type: 'radio', width: 50});
         cols.push({field: 'no', title: '入库单号', width: 140});
-        cols.push({field: 'supplier_text', title: '供应商', width: 145});
-        cols.push({field: 'total_count', align:'right', title: '合计数量', width: 100});
+        cols.push({field: 'supplier_text', title: '供应商', width: 150});
+        cols.push({field: 'total_count', align: 'right', title: '合计数量', width: 100});
         if (is_has) {
-            cols.push({field: 'total_amount', align:'right', title: '合计金额', width: 100});
-            cols.push({field: 'total_invoice_amount', align:'right', title: '合计发票金额', width: 120});
+            cols.push({field: 'total_amount', align: 'right', title: '合计金额', width: 100});
+            cols.push({field: 'total_invoice_amount', align: 'right', title: '合计发票金额', width: 120});
         }
-        cols.push({field: 'warehouse_text', align:'right', title: '仓别', width: 100});
-        cols.push({field: 'purchase_order_no', align:'right', title: '合同号', width: 150});
+        cols.push({field: 'warehouse_text', align: 'right', title: '仓别', width: 100});
+        cols.push({field: 'purchase_order_no', align: 'right', title: '合同号', width: 150});
         cols.push({field: 'create_time', title: '创建时间', width: 150});
-        cols.push({field: 'create_user_text', title: '创建人', width: 150});
+        cols.push({field: 'create_user_text', title: '创建人', width: 100});
         cols.push({field: 'status_text', title: '审核状态', width: 100});
         cols.push({field: 'check_time', title: '审核时间', width: 150});
         cols.push({field: 'check_user_text', title: '审核人', width: 100});
@@ -171,7 +210,7 @@
             , page: true
             , height: 'full-104'
             , totalRow: true
-            ,parseData:function(res) {
+            , parseData: function (res) {
                 var cols = this.cols[0];
                 for (var i in cols) {
                     if (cols[i].field == 'total_count') {
@@ -182,20 +221,30 @@
                     }
                 }
                 return {
-                  "code": res.code, //解析接口状态
-                  "count": res.count, //解析数据长度
-                  "data": res.data //解析数据列表
+                    "code": res.code, //解析接口状态
+                    "count": res.count, //解析数据长度
+                    "data": res.data //解析数据列表
                 };
             }
             , done: function () {
                 layui.index.removeNoPermButtons()
             }
         });
+
+        layui.admin.req({
+            url: '/config/get_value/?property=godownentry_process'
+            , done: function (res) {
+                if (res.data == '1') {
+                    layui.$('#btn_pay').removeClass('layui-hide')
+                }
+            }
+        });
+
         //监听工具条
         table.on('tool(datagrid-operate)', function (obj) {
             var data = obj.data;
             if (obj.event === 'del') {
-                if (data.status === "1"){
+                if (data.status === "1") {
                     layer.msg('入库单已审核,无法删除!');
                     return;
                 }
@@ -210,7 +259,7 @@
                 });
             } else if (obj.event === 'edit') {
                 table.editdata = data;
-                if (data.status === "1"){
+                if (data.status === "1") {
                     layer.msg('入库单已审核,无法修改!');
                     return;
                 }
@@ -222,19 +271,19 @@
                     btn: ['保存', '取消'],
                     yes: function (index, dom) {
                         layui.onSubmitChild = function (data) {
-                        layer.close(index);
-                        table.reload('datagrid', {});
-                    };
-                    layui.submitChild();
+                            layer.close(index);
+                            table.reload('datagrid', {});
+                        };
+                        layui.submitChild();
                     },
                     btn2: function (index, layero) {
                         layer.close(index);//关闭当前按钮
                     },
                     content: 'material_godownentry_edit.html?id=' + data.id
                 });
-            }else if (obj.event === 'senior_edit') {
+            } else if (obj.event === 'senior_edit') {
                 table.editdata = data;
-                if (data.status === "0"){
+                if (data.status === "0") {
                     layer.msg('入库单未审核,无法高级修改!');
                     return;
                 }
@@ -246,37 +295,37 @@
                     btn: ['保存', '取消'],
                     yes: function (index, dom) {
                         layui.onSubmitChild = function (data) {
-                        layer.close(index);
-                        table.reload('datagrid', {});
-                    };
-                    layui.submitChild();
+                            layer.close(index);
+                            table.reload('datagrid', {});
+                        };
+                        layui.submitChild();
                     },
                     btn2: function (index, layero) {
                         layer.close(index);//关闭当前按钮
                     },
                     content: 'material_godownentry_senior_edit.html?id=' + data.id
                 });
-            }else if(obj.event === 'check'){
-                layer.confirm('确定要审核吗?', function(index){
+            } else if (obj.event === 'check') {
+                layer.confirm('确定要审核吗?', function (index) {
 
                     layer.close(index);
                     layui.admin.req({
-                        url: '/purchase/godownentry/check/?id='+data.id
-                        ,done: function(res){
-                            table.reload('datagrid',{});
+                        url: '/purchase/godownentry/check/?id=' + data.id
+                        , done: function (res) {
+                            table.reload('datagrid', {});
                         }
                     });
                 });
-              }else if(obj.event === 'detail'){
-                  table.editdata = data;
+            } else if (obj.event === 'detail') {
+                table.editdata = data;
                 layer.open({
-                  type: 2,
-                  title: '查看['+ data.no + ']',
-                  shadeClose: true,
-                  area: ['70%', '80%'],
-                  content: 'material_godownentry_detail.html?id='+data.id
+                    type: 2,
+                    title: '查看[' + data.no + ']',
+                    shadeClose: true,
+                    area: ['70%', '80%'],
+                    content: 'material_godownentry_detail.html?id=' + data.id
                 });
-              }
+            }
         });
         laydate.render({
             elem: '#create_time'
@@ -303,7 +352,7 @@
                 return;
             }
             layui.admin.req({
-                url: '/purchase/godownentry/export_detail/?id='+data.id,
+                url: '/purchase/godownentry/export_detail/?id=' + data.id,
                 data: _params,
                 done: function (res) {
                     layui.view.download(res.data.filename);
@@ -329,6 +378,34 @@
                 content: 'material_godownentry_edit.html'
             });
         });
+        $('#btn_pay').on('click', function () {
+            var data = utils.getSelectedRow('datagrid');
+            if (data == false) {
+                layer.msg('请选择一条数据!', {icon: 5});
+                return false;
+            }
+            if (data.status != '1') {
+                layer.msg('请先审核入库单,在付款!', {icon: 5});
+                return false;
+            }
+            layer.open({
+                type: 2,
+                title: '入库付款',
+                area: ['40%', '60%'],
+                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: 'material_pay.html?id=' + data.id
+            });
+        });
         $('#btn_query').on('click', function () {
             layer.open({
                 type: 1,
@@ -347,7 +424,7 @@
             _params = data.field;
             table.reload('datagrid', {
                 where: data.field,
-                page:{curr:1}
+                page: {curr: 1}
             });
             layer.closeAll();
             return false
@@ -365,8 +442,8 @@
                 area: ['90%', '90%'],
                 btn: ['打印', '取消'],
                 yes: function (index, dom) {
-                    layui.onSubmitChild = function(data){
-                      layer.close(index);
+                    layui.onSubmitChild = function (data) {
+                        layer.close(index);
                     };
                     layui.submitChild();
                 },
@@ -404,4 +481,4 @@
     })
 </script>
 </body>
-</html>
+</html>

+ 160 - 0
uis/views/purchase/material_pay.html

@@ -0,0 +1,160 @@
+<!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="order_amount" lay-verify="number" autocomplete="off" 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_order_account" name="order_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="transport_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_transport_account" name="transport_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="handing_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_handing_account" name="handing_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('id');
+
+        admin.req({
+            url: '/foundation/search_options/?type=5',
+            done: function (res) {
+                var data = res.data;
+                var order_account = $('#id_order_account');
+                var transport_account = $('#id_transport_account');
+                var handing_account = $('#id_handing_account');
+                for (var i in data) {
+                    var pid = data[i].id;
+                    var value = data[i].name;
+                    order_account.append("<option value='" + pid + "'>" + value + "</option>");
+                    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) {
+            console.log(111111111, data.field)
+
+            if (parseFloat(data.field.order_amount) > 0 && !data.field.order_account) {
+                layer.msg('请选择订单费用付款账户!', {icon: 5});
+                return false;
+            }
+
+            if (parseFloat(data.field.handing_amount) > 0 && !data.field.handing_account) {
+                layer.msg('请选择装卸费用付款账户!', {icon: 5});
+                return false;
+            }
+
+            if (parseFloat(data.field.transport_amount) > 0 && !data.field.transport_account) {
+                layer.msg('请选择运输费用付款账户!', {icon: 5});
+                return false;
+            }
+            admin.req({
+                url: '/purchase/purchase_order/payment/?id=' + id
+                , data: data.field
+                , type: 'post'
+                , done: function (res) {
+                    parent.layui.onSubmitChild();
+                }
+            });
+            return false;
+        });
+
+        parent.layui.submitChild = function () {
+            $("#material-pay-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]||'')