jiaweiqi 3 years ago
parent
commit
3a80a690d5

+ 27 - 0
apps/WechatApplet/models.py

@@ -21,6 +21,11 @@ class WechatApplet(models.Model):
     agent_num = models.CharField(max_length=512, verbose_name=u'商户号', default="")
     agent_num = models.CharField(max_length=512, verbose_name=u'商户号', default="")
     agent_key = models.CharField(max_length=512, verbose_name=u'商户密钥', default="")
     agent_key = models.CharField(max_length=512, verbose_name=u'商户密钥', default="")
 
 
+    private_key = models.CharField(max_length=512, verbose_name=u'商户证书私钥', default="")
+    cert_serial_no = models.CharField(max_length=512, verbose_name=u'商户证书序列号', default="")
+    apiv3_key = models.CharField(max_length=512, verbose_name=u'商户APIv3密钥', default="")
+    cert_dir = models.CharField(max_length=100, verbose_name=u'平台证书存放目录', default="")
+
     class Meta:
     class Meta:
         db_table = "wechat_applet"
         db_table = "wechat_applet"
         ordering = ['-id']
         ordering = ['-id']
@@ -55,6 +60,7 @@ class WechatApplet(models.Model):
         self.save()
         self.save()
 
 
     def generateActivityCode(self, customer_id, activity_id):
     def generateActivityCode(self, customer_id, activity_id):
+        '''生成海报二维码'''
         filename = "{}{}_{}.png".format("activiytCode/", activity_id, customer_id)
         filename = "{}{}_{}.png".format("activiytCode/", activity_id, customer_id)
         full_filename = "{}/{}".format(settings.MEDIA_ROOT, filename)
         full_filename = "{}/{}".format(settings.MEDIA_ROOT, filename)
         if os.path.exists(full_filename):
         if os.path.exists(full_filename):
@@ -71,3 +77,24 @@ class WechatApplet(models.Model):
         page = 'pages/index/index'
         page = 'pages/index/index'
         filename = WeChat.getActivityWXappCode(self.getAccessToken(), page, activity_id)
         filename = WeChat.getActivityWXappCode(self.getAccessToken(), page, activity_id)
         return filename
         return filename
+
+    # def getMsgTemplateId(self, title):
+    #     templates = WeChat.getTemplateList(self.getAccessToken())
+    #     for template in templates:
+    #         if template['title'] == title:
+    #             return template['priTmplId']
+    #     return ''
+    #
+    # def sendPayOrderMsg(self, openid, msg_data):
+    #     template_id = self.getMsgTemplateId('订单支付成功通知')
+    #     if not template_id:
+    #         return
+    #     data = {
+    #         'date3':{'value':msg_data['pay_time'].strftime('%Y-%m-%d %H:%M:%S')},
+    #         'phrase4': {'value': msg_data['payment']},
+    #         'character_string5': {'value': msg_data['no']},
+    #         'amount2':{'value': msg_data['pay_amount']},
+    #         'thing7':{'value': msg_data['tips']},
+    #     }
+    #     page = 'pages/order/order?value=1'
+    #     WeChat.sendSubscribeMessage(self.getAccessToken(), openid, template_id, page, data)

+ 12 - 15
apps/activity/models.py

@@ -100,20 +100,13 @@ class SplitAccount(models.Model):
 
 
 
 
     def unfreezeAccount(self):
     def unfreezeAccount(self):
-        # 解冻剩余资金  如果由于客户或其他原因 无法完成分账  就手动解除资金冻结
+        # 解冻剩余资金 默认资金冻结30天 如果由于客户或其他原因 无法完成分账  就手动解除资金冻结
         pass
         pass
 
 
-    def handSplitAccont(self, spd, spr, pay, app):
+    def handSplitAccont(self, spd, pay, app):
         '''手动申请分账(在自动申请分账失败后  手动申请分账)'''
         '''手动申请分账(在自动申请分账失败后  手动申请分账)'''
-        if pay.status != Pay.CONFIRM:
-            raise CustomError(u'该订单未完成付款,无法分账!')
-        if spd.status == SplitAccountDetail.SUCCESS:
-            raise CustomError(u'该分账已成功,禁止重复申请!')
-        private_key = ''
-        cert_serial_no = ''
-        apiv3_key = ''
-        spc = SplitAccountFuc(app.authorizer_appid, app.agent_num, private_key, cert_serial_no, apiv3_key, cert_dir=None, proxy=None)
-        # 状态是"待分账" 的查询分账
+        spc = SplitAccountFuc(app.authorizer_appid, app.agent_num, app.private_key, app.cert_serial_no, app.apiv3_key, cert_dir=app.cert_dir, proxy=None)
+        # 状态是"待分账" 的查询分账  (状态是默认的怎么处理?没有申请过的  查询分账结果会报错--如果返回错误信息根据错误信息 如果没有发现该订单就重新申请  其他原因就不再申请)
         if spd.status == SplitAccountDetail.PENDING:
         if spd.status == SplitAccountDetail.PENDING:
             self.splictAccountQuery(spc, pay.no, self.no, spd)
             self.splictAccountQuery(spc, pay.no, self.no, spd)
 
 
@@ -122,6 +115,9 @@ class SplitAccount(models.Model):
 
 
             if spd.status == SplitAccountDetail.PENDING:
             if spd.status == SplitAccountDetail.PENDING:
                 raise CustomError(u'该分账正在处理!')
                 raise CustomError(u'该分账正在处理!')
+        spr = SplitAccountReceiver.objects.filter(account=spd.account).first()
+        if not spr:
+            spr = SplitAccountReceiver.objects.create(account=spd.account)
         # 添加分账接收人
         # 添加分账接收人
         self.splictAccountAddReceiver(spc, spr)
         self.splictAccountAddReceiver(spc, spr)
         # 分账申请
         # 分账申请
@@ -183,14 +179,12 @@ class SplitAccount(models.Model):
                 detail.save()
                 detail.save()
 
 
     def splitAccount(self, app, spd, spr, pay):
     def splitAccount(self, app, spd, spr, pay):
+        '''自动分账  支付成功后自动分账'''
         if pay.status != Pay.CONFIRM:
         if pay.status != Pay.CONFIRM:
             return
             return
         if spd.status != SplitAccountDetail.DEFAULT:
         if spd.status != SplitAccountDetail.DEFAULT:
             return
             return
-        private_key = ''
-        cert_serial_no = ''
-        apiv3_key = ''
-        spc = SplitAccountFuc(app.authorizer_appid, app.agent_num, private_key, cert_serial_no, apiv3_key, cert_dir=None, proxy=None)
+        spc = SplitAccountFuc(app.authorizer_appid, app.agent_num, app.private_key, app.cert_serial_no, app.apiv3_key, cert_dir=app.cert_dir, proxy=None)
 
 
         if spr.status != SplitAccountReceiver.ADD:
         if spr.status != SplitAccountReceiver.ADD:
             add = spc.splitaccount_addreceiver(spr.account)
             add = spc.splitaccount_addreceiver(spr.account)
@@ -307,6 +301,9 @@ class SplitAccountReceiver(models.Model):
         verbose_name = u"分账接收人"
         verbose_name = u"分账接收人"
         ordering = ('-id',)
         ordering = ('-id',)
         index_together = ('account', 'status', )
         index_together = ('account', 'status', )
+        unique_together = (
+            'account',
+        )
         default_permissions = ()
         default_permissions = ()
 
 
 
 

+ 1 - 0
apps/activity/urls.py

@@ -13,6 +13,7 @@ urlpatterns = (
     url(r'^member_coupon/cancel_write_off/$', coupon_cancel_write_off),
     url(r'^member_coupon/cancel_write_off/$', coupon_cancel_write_off),
 
 
     url(r'^order/data/$', order_list),
     url(r'^order/data/$', order_list),
+    url(r'^order/split_account/$', order_split_account),
 
 
     url(r'^coupon/data/$', coupon_list),
     url(r'^coupon/data/$', coupon_list),
     url(r'^coupon/save/$', coupon_save),
     url(r'^coupon/save/$', coupon_save),

+ 33 - 0
apps/activity/views.py

@@ -139,6 +139,39 @@ def order_list(request):
     return DataGridJSONResponse(serializer.data, total, more)
     return DataGridJSONResponse(serializer.data, total, more)
 
 
 
 
+@token_required
+@login_required()
+def order_split_account(request):
+    id = request.GET.get('id')
+
+    try:
+        order = Order.objects.filter(id=id).first()
+        if not order:
+            raise CustomError(u'未找到相应的订单')
+        if not order.pay or order.pay.status != Pay.CONFIRM:
+            raise CustomError(u'该订单尚未支付,无法分账!')
+        if not order.splitaccount:
+            raise CustomError(u'该订单不需要分账')
+        sp = order.splitaccount
+        spd = SplitAccountDetail.objects.filter(main=sp).first()
+        if not spd:
+            raise CustomError(u'未找到相应的分账明细!')
+        if spd.status == SplitAccountDetail.SUCCESS:
+            raise CustomError(u'该订单已分账,禁止重复申请!')
+        app = WechatApplet.objects.filter().first()
+        if not app:
+            raise CustomError(u'未设置小程序信息!')
+        with transaction.atomic():
+            order.splitaccount.handSplitAccont(spd, order.pay, app)
+            BizLog.objects.addnew(request.user, BizLog.INSERT, u"订单申请分账,id=%d" % order.id)
+    except CustomError as e:
+        return JSONError(e.get_error_msg())
+    except Exception as e:
+        traceback.print_exc()
+        return JSONError(u'订单分账申请失败!')
+    return JSONResponse()
+
+
 @token_required
 @token_required
 @login_required()
 @login_required()
 def coupon_list(request):
 def coupon_list(request):

+ 10 - 0
apps/customer/order/views.py

@@ -18,6 +18,7 @@ from util.exceptions import CustomError
 from apps.foundation.models import BizLog
 from apps.foundation.models import BizLog
 from apps.customer.order.serializers import OrderSerializer, ActivityOrderSerializer
 from apps.customer.order.serializers import OrderSerializer, ActivityOrderSerializer
 from apps.activity.models import Activity, Order, Pay
 from apps.activity.models import Activity, Order, Pay
+from apps.activity.base import OrderUpdate
 from apps.WechatApplet.models import WechatApplet
 from apps.WechatApplet.models import WechatApplet
 from apps.activity.filters import OrderFilter
 from apps.activity.filters import OrderFilter
 
 
@@ -32,6 +33,15 @@ class OrderViewSet(ModelViewSet):
         f = OrderFilter(self.request.GET, queryset=queryset)
         f = OrderFilter(self.request.GET, queryset=queryset)
         return f.qs
         return f.qs
 
 
+    def list(self, request, *args, **kwargs):
+        try:
+            # 获取订单前更新订单状态
+            OrderUpdate.update_status()
+            data = super(OrderViewSet, self).list(request)
+        except NotFound:
+            return response_ok([])
+        return data
+
     def create(self, request, *args, **kwargs):
     def create(self, request, *args, **kwargs):
         try:
         try:
             with transaction.atomic():
             with transaction.atomic():

+ 1 - 1
apps/dashboard/urls.py

@@ -2,7 +2,7 @@
 
 
 from django.conf.urls import url
 from django.conf.urls import url
 
 
-from views import *
+from .views import *
 
 
 urlpatterns = (
 urlpatterns = (
 
 

+ 0 - 0
apps/foundation/migrations/__init__.py


+ 9 - 9
uis/views/order/index.html

@@ -147,15 +147,15 @@
                 return false;
                 return false;
          }
          }
 
 
-        //  layer.confirm('确定要分账吗?', function (index) {
-        //     layer.close(index);
-        //     layui.admin.req({
-        //         url: '/activity/activity/delete/?id=' + data.id
-        //         , done: function (res) {
-        //             table.reload('datagrid', {});
-        //         }
-        //     });
-        // });
+          layer.confirm('确定要分账吗?', function (index) {
+             layer.close(index);
+             layui.admin.req({
+                 url: '/activity/order/split_account/?id=' + data.id
+                 , done: function (res) {
+                     table.reload('datagrid', {});
+                 }
+             });
+        });
     });
     });
 
 
     $('#btn_query').on('click', function(){
     $('#btn_query').on('click', function(){

+ 1 - 0
util/wechatpay.py

@@ -155,6 +155,7 @@ class SplitAccountFuc(object):
                 data['receivers'] = result.get('receivers')
                 data['receivers'] = result.get('receivers')
             else:
             else:
                 success = False
                 success = False
+                # data = result.get('code')
                 BizLog.objects.addnew('', BizLog.INSERT, u'[%s]查询分账结果失败!原因:' % out_order_no + result.get('code'))
                 BizLog.objects.addnew('', BizLog.INSERT, u'[%s]查询分账结果失败!原因:' % out_order_no + result.get('code'))
         except CustomError as e:
         except CustomError as e:
             success = False
             success = False