Ver código fonte

小程序付款,

wushaodong 4 anos atrás
pai
commit
a2ee62130c

+ 57 - 2
apps/WeChatResponse.py

@@ -31,7 +31,7 @@ WEIXIN_QUERY_ORDER_URL = 'https://api.mch.weixin.qq.com/pay/orderquery'
 # 微信支付回调API
 WEIXIN_CALLBACK_API = settings.WECHAT['notify_url']
 
-
+# pc端支付
 class WeChatResponse():
 
     def __init__(self):
@@ -102,6 +102,62 @@ class WeChatResponse():
         self.prepay_id = result['xml']['prepay_id']
         return result['xml']['code_url']
 
+#小程序支付
+class WechatAppletPay():
+
+    def __init__(self):
+        self.params = {
+            "appid":  settings.WEAPP['appid'],
+            "body": WEIXIN_BODY,
+            "mch_id": WEIXIN_MCH_ID,
+            "nonce_str": '',
+            "notify_url": WEIXIN_CALLBACK_API,
+            "openid": '',  # 获取小程序openid
+            "out_trade_no": '',
+            "spbill_create_ip": WEIXIN_SPBILL_CREATE_IP,
+            "total_fee": '',
+            "trade_type": 'JSAPI',
+            "sign":''
+        }
+        self.prepay_id = None
+
+    def weChatUnifiedOrder(self, openid, out_trade_no, total_fee):
+        self.params['out_trade_no'] = out_trade_no
+        self.params['total_fee'] = int(round(float(total_fee) * 100, 0))
+        self.params['nonce_str'] = generate_nonce_str()
+        self.params['openid'] = openid
+        self.params['sign'] = generate_sign(self.params)
+        # 拿到封装好的xml数据
+        xml_data = xmltodict.unparse({'xml': self.params}, pretty=True, full_document=False).encode('utf-8')
+        # 请求微信统一下单URL
+        headers = {'Content-Type': 'application/xml'}
+        res = requests.post(WEIXIN_UNIFIED_ORDER_URL, data=xml_data, headers=headers)
+
+        if res.status_code != 200:
+            raise CustomError(u'微信请求失败!')
+
+        # 回复数据为xml,将其转为字典
+        content = json.loads(json.dumps(xmltodict.parse(res.content)))
+
+        if content['xml']['return_code'] != 'SUCCESS':
+            raise CustomError(u'微信通信失败![%s]' % content['xml']['return_msg'])
+        if content['xml']['result_code'] != 'SUCCESS':
+            raise CustomError(u'微信交易失败![%s:%s]' % (content['xml']['err_code'],content['xml']['err_code_des']))
+
+        self.prepay_id = content['xml']['prepay_id']
+
+        return self.getPaymentInfo()
+
+    def getPaymentInfo(self):
+        data = {
+            'appId': self.params['appid'],
+            'package': "prepay_id={}".format(self.prepay_id),
+            'nonceStr': generate_nonce_str(),
+            'timeStamp': str(int(time.time())),
+            'signType':'MD5'
+        }
+        data['paySign'] = generate_sign(data)
+        return data
 
 class WechatPayNotify():
     def __init__(self, params):
@@ -135,7 +191,6 @@ class WechatPayNotify():
         }
         return generate_response_data(return_info)
 
-
 def generate_nonce_str():
     """
     生成随机字符串

+ 3 - 2
apps/admin/config/views.py

@@ -2,7 +2,7 @@
 import json
 from django.db import transaction
 
-from utils.permission import IsAdministratorUser
+from utils.permission import IsAdministratorUser, IsTenantUser
 from apps.tenant.config.serializers import ConfigSerializer
 from utils.custom_modelviewset import CustomModelViewSet
 from apps.tenant.config.models import Config
@@ -12,7 +12,8 @@ from utils import response_ok, response_error
 
 
 class ConfigViewSet(CustomModelViewSet):
-    permission_classes = [IsAdministratorUser, ]
+    # TODO
+    permission_classes = [IsTenantUser, ]
     queryset = Config.objects.filter()
     serializer_class = ConfigSerializer
 

+ 9 - 9
apps/tenant/config/models.py

@@ -10,19 +10,19 @@ class Config(models.Model):
     FREE_DAYS = 'free_days'  # 免费体验天数
 
     EDITION_1_YUAN = 'edition_1_yuan' # 标准版原价
-    EDITION_1_ONE_YEAR = 'edition_1_one_year' # 标准版1年
-    EDITION_1_TWO_YEAR = 'edition_1_two_year' # 标准版2年
-    EDITION_1_THREE_YEAR = 'edition_1_three_year' # 标准版3年
+    EDITION_1_ONE_YEAR = 'edition_1_1_year' # 标准版1年
+    EDITION_1_TWO_YEAR = 'edition_1_2_year' # 标准版2年
+    EDITION_1_THREE_YEAR = 'edition_1_3_year' # 标准版3年
 
     EDITION_2_YUAN = 'edition_2_yuan' # 专业版原价
-    EDITION_2_ONE_YEAR = 'edition_2_one_year' # 专业版1年
-    EDITION_2_TWO_YEAR = 'edition_2_two_year' # 专业版2年
-    EDITION_2_THREE_YEAR = 'edition_2_three_year' # 专业版3年
+    EDITION_2_ONE_YEAR = 'edition_2_1_year' # 专业版1年
+    EDITION_2_TWO_YEAR = 'edition_2_2_year' # 专业版2年
+    EDITION_2_THREE_YEAR = 'edition_2_3_year' # 专业版3年
 
     EDITION_3_YUAN = 'edition_3_yuan' # 无限版原价
-    EDITION_3_ONE_YEAR = 'edition_3_one_year' # 无限版1年
-    EDITION_3_TWO_YEAR = 'edition_3_two_year' # 无限版2年
-    EDITION_3_THREE_YEAR = 'edition_3_three_year' # 无限版3年
+    EDITION_3_ONE_YEAR = 'edition_3_1_year' # 无限版1年
+    EDITION_3_TWO_YEAR = 'edition_3_2_year' # 无限版2年
+    EDITION_3_THREE_YEAR = 'edition_3_3_year' # 无限版3年
 
 
     property = models.CharField(max_length=100, verbose_name=u'属性')

+ 34 - 6
apps/tenant/models.py

@@ -12,6 +12,14 @@ from apps.Alipay import Alipay
 from apps.tenant.config.models import Config
 
 class Tenant(models.Model):
+    EDITION_1 = 1
+    EDITION_2 = 2
+    EDITION_3 = 3
+    EDITION_CHOICES = (
+        (EDITION_1, u'标准版'),
+        (EDITION_2, u'专业版'),
+        (EDITION_3, u'无限版'),
+    )
 
     company_no = models.CharField(max_length=10, verbose_name=u'企业编号', blank=True, null=True)
     company_name = models.CharField(max_length=200, verbose_name=u'企业名称', blank=True, null=True)
@@ -28,6 +36,7 @@ class Tenant(models.Model):
                              editable=False, null=True)
     reject_reason = models.CharField(max_length=200, verbose_name=u'拒绝原因', blank=True, null=True)
     delete = models.BooleanField(verbose_name=u'删除', default=False, editable=False)
+    edition = models.PositiveSmallIntegerField(choices=EDITION_CHOICES, verbose_name='版本', default=EDITION_1)
 
     class Meta:
         db_table = 'tenant'
@@ -98,9 +107,11 @@ class Pay(models.Model):
     )
     WECHAT = 1
     ALIPAY = 2
+    WECHAT_APP = 3
     PAY_CHANNEL_CHOICES = (
         (WECHAT, u'微信'),
         (ALIPAY, u'支付宝'),
+        (WECHAT_APP, u'小程序'),
     )
     pay_no = models.CharField(max_length=25, verbose_name='支付单号',unique=True, null=True)
     status = models.PositiveSmallIntegerField(choices=STATUS_CHOICES, verbose_name='状态', default=WAIT)
@@ -111,6 +122,7 @@ class Pay(models.Model):
     amount = models.BigIntegerField(verbose_name=u"支付金额", null=True)
     user = models.ForeignKey(settings.AUTH_USER_MODEL, verbose_name=u'下单人',related_name='pay_user', on_delete=models.PROTECT)
     tenant = models.ForeignKey(Tenant, verbose_name=u'商户',related_name='pay_tenant', on_delete=models.PROTECT)
+    edition_year = models.CharField(max_length=10, verbose_name='版本年限', default='')
 
     class Meta:
         db_table = "pay"
@@ -132,7 +144,7 @@ class Pay(models.Model):
         self.status = Pay.PAY
         self.amount = Formater.formatAmount(pay_amount)
         self.save()
-        year = Config.objects.filter(property=Config.KEY_RENEW_YEAR_1).first().value
+        year = self.edition_year.split(',')[1]
         today = datetime.datetime.now().strftime('%Y-%m-%d')
         today_stamp = time.mktime(time.strptime(today, "%Y-%m-%d"))
 
@@ -144,6 +156,7 @@ class Pay(models.Model):
             renew_date = (datetime.datetime.now() + datetime.timedelta(days=365 * int(year))).strftime('%Y-%m-%d')
         self.tenant.end_date = renew_date
         self.tenant.status = settings.PASS
+        self.tenant.edition = self.edition_year.split(',')[0]
         self.tenant.save()
 
     # 支付宝回调,付款
@@ -169,30 +182,44 @@ class Pay(models.Model):
             raise CustomError(u'未找到相应的支付单号!')
         return instance
 
+    # 小程序支付
+    @staticmethod
+    def wechatAppPay(user, tenant_id, amount, edition_year):
+        item = Pay._precreatePay(
+            user,
+            tenant_id,
+            Pay.WECHAT_APP,
+            amount,
+            edition_year,
+        )
+        return item
+
     # 微信支付
     @staticmethod
-    def wechatPay(user, tenant_id, amount):
+    def wechatPay(user, tenant_id, amount, edition_year):
         item = Pay._precreatePay(
             user,
             tenant_id,
             Pay.WECHAT,
-            amount
+            amount,
+            edition_year,
         )
         return item
 
     # 支付宝支付
     @staticmethod
-    def alipayPay(user, tenant_id, amount):
+    def alipayPay(user, tenant_id, amount, edition_year):
         item = Pay._precreatePay(
             user,
             tenant_id,
             Pay.ALIPAY,
-            amount
+            amount,
+            edition_year,
         )
         return item
 
     @staticmethod
-    def _precreatePay(user, tenant_id, pay_channel, amount):
+    def _precreatePay(user, tenant_id, pay_channel, amount, edition_year):
 
         pay_no = '{0}{1}'.format(tenant_id, timezone.now().strftime('%y%m%d%H%M%S'))
         pay = Pay.objects.create(
@@ -202,6 +229,7 @@ class Pay(models.Model):
             status=Pay.WAIT,
             precreate_amount=amount,
             user=user,
+            edition_year=edition_year,
         )
         qrcode = ''
         if pay_channel == Pay.WECHAT:

+ 9 - 26
apps/tenant/views.py

@@ -74,41 +74,24 @@ class CompanyViewSet(CustomModelViewSet):
     @action(methods=['get'], detail=True)
     def get_code(self, request, pk):
         pay_channel = request.GET.get('pay_channel')
-        config = Config.objects.filter(property=Config.KEY_RENEW_AMOUNT_1).first()
-        year = Config.objects.filter(property=Config.KEY_RENEW_YEAR_1).first()
-        if config:
-            amount = Formater.formatAmount(config.value)
-            year = year.value
+        pay_edition = request.GET.get('pay_edition') # edition_1_1_year
+        amount = Config.getIntValue(pay_edition)
+        if amount:
+            amount = Formater.formatAmount(amount)
+            editions = pay_edition.split('_')
+            edition_year = '{},{}'.format(editions[1],editions[2],)
         else:
             raise CustomError('续费金额错误')
 
         try:
-            tenant = Tenant.objects.filter(id=pk).first()
-            if tenant:
-                today = datetime.datetime.now().strftime('%Y-%m-%d')
-                today_stamp = time.mktime(time.strptime(today,"%Y-%m-%d"))
-
-                end_date = time.mktime(time.strptime(tenant.end_date.strftime('%Y-%m-%d'), '%Y-%m-%d'))
-                diff = int(end_date) - int(today_stamp)
-                if diff >= 0:
-                    start_date = tenant.end_date
-                    renew_date = (tenant.end_date + datetime.timedelta(days=365*int(year))).strftime('%Y-%m-%d')
-                else:
-                    start_date  = today
-                    renew_date = (datetime.datetime.now() + datetime.timedelta(days=365 * int(year))).strftime('%Y-%m-%d')
-            else:
-                raise CustomError('获取企业信息失败,请刷新重试!')
             with transaction.atomic():
                 if int(pay_channel) == Pay.WECHAT:
-                    line_data = Pay.wechatPay(request.user, pk ,amount)
+                    line_data = Pay.wechatPay(request.user, pk ,amount, edition_year)
                 elif int(pay_channel) == Pay.ALIPAY:
-                    line_data = Pay.alipayPay(request.user, pk ,amount)
+                    line_data = Pay.alipayPay(request.user, pk ,amount, edition_year)
                 else:
-                    raise CustomError('请选择正确的支付方式')
+                    raise CustomError('请选择正确的支付方式!')
                 data = {
-                    'renew_date': '{} — {}'.format(start_date,renew_date),
-                    'year': year,
-                    'amount': Formater.formatAmountShow(amount),
                     'id': line_data.id,
                     'qrcode': line_data.qrcode
                 }

+ 1 - 0
apps/wxapp/tenant/urls.py

@@ -7,6 +7,7 @@ from .views import *
 urlpatterns = [
     url(r'^search_tenant/$', SearchTenantView.as_view()),  # 我的报修
     url(r'^get_tenant_data/$', GetTenantView.as_view()),  # 企业信息
+    url(r'^wechatapp/$', WechatAppPayView.as_view()),  # 微信小程序续期申请
 ]
 
 router = SimpleRouter()

+ 33 - 1
apps/wxapp/tenant/views.py

@@ -10,7 +10,11 @@ from .serializers import TenantSerializer
 from utils.exceptions import CustomError
 from utils import response_ok, response_error
 from apps.tenant.employee.models import Employee
-from utils.permission import isLogin
+from utils.permission import isLogin,IsTenantUser
+from apps.WeChatResponse import WechatAppletPay
+from apps.tenant.config.models import Config
+from apps.base import Formater
+from apps.tenant.models import Pay
 
 class SearchTenantView(APIView):
     permission_classes = [isLogin, ]
@@ -45,6 +49,34 @@ class GetTenantView(APIView):
         else:
             return response_ok()
 
+class WechatAppPayView(APIView):
+    # TODO
+    permission_classes = [IsTenantUser]
+
+    def post(self, request):
+        openid = request.POST.get('openid')
+        pay_edition = request.POST.get('pay_edition')  # edition_1_1_year
+        try:
+            amount = Config.getIntValue(pay_edition)
+            if amount:
+                amount = Formater.formatAmount(amount)
+                editions = pay_edition.split('_')
+                edition_year = '{},{}'.format(editions[1], editions[2], )
+            else:
+                raise CustomError('续费金额错误')
+            with transaction.atomic():
+                pay = Pay.wechatAppPay(request.user, request.user.employee.tenant.id, amount, edition_year)
+                wechatpay = WechatAppletPay()
+                data = wechatpay.weChatUnifiedOrder(openid, pay.pay_no, Formater.formatAmountShow(amount))
+                BizLog.objects.addnew(request.user.employee.tenant, self.request.user, BizLog.INSERT, u'小程序续期申请 no=%s' % pay.pay_no)
+            return response_ok(data)
+        except CustomError as e:
+            return response_error(e.get_error_msg())
+        except Exception as e:
+            import traceback
+            traceback.print_exc()
+            return response_error(str(e))
+
 class TenantViewSet(CustomModelViewSet):
     permission_classes = [isLogin, ]
     queryset = Tenant.objects.all()

+ 9 - 15
ly_baoxiu_admin/settings.py

@@ -122,7 +122,7 @@ WSGI_APPLICATION = 'ly_baoxiu_admin.wsgi.application'
 # https://docs.djangoproject.com/en/2.2/ref/settings/#databases
 
 DATABASES = {
-    'default': {
+    'default2': {
         'ENGINE': 'django.db.backends.mysql',
         'NAME': 'baoxiu',
         'USER': 'baoxiu',
@@ -130,14 +130,14 @@ DATABASES = {
         'HOST': '139.9.148.181',
         'PORT': 3306,
     },
-    # 'default': {
-    #     'ENGINE': 'django.db.backends.mysql',
-    #     'NAME': 'ly_report_repair',
-    #     'USER': 'carwin',
-    #     'PASSWORD': 'carwin!@#',
-    #     'HOST': '192.168.2.45',
-    #     'PORT': 3306,
-    # },
+    'default': {
+        'ENGINE': 'django.db.backends.mysql',
+        'NAME': 'ly_report_repair',
+        'USER': 'carwin',
+        'PASSWORD': 'carwin!@#',
+        'HOST': '192.168.2.45',
+        'PORT': 3306,
+    },
     # 'default': {
     #     'ENGINE': 'django.db.backends.mysql',
     #     'NAME': 'baoxiu',
@@ -283,12 +283,6 @@ WEAPP = {
     'message_template_dispatch': 'R7Mhwlep5ZFCJ0ehqc6WP4yveuZ34YFqMz3mVuQay1s',
 }
 #支付宝支付
-ALIPAY_SETTING11 = {
-    'notify_url':'https://baoxiu.zzliaoyuan.com/api/alipay_notify/',
-    'app_id': '2016101202110194',
-    'app_private_key': 'MIIEpQIBAAKCAQEA5X4g9CGSOBOcaA76mibpXq5Cp4jfVLrvdQiQTk9ENPuE7af81Roh4ogXW7EK4Iu6QNPKjmX9AXD4Kj0wlNEzcokdNTlXvAHTkIUKlwLUv+0oFBuBkQPWydP5i2yAw590exGVrMHH4ctSkCgll18DdEOSDhREy6lCoQAOxK5bc+obiQ5+AjgbjwFMoax3NXh9qdpzOjmCX3oiI+Mzhu1tGHoJy/opRA71BZ+ehTHic/0hK/wCasIueRfHShWrPZuIqThSTxFgVEVIUpdmU0q1P6RRDpaqteBLg86asc9YglDZ2F7jnIttwDWma26NhcM8V6v04dCOWjThKt/SCSSlRwIDAQABAoIBAQChwVoW2UbHscLvcYdfegfJjYg7r/TCMxSu5/9WwvYvZg0Wue4ygj3Z/tR/83TYOoRoRx+haO+AwZCZrRF+A0qA83Yb2rQlNyBY3/1L3Vn5gX5bVdvoS81r6rYceLj1qYGfcRCPePKbCwXByBpe7EByBWJ/+/dVmZL2CiVeqgqZ0tYTDBv2t9SLUShI0tARrSN6TZD3pZYI8fx3uv6438BIeZfZSE73lNBRDxZFbnnhFwoheGMrRA6FCMmJekfWQFEQyojLxxwmL7ZLRcOwdJP+qqOufk3NyAA2BBUTUuh13kdildn+HgIjzla5O4u2uPXqtQwDxQWd4hElQxpljtrpAoGBAPihtjcTfidb3oOYZiH6g4xwnKJMWja/g1tutu0FoCyEOv4QI+uWtopSPayOX+pGAtCEqwHYQWqDsxGD9j6TRhvPJ+WGo+dIihNC7GnPf5LYf9kC24vKkNlFXEVaud3O/0vz+LpcCTvr9RPgjX5ZfwIczAEq/EfN6jlUiy0pHt0FAoGBAOxLNy+aEBubm+9TZeJJh/EqbXQPsRlvEpg2UgIVr21j4dmww16At5brtuVooaLhTLNgFSl+/ngxoJfmuLro0B30rzcyKGMZFpMydcXMOyVmVdn4u7CgyHdZFdC2kQcL4tuO24aSxJjYHMHfjacqVYxQWaIIPCQVQ1cOQ6pUi+rbAoGBALsW3Il3Jo+xZq/5Zqkc3A460vKhp6TY2ZxcpFOYzx2QZt+0/4KQh01wcy48eFpOUmHb4t5hf2AKOB3vAcW2hqP4btodRYqNIDE8Q6+fTy0Nsq52owP+6p5DvhoGGiSZVawuqrR4+w3XETTi3TX9XEAXsT8TvIC/pwd64bua3LmNAoGBAN1ukvWp02R7y4JYTgbjz2AB2XZE6jqiavN3HBzWA4JocpKU4lCiIOluVQPgrHA936nM5afwWTl7kDopPX3yhG0+CiCYgV50eUJRrCpC/D5NCzDrtb+MvK+TLS1cmMXYrqv/0NromRF+nFxWSaGYu3h1J7n/K5TI1EU1mdV5y3C3AoGAIsahkI0EHJq/vzYPa1JRMPAQlfQIHBbw4koc6EYx4JMdhVJS4P2d/JqVY0CZ3ODDDPPjmUa7EXwGVPsxn5noA3zcnx5V2uyM5i+EEDeJzTQIkFXPjg9yLJZ35Gc7wzI6nutFJ1HodmWwNSOaGi5/tSQqT1ORaJCDGvbLZ14hyJs=',
-    'alipay_public_key':'MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5X4g9CGSOBOcaA76mibpXq5Cp4jfVLrvdQiQTk9ENPuE7af81Roh4ogXW7EK4Iu6QNPKjmX9AXD4Kj0wlNEzcokdNTlXvAHTkIUKlwLUv+0oFBuBkQPWydP5i2yAw590exGVrMHH4ctSkCgll18DdEOSDhREy6lCoQAOxK5bc+obiQ5+AjgbjwFMoax3NXh9qdpzOjmCX3oiI+Mzhu1tGHoJy/opRA71BZ+ehTHic/0hK/wCasIueRfHShWrPZuIqThSTxFgVEVIUpdmU0q1P6RRDpaqteBLg86asc9YglDZ2F7jnIttwDWma26NhcM8V6v04dCOWjThKt/SCSSlRwIDAQAB',
-}
 ALIPAY_SETTING = {
     'notify_url':'https://baoxiu.zzliaoyuan.com/api/alipay_notify/',
     'app_id': '2021002110695436',

+ 4 - 0
uis/tenant/index.html

@@ -73,6 +73,10 @@
                                 <a lay-href="company/index.html">企业信息</a>
                             </dd>
 
+                            <dd data-name="nav" data-user_type="1">
+                                <a lay-href="invoice/index.html">发票管理</a>
+                            </dd>
+
                             <dd data-name="nav" data-user_type="1">
                                 <a lay-href="device/index.html">设备管理</a>
                             </dd>

+ 88 - 0
uis/tenant/invoice/detail.html

@@ -0,0 +1,88 @@
+<!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">
+        .tenant-li {
+            margin: 10px
+        }
+
+        img {
+            width: 40%;
+            height: 30%;
+            margin-bottom: 20px;
+        }
+        /*企业营业执照样式*/
+        .imgStyle{
+            width: 200px;
+            height: auto;
+        }
+    </style>
+</head>
+<body>
+<div class="layui-card" style="min-height: 400px; padding: 10px" id="tenant_detail"></div>
+<script id="tenant_detail_demo" type="text/html">
+    <div class="layui-tab-item layui-show">
+        <ui>
+            <li class="tenant-li layui-col-md6">
+                <h3>标题:{{ d.title }}</h3>
+            </li>
+            <li class="tenant-li layui-col-md6">
+                <h3>内容:</h3>
+                <div id="content_demo"></div>
+            </li>
+            <li class="tenant-li">
+                <h3>添加人:{{ d.create_user_name }}</h3>
+            </li>
+            <li class="tenant-li">
+                <h3>企业:{{ d.tenant_name }}</h3>
+            </li>
+            <li class="tenant-li">
+                <h3>添加时间:{{ d.create_time }}</h3>
+            </li>
+            <li class="tenant-li">
+                <h3>是否在用:{{ d.enable_text }}</h3>
+            </li>
+            {{# if(d.image){ }}
+            <li class="tenant-li">
+                <h3 style="margin-bottom: 10px">轮播图:</h3>
+                <img src="{{d.image}}" class="imgStyle" />
+            </li>
+            {{# } }}
+        </ui>
+    </div>
+</script>
+
+
+<script src="../../layuiadmin/layui/layui.js"></script>
+
+<script>
+    layui.config({
+        base: '../../../layuiadmin/' //静态资源所在路径
+    }).extend({
+        index: 'lib/index',
+    }).use(['index',  'laytpl'], function () {
+        var $ = layui.$
+            , laytpl = layui.laytpl;
+        var data = JSON.parse(JSON.stringify(parent.layui.table.editdata)); // 框架有Bug所以这么转换
+
+        var getTpl = tenant_detail_demo.innerHTML
+            , tenant_detail = document.getElementById('tenant_detail');
+        laytpl(getTpl).render(data, function (html) {
+            tenant_detail.innerHTML = html;
+        });
+        var dom = document.getElementById("content_demo");
+        if(data.content && dom){
+           dom.innerHTML = data.content;
+        }
+    });
+</script>
+</body>
+</html>

+ 142 - 0
uis/tenant/invoice/edit.html

@@ -0,0 +1,142 @@
+<!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">
+</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-form-item">
+                            <label class="layui-form-label"><font color='red' size="4">*</font>名称:</label>
+                            <div class="layui-input-block">
+                                <input type="text" name="invoice_name" lay-verify="required" placeholder="请输入名称"
+                                       autocomplete="off" class="layui-input">
+                            </div>
+                        </div>
+                        <div class="layui-form-item">
+                            <label class="layui-form-label"><font color='red' size="4">*</font>税号:</label>
+                            <div class="layui-input-block">
+                                <input type="text" name="tax_no" lay-verify="required" placeholder="请输入税号"
+                                       autocomplete="off" class="layui-input">
+                            </div>
+                        </div>
+                        <div class="layui-form-item">
+                            <label class="layui-form-label"><font color='red' size="4">*</font>电话号码:</label>
+                            <div class="layui-input-block">
+                                <input type="text" name="phone_no" lay-verify="required" placeholder="请输入税号"
+                                       autocomplete="off" class="layui-input">
+                            </div>
+                        </div>
+                        <div class="layui-form-item">
+                            <label class="layui-form-label"><font color='red' size="4">*</font>开户银行:</label>
+                            <div class="layui-input-block">
+                                <input type="text" name="deposit_bank" lay-verify="required" placeholder="请输入税号"
+                                       autocomplete="off" class="layui-input">
+                            </div>
+                        </div>
+                        <div class="layui-form-item">
+                            <label class="layui-form-label"><font color='red' size="4">*</font>银行帐户:</label>
+                            <div class="layui-input-block">
+                                <input type="text" name="bank_account" lay-verify="required" placeholder="请输入税号"
+                                       autocomplete="off" class="layui-input">
+                            </div>
+                        </div>
+                        <div class="layui-form-item">
+                            <label class="layui-form-label"><font color='red' size="4">*</font>发票金额:</label>
+                            <div class="layui-input-block">
+                                <input type="text" name="invoice_sum" lay-verify="required" placeholder="请输入税号"
+                                       autocomplete="off" class="layui-input">
+                            </div>
+                        </div>
+                        <div class="layui-form-item">
+                            <label class="layui-form-label"><font color='red' size="4">*</font>收件人:</label>
+                            <div class="layui-input-block">
+                                <input type="text" name="consignee" lay-verify="required" placeholder="请输入税号"
+                                       autocomplete="off" class="layui-input">
+                            </div>
+                        </div>
+                        <div class="layui-form-item">
+                            <label class="layui-form-label"><font color='red' size="4">*</font>收件人电话:</label>
+                            <div class="layui-input-block">
+                                <input type="text" name="consignee_tel" lay-verify="required" placeholder="请输入税号"
+                                       autocomplete="off" class="layui-input">
+                            </div>
+                        </div>
+                        <div class="layui-form-item">
+                            <label class="layui-form-label"><font color='red' size="4">*</font>收件地址:</label>
+                            <div class="layui-input-block">
+                                <input type="text" name="consignee_address" lay-verify="required" placeholder="请输入税号"
+                                       autocomplete="off" class="layui-input">
+                            </div>
+                        </div>
+
+                        <button class="layui-btn" id="id_save" lay-submit lay-filter="component-form-element"
+                                style="display: none">保存
+                        </button>
+                        <button class="layui-btn" type="button" id="upload_image" style="display: none"></button>
+                    </form>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+
+
+<script src="../../layuiadmin/layui/layui.js"></script>
+<script>
+    layui.config({
+        base: '../../../layuiadmin/' //静态资源所在路径
+    }).extend({
+        index: 'lib/index',
+    }).use(['index', 'form', 'utils', 'upload', 'layedit'], function () {
+        var $ = layui.$
+            , admin = layui.admin
+            , upload = layui.upload
+            , layedit = layui.layedit
+            , form = layui.form;
+
+        var id = layui.view.getParameterByName('id');
+
+        form.render(null, 'component-form-element');
+
+        if (id) {
+            var editdata = JSON.parse(JSON.stringify(parent.layui.table.editdata)); // 框架有Bug所以这么转换
+            form.val("component-form-element", editdata);
+        }
+        var url = id ? '/tenant/poster/' + id + '/update_poster/' : '/tenant/poster/',
+            method = id ? 'post' : 'put'
+
+        form.on('submit(component-form-element)', function (data) {
+            //layer.msg(JSON.stringify(data.field));
+            admin.req({
+                url: url
+                , data: data.field
+                , type: method
+                , done: function (res) {
+                    parent.layui.onSubmitChild(res.data);
+                }
+            });
+            return false;
+        });
+
+        parent.layui.submitChild = function () {
+            $("#id_save").click();
+        };
+    });
+</script>
+</body>
+</html>

+ 195 - 0
uis/tenant/invoice/index.html

@@ -0,0 +1,195 @@
+<!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">
+        .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;
+        }
+
+        .seach_items {
+            display: inline-block;
+            margin-right: 5px;
+            margin-top: 5px;
+        }
+    </style>
+</head>
+<body>
+
+<div class="layui-fluid">
+    <div class="layui-card">
+        <div class="layui-card-body" pad15>
+            <div class="layui-row layui-col-space15">
+                <div class="layui-col-md12">
+                    <div class="LAY-btns" style="margin-bottom: 10px;">
+                        <div style="float:left; margin-right: 5px; margin-top: 5px;">
+                            <button class="layui-btn" id="btn_add">
+                                <i class="layui-icon layui-icon-add-circle"></i>申请发票
+                            </button>
+
+                        </div>
+                        <div style="float:right;">
+                            <form class="layui-form" lay-filter="query-form-element">
+                                <div class="seach_items">
+                                    <input type="text" name="title" autocomplete="off" class="layui-input"
+                                           placeholder="标题"/>
+                                </div>
+                                <div class="seach_items">
+                                    <input type="text" name="create_user" autocomplete="off" class="layui-input"
+                                           placeholder="添加人"/>
+                                </div>
+                            </form>
+                        </div>
+                        <div style="clear: both;"></div>
+
+                    </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>
+                        </div>
+                        <div class="layui-btn-group">
+                            <a class="layui-btn layui-btn-xs" lay-event="edit">修改</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', 'upload'], function () {
+        var $ = layui.$
+            , table = layui.table
+            , admin = layui.admin
+            , form = layui.form;
+
+        table.render({
+            elem: '#datagrid'
+            , url: '/tenant/poster/'
+            , cols: [[
+                {field: 'invoice_name', title: '名称', width: 150}
+                ,{field: 'tax_no', title: '税号', width: 150}
+                ,{field: 'company_address', title: '单位地址', width: 150}
+                ,{field: 'phone_no', title: '电话号码', width: 100}
+                ,{field: 'deposit_bank', title: '开户银行', width: 200}
+                ,{field: 'bank_account', title: '银行账户', width: 200}
+                ,{field: 'invoice_sum', title: '发票金额', width: 100}
+                ,{field: 'status_text', title: '状态', width: 100}
+                ,{field: 'use_time', title: '操作时间', width: 200}
+                ,{field: 'reject_reason', title: '说明', width: 100}
+                ,{field: 'consignee', title: '收件人', width: 100}
+                ,{field: 'consignee_tel', title: '收件人电话', width: 100}
+                ,{field: 'consignee_address', title: '收件地址', width: 100}
+                ,{field: 'express_company', title: '快递公司', width: 100}
+                ,{field: 'express_number', title: '快递单号', width: 100}
+                , {title: "操作", width: 150, align: 'left', fixed: 'right', toolbar: '#datagrid-operate-bar'}
+            ]]
+            , page: true
+            , height: 'full-108'
+        });
+        var _params;
+        form.on('submit(query-form-element)', function (data) {
+            //layer.msg(JSON.stringify(data.field));
+            _params = data.field;
+            table.reload('datagrid', {
+                where: data.field
+                , page: {curr: 1}
+            });
+            layer.closeAll();
+            return false;
+        });
+        //监听工具条
+        table.on('tool(datagrid-operate)', function (obj) {
+            var data = obj.data;
+            if (obj.event === 'detail') {
+                table.editdata = data;
+                layer.open({
+                    type: 2,
+                    title: "详情",
+                    shadeClose: false,
+                    area: ['700px', '500px'],
+                    content: 'detail.html'
+                })
+            }else if (obj.event === 'edit') {
+                table.editdata = data;
+                layer.open({
+                    type: 2,
+                    title: '修改',
+                    shadeClose: false,
+                    area: ['50%', '80%'],
+                    btn: ['保存', '取消'],
+                    yes: function (index, dom) {
+                        layui.submitChild();
+                    },
+                    btn2: function (index, layero) {
+                        layer.close(index);//关闭当前按钮
+                    },
+                    content: 'edit.html?id=' + data.id
+                });
+            }
+        });
+
+        $('#btn_add').on('click', function () {
+            layer.open({
+                type: 2,
+                title: '申请发票',
+                shadeClose: false,
+                btn: ['保存', '取消'],
+                area: ['50%', '80%'],
+                yes: function (index, dom) {
+                    layui.submitChild();
+                },
+                btn2: function (index, layero) {
+                    layer.close(index);//关闭当前按钮
+                },
+                content: 'edit.html'
+            });
+        });
+
+    });
+</script>
+</body>
+</html>
+

+ 9 - 9
uis/zzlyadmin/config/index.html

@@ -59,7 +59,7 @@
                     <div class="layui-inline">
                         <label class="layui-form-label">标准版1年费用:</label>
                         <div class="layui-input-inline">
-                            <input type="text" name="edition_1_one_year" lay-verify="required" class="layui-input"
+                            <input type="text" name="edition_1_1_year" lay-verify="required" class="layui-input"
                                    placeholder="整数"/>
                         </div>
                         <div class="layui-form-mid ">元</div>
@@ -67,7 +67,7 @@
                     <div class="layui-inline">
                         <label class="layui-form-label">标准版2年费用:</label>
                         <div class="layui-input-inline">
-                            <input type="text" name="edition_1_two_year" lay-verify="required" class="layui-input"
+                            <input type="text" name="edition_1_2_year" lay-verify="required" class="layui-input"
                                    placeholder="整数"/>
                         </div>
                         <div class="layui-form-mid ">元</div>
@@ -75,7 +75,7 @@
                     <div class="layui-inline">
                         <label class="layui-form-label">标准版3年费用:</label>
                         <div class="layui-input-inline">
-                            <input type="text" name="edition_1_three_year" lay-verify="required" class="layui-input"
+                            <input type="text" name="edition_1_3_year" lay-verify="required" class="layui-input"
                                    placeholder="整数"/>
                         </div>
                         <div class="layui-form-mid ">元</div>
@@ -93,7 +93,7 @@
                     <div class="layui-inline">
                         <label class="layui-form-label">专业版1年费用:</label>
                         <div class="layui-input-inline">
-                            <input type="text" name="edition_2_one_year" lay-verify="required" class="layui-input"
+                            <input type="text" name="edition_2_1_year" lay-verify="required" class="layui-input"
                                    placeholder="整数"/>
                         </div>
                         <div class="layui-form-mid ">元</div>
@@ -101,7 +101,7 @@
                     <div class="layui-inline">
                         <label class="layui-form-label">专业版2年费用:</label>
                         <div class="layui-input-inline">
-                            <input type="text" name="edition_2_two_year" lay-verify="required" class="layui-input"
+                            <input type="text" name="edition_2_2_year" lay-verify="required" class="layui-input"
                                    placeholder="整数"/>
                         </div>
                         <div class="layui-form-mid ">元</div>
@@ -109,7 +109,7 @@
                     <div class="layui-inline">
                         <label class="layui-form-label">专业版3年费用:</label>
                         <div class="layui-input-inline">
-                            <input type="text" name="edition_2_three_year" lay-verify="required" class="layui-input"
+                            <input type="text" name="edition_2_3_year" lay-verify="required" class="layui-input"
                                    placeholder="整数"/>
                         </div>
                         <div class="layui-form-mid ">元</div>
@@ -127,7 +127,7 @@
                     <div class="layui-inline">
                         <label class="layui-form-label">无限版1年费用:</label>
                         <div class="layui-input-inline">
-                            <input type="text" name="edition_3_one_year" lay-verify="required" class="layui-input"
+                            <input type="text" name="edition_3_1_year" lay-verify="required" class="layui-input"
                                    placeholder="整数"/>
                         </div>
                         <div class="layui-form-mid ">元</div>
@@ -135,7 +135,7 @@
                     <div class="layui-inline">
                         <label class="layui-form-label">无限版2年费用:</label>
                         <div class="layui-input-inline">
-                            <input type="text" name="edition_3_two_year" lay-verify="required" class="layui-input"
+                            <input type="text" name="edition_3_2_year" lay-verify="required" class="layui-input"
                                    placeholder="整数"/>
                         </div>
                         <div class="layui-form-mid ">元</div>
@@ -143,7 +143,7 @@
                     <div class="layui-inline">
                         <label class="layui-form-label">无限版3年费用:</label>
                         <div class="layui-input-inline">
-                            <input type="text" name="edition_3_three_year" lay-verify="required" class="layui-input"
+                            <input type="text" name="edition_3_3_year" lay-verify="required" class="layui-input"
                                    placeholder="整数"/>
                         </div>
                         <div class="layui-form-mid ">元</div>