jiaweiqi hace 3 años
padre
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_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:
         db_table = "wechat_applet"
         ordering = ['-id']
@@ -55,6 +60,7 @@ class WechatApplet(models.Model):
         self.save()
 
     def generateActivityCode(self, customer_id, activity_id):
+        '''生成海报二维码'''
         filename = "{}{}_{}.png".format("activiytCode/", activity_id, customer_id)
         full_filename = "{}/{}".format(settings.MEDIA_ROOT, filename)
         if os.path.exists(full_filename):
@@ -71,3 +77,24 @@ class WechatApplet(models.Model):
         page = 'pages/index/index'
         filename = WeChat.getActivityWXappCode(self.getAccessToken(), page, activity_id)
         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):
-        # 解冻剩余资金  如果由于客户或其他原因 无法完成分账  就手动解除资金冻结
+        # 解冻剩余资金 默认资金冻结30天 如果由于客户或其他原因 无法完成分账  就手动解除资金冻结
         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:
             self.splictAccountQuery(spc, pay.no, self.no, spd)
 
@@ -122,6 +115,9 @@ class SplitAccount(models.Model):
 
             if spd.status == SplitAccountDetail.PENDING:
                 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)
         # 分账申请
@@ -183,14 +179,12 @@ class SplitAccount(models.Model):
                 detail.save()
 
     def splitAccount(self, app, spd, spr, pay):
+        '''自动分账  支付成功后自动分账'''
         if pay.status != Pay.CONFIRM:
             return
         if spd.status != SplitAccountDetail.DEFAULT:
             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:
             add = spc.splitaccount_addreceiver(spr.account)
@@ -307,6 +301,9 @@ class SplitAccountReceiver(models.Model):
         verbose_name = u"分账接收人"
         ordering = ('-id',)
         index_together = ('account', 'status', )
+        unique_together = (
+            'account',
+        )
         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'^order/data/$', order_list),
+    url(r'^order/split_account/$', order_split_account),
 
     url(r'^coupon/data/$', coupon_list),
     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)
 
 
+@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
 @login_required()
 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.customer.order.serializers import OrderSerializer, ActivityOrderSerializer
 from apps.activity.models import Activity, Order, Pay
+from apps.activity.base import OrderUpdate
 from apps.WechatApplet.models import WechatApplet
 from apps.activity.filters import OrderFilter
 
@@ -32,6 +33,15 @@ class OrderViewSet(ModelViewSet):
         f = OrderFilter(self.request.GET, queryset=queryset)
         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):
         try:
             with transaction.atomic():

+ 1 - 1
apps/dashboard/urls.py

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

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


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

@@ -147,15 +147,15 @@
                 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(){

+ 1 - 0
util/wechatpay.py

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