浏览代码

优化用户头像返回地址错误、完善套餐购买接口、新增立即生效与次月生效接口

zhangdongming 3 年之前
父节点
当前提交
90ad469c67

+ 7 - 1
Controller/SensorGateway/GatewayFamilyMemberController.py

@@ -13,6 +13,7 @@ import time
 from django.db import transaction
 from django.views.generic.base import View
 
+from Ansjer.config import SERVER_DOMAIN
 from Controller.SensorGateway.EquipmentFamilyController import EquipmentFamilyView
 from Model.models import UserFamily, FamilyMemberJoin, FamilyMember, SysMsgModel, FamilyMemberPermission, \
     Device_User, FamilyRoomDevice, FamilyRoom
@@ -540,11 +541,16 @@ class GatewayFamilyMemberView(View):
                                                'user__userIconUrl',
                                                'user__phone', 'user__NickName',
                                                'user__username')
+        user_icon_url = ''
+        userIconPath = str(user_family_qs[0]['userIconPath'])
+        if userIconPath and userIconPath.find('static/') != -1:
+            userIconPath = userIconPath.replace('static/', '').replace('\\', '/')
+            user_icon_url = SERVER_DOMAIN + 'account/getAvatar/' + userIconPath
         return response.json(0, {
             'familyId': user_family_qs[0]['id'],
             'userPhone': user_family_qs[0]['user__phone'],
             'nickName': user_family_qs[0]['user__NickName'],
-            'userIconUrl': user_family_qs[0]['user__userIconUrl'],
+            'userIconUrl': user_icon_url,
             'userName': user_family_qs[0]['user__username'],
             'familyName': user_family_qs[0]['name'],
             'userEmail': user_family_qs[0]['user__userEmail'],

+ 96 - 7
Controller/UnicomCombo/UnicomComboController.py

@@ -14,10 +14,12 @@ from django.db import transaction
 from django.http import HttpResponse
 from django.views.generic.base import View
 
-from Model.models import UnicomDeviceInfo, UnicomCombo, Pay_Type, Order_Model, Store_Meal, AiStoreMeal
+from Model.models import UnicomDeviceInfo, UnicomCombo, Pay_Type, Order_Model, Store_Meal, AiStoreMeal, \
+    UnicomComboOrderInfo
 from Object.ResponseObject import ResponseObject
 from Object.TokenObject import TokenObject
 from Object.UnicomObject import UnicomObjeect
+from Object.utils import LocalDateTimeUtil
 from Object.utils.PayUtil import PayService
 from Service.CommonService import CommonService
 
@@ -36,10 +38,13 @@ class UnicomComboView(View):
     def validation(self, request_dict, request, operation):
         if operation == 'buy-notify':
             return self.package_callback_notify(request_dict, request)
-        elif operation == 'alipay-notify':
-            pass
-        elif operation == 'wechat-notify':
-            pass
+        elif operation == 'test-notify':
+            order_id = request_dict.get('orderId', None)
+            activate_type = request_dict.get('activateType', 0)
+            iccid = request_dict.get('iccid', None)
+            combo_id = request_dict.get('comboId', None)
+            self.create_combo_order_info(order_id, int(activate_type), iccid, int(combo_id))
+            return HttpResponse('SUCCESS')
         elif operation == 'device-queue-monitoring':
             return self.device_queue_monitoring_push(request_dict, request)
         elif operation == 'device-status-change':
@@ -205,6 +210,7 @@ class UnicomComboView(View):
                 iccid = request_dict.get('iccid', None)
                 combo_id = request_dict.get('id', None)
                 pay_type = request_dict.get('payType', None)
+                activate_type = request.get('activateType', 0)
                 if not all([iccid, combo_id, pay_type]):
                     return response.json(444)
                 combo_id = int(combo_id)
@@ -234,10 +240,13 @@ class UnicomComboView(View):
                               'updTime': now_time,
                               'unify_combo_id': str(unicom_combo_qs['id']), 'order_type': 2,
                               }
+
+                params = 'lang=cn' + '&activateType=' + activate_type
                 if pay_type == 2:  # 支付宝
                     pay_price = PayService.get_two_float(price, 2)
                     notify_url = 'unicom/wap/pay/ali-notify'
-                    order_dict['pay_url'] = PayService.create_alipay_payment('cn', order_id, pay_price,
+
+                    order_dict['pay_url'] = PayService.create_alipay_payment(params, order_id, pay_price,
                                                                              unicom_combo_qs['combo_name'],
                                                                              notify_url,
                                                                              unicom_combo_qs['remark'], response)
@@ -245,7 +254,8 @@ class UnicomComboView(View):
                 elif pay_type == 3:  # 微信支付
                     notify_url = 'unicom/wap/pay/wechat-notify'
                     ip = CommonService.get_ip_address(request)
-                    order_dict['pay_url'], sign_params = PayService.create_wechat_payment('cn', order_id, price, ip,
+                    order_dict['pay_url'], sign_params = PayService.create_wechat_payment(params, order_id,
+                                                                                          price, ip,
                                                                                           notify_url,
                                                                                           unicom_combo_qs['remark'],
                                                                                           response)
@@ -360,3 +370,82 @@ class UnicomComboView(View):
             print(repr(e))
             r_data = {'success': False, 'msg': '失败'}
             return HttpResponse(json.dumps(r_data, ensure_ascii=False), content_type="application/json,charset=utf-8")
+
+    @classmethod
+    def create_combo_order_info(cls, order_id, activate_type, iccid, combo_id):
+        logger = logging.getLogger('info')
+        logger.info('创建联通订单套餐信息,订单id{}'.format(order_id))
+        try:
+            with transaction.atomic():
+                unicom_combo_qs = UnicomCombo.objects.filter(id=int(combo_id)).values()
+                if unicom_combo_qs.exists():
+                    unicom_combo = unicom_combo_qs.first()
+                    now_time = int(time.time())
+                    combo_order_data = {'iccid': iccid, 'status': 0, 'combo_id': int(combo_id),
+                                        'updated_time': now_time,
+                                        'created_time': now_time}
+                    if order_id:
+                        combo_order_data['order_id'] = order_id
+                    # 有效期类型 1 等于自然月,0天数
+                    if unicom_combo['expiration_type'] == 1:
+                        # 激活类型 1=下月激活 否则等于当月激活
+                        if activate_type == 1:
+                            combo_order_data['next_month_activate'] = True
+                            next_start_time, end_time = cls.get_next_month_data_time()
+                            combo_order_data['activation_time'] = next_start_time
+                            combo_order_data['expire_time'] = end_time
+                        else:
+                            start_time, month_end_time = cls.get_month_start_and_end_time()
+                            combo_order_data['activation_time'] = start_time
+                            combo_order_data['expire_time'] = month_end_time
+                            combo_order_data['status'] = 1
+
+                    elif unicom_combo['expiration_type'] == 0:
+                        days = unicom_combo['expiration_days']
+                        zero_today, end_time = cls.get_data_time(days)
+                        combo_order_data['activation_time'] = zero_today
+                        combo_order_data['expire_time'] = end_time
+                        combo_order_data['status'] = 1
+                    UnicomComboOrderInfo.objects.create(**combo_order_data)
+                    logger.info('保存信息success')
+                return True
+        except Exception as e:
+            print(e)
+            return False
+
+    @staticmethod
+    def get_next_month_data_time():
+        """
+        获取下个月开始时间与结束时间戳
+        @return: next_start_time,end_time
+        """
+        next_month_start = LocalDateTimeUtil.get_next_month_start()
+        next_start_time, next_end_time = LocalDateTimeUtil.get_start_and_end_time(next_month_start, '%Y-%m-%d')
+        next_month_end = LocalDateTimeUtil.get_next_month_end()
+        start_time, end_time = LocalDateTimeUtil.get_start_and_end_time(next_month_end, '%Y-%m-%d')
+        return next_start_time, end_time
+
+    @staticmethod
+    def get_data_time(days):
+        """
+        获取今天开始时间以及days后日期结束时间戳
+        @return: next_start_time,end_time
+        """
+        zero_today, last_today = LocalDateTimeUtil.get_today_date(True)
+        now_time = int(time.time())
+        after_time = LocalDateTimeUtil.get_after_days_timestamp(now_time, days)
+        time_array = time.localtime(after_time)
+        start_time, end_time = LocalDateTimeUtil.get_start_and_end_time(time.strftime("%Y-%m-%d", time_array),
+                                                                        '%Y-%m-%d')
+        return zero_today, end_time
+
+    @staticmethod
+    def get_month_start_and_end_time():
+        """
+        获取当天开始时间与当月结束时间戳
+        @return:
+        """
+        zero_today, last_today = LocalDateTimeUtil.get_today_date(True)
+        month_end = LocalDateTimeUtil.get_cur_month_end()
+        start_time, month_end_time = LocalDateTimeUtil.get_start_and_end_time(month_end, '%Y-%m-%d')
+        return zero_today, month_end_time

+ 14 - 12
Controller/UnicomCombo/UnicomComboPayNotifyController.py

@@ -14,7 +14,8 @@ from django.db import transaction
 from django.http import HttpResponse
 from django.views import View
 
-from Model.models import Order_Model, UnicomDeviceInfo, UnicomComboOrderInfo
+from Controller.UnicomCombo.UnicomComboController import UnicomComboView
+from Model.models import Order_Model, UnicomDeviceInfo
 from Object.AliPayObject import AliPayObject
 from Object.RedisObject import RedisObject
 from Object.WechatPayObject import WechatPayObject
@@ -56,8 +57,8 @@ class UnicomComboPayNotifyView(View):
             re_data = request_dict.dict()
             passback_params = re_data['passback_params']
             params = dict([(k, v[0]) for k, v in parse_qs(unquote(passback_params)).items()])
-            lang = params['lang']
-            logger.info('支付宝异步回调参数:{},携带参数{}', re_data, lang)
+            activate_type = int(params['activateType'])
+            logger.info('支付宝异步回调参数:{},携带参数{}', re_data, params)
             signature = re_data['sign']
             re_data.pop('sign')
             order_id = re_data['out_trade_no']
@@ -83,7 +84,8 @@ class UnicomComboPayNotifyView(View):
             success = alipay.verify(re_data, signature)
             if not success or re_data["trade_status"] not in ("TRADE_SUCCESS", "TRADE_FINISHED"):
                 return HttpResponse('fail')
-            return cls.order_pay_notify(order_id, re_data["trade_no"], notify_key.format(order_id), order_qs, redisObj)
+            return cls.order_pay_notify(order_id, re_data["trade_no"], activate_type, notify_key.format(order_id),
+                                        order_qs, redisObj)
         except Exception as e:
             logger.info('联通套餐订单支付宝支付回调异常:{}'.format(repr(e)))
             redisObj.del_data(key=notify_key.format(order_id))
@@ -101,8 +103,8 @@ class UnicomComboPayNotifyView(View):
             re_data = pay.weixinpay_call_back(request.body)
             attach = re_data["attach"]
             parmap = dict([(k, v[0]) for k, v in parse_qs(unquote(attach)).items()])
-            lang = parmap['lang']
-            logger.info('微信异步回调参数:{},携带参数{}', re_data, lang)
+            activate_type = int(parmap['activateType'])
+            logger.info('微信异步回调参数:{},携带参数{}', re_data, parmap)
             trade_status = re_data['result_code']  # 业务结果  SUCCESS/FAIL
             order_id = re_data['out_trade_no']  # 商户订单号
             order_qs = Order_Model.objects.filter(orderID=order_id)
@@ -129,7 +131,8 @@ class UnicomComboPayNotifyView(View):
             if not isLock:
                 return HttpResponse(pay.xml_to_dict({'return_code': 'FAIL'}))
 
-            return cls.order_pay_notify(order_id, re_data["transaction_id"], notify_key.format(order_id), order_qs,
+            return cls.order_pay_notify(order_id, re_data["transaction_id"], activate_type, notify_key.format(order_id),
+                                        order_qs,
                                         redisObj, True)
         except Exception as e:
             redisObj.del_data(key=notify_key.format(order_id))
@@ -143,11 +146,12 @@ class UnicomComboPayNotifyView(View):
                               </xml>")
 
     @classmethod
-    def order_pay_notify(cls, order_id, trade_no, request_key, order_qs, redisObj, is_wechat_pay=False):
+    def order_pay_notify(cls, order_id, trade_no, activate_type, request_key, order_qs, redisObj, is_wechat_pay=False):
         """
         订单支付通知
         @param trade_no: 第三方交易流水号
         @param order_id:订单编号
+        @param activate_type: 激活类型
         @param request_key:访问缓存key
         @param order_qs:订单对象
         @param redisObj:缓存对象
@@ -165,10 +169,8 @@ class UnicomComboPayNotifyView(View):
             unicom_device_info_qs = UnicomDeviceInfo.objects.filter(serial_no=serial_no).values('iccid')
             if unicom_device_info_qs.exists():
                 iccid = unicom_device_info_qs[0]['iccid']
-                combo_order_data = {'iccid': iccid, 'status': 0, 'order_id': order_id, 'combo_id': int(combo_id),
-                                    'user_id': order_qs[0]['userID_id'], 'updated_time': now_time,
-                                    'created_time': now_time}
-                UnicomComboOrderInfo.objects.create(**combo_order_data)
+                UnicomComboView.create_combo_order_info(order_id, activate_type,
+                                                        iccid, combo_id)
             order_qs.update(trade_no=trade_no, status=1, payTime=now_time, updTime=now_time)
             logger.info('购买联通套餐成功,序列号为:{}'.format(serial_no))
         redisObj.del_data(key=request_key)

+ 3 - 2
Model/models.py

@@ -1222,8 +1222,8 @@ class GatewayPush(models.Model):
     id = models.AutoField(primary_key=True, verbose_name='自增id')
     user_id = models.CharField(default='', max_length=32, verbose_name=u'用户id')
     app_bundle_id = models.CharField(default='', max_length=32, verbose_name=u'app包id')
-    app_type = models.IntegerField(default=0, verbose_name=u'app类型')    # 1: ios, 2: 安卓
-    push_type = models.IntegerField(default=0, verbose_name=u'推送类型')    # 0: apns, 1: 安卓gcm, 2: 极光
+    app_type = models.IntegerField(default=0, verbose_name=u'app类型')  # 1: ios, 2: 安卓
+    push_type = models.IntegerField(default=0, verbose_name=u'推送类型')  # 0: apns, 1: 安卓gcm, 2: 极光
     token_val = models.CharField(default='', max_length=500, verbose_name=u'设备验证令牌')
     m_code = models.CharField(default='', max_length=64, verbose_name='手机唯一标识')
     lang = models.CharField(default='en', max_length=8, verbose_name='推送语言')
@@ -2702,6 +2702,7 @@ class UnicomDeviceInfo(models.Model):
     before_usage_history = models.CharField(blank=True, default='', max_length=32, verbose_name=u'激活前用量历史')
     serial_no = models.CharField(default='', max_length=32, verbose_name=u'设备序列号')
     user_id = models.CharField(blank=True, max_length=32, verbose_name=u'用户id')
+    main_card = models.SmallIntegerField(default=0, verbose_name=u'状态{0:主卡,1:拔插卡}')
     updated_time = models.IntegerField(default=0, verbose_name='更新时间')
     created_time = models.IntegerField(default=0, verbose_name='创建时间')
 

+ 159 - 2
Object/utils/LocalDateTimeUtil.py

@@ -7,9 +7,118 @@
 # @Email   : zhangdongming@asj6.wecom.work
 # @File    : LocalDateTimeUtil.py
 # @Software: PyCharm
+import calendar
 import datetime
 import time
 
+from dateutil.relativedelta import relativedelta
+
+
+def get_cur_month():
+    # 获取当前月
+    return datetime.datetime.now().strftime("%Y-%m")
+
+
+def get_last_month_num(number=1):
+    # 获取前几个月
+    month_date = datetime.datetime.now().date() - relativedelta(months=number)
+    return month_date.strftime("%Y-%m")
+
+
+def get_next_month(number=1):
+    # 获取后几个月
+    month_date = datetime.datetime.now().date() + relativedelta(months=number)
+    return month_date.strftime("%Y-%m")
+
+
+def get_cur_month_start():
+    # 获取当前月的第一天
+    month_str = datetime.datetime.now().strftime('%Y-%m')
+    return '{}-01'.format(month_str)
+
+
+def get_cur_month_end():
+    # 获取当前月的最后一天
+    """
+    param: month_str 月份,2021-04
+    """
+    # return: 格式 %Y-%m-%d
+
+    month_str = datetime.datetime.now().strftime('%Y-%m')
+    year, month = int(month_str.split('-')[0]), int(month_str.split('-')[1])
+    end = calendar.monthrange(year, month)[1]
+    return '{}-{}-{}'.format(year, month, end)
+
+
+def get_last_month_start(month_str=None):
+    # 获取上一个月的第一天
+    """
+    param: month_str 月份,2021-04
+    """
+    # return: 格式 %Y-%m-%d
+    if not month_str:
+        month_str = datetime.datetime.now().strftime('%Y-%m')
+    year, month = int(month_str.split('-')[0]), int(month_str.split('-')[1])
+    if month == 1:
+        year -= 1
+        month = 12
+    else:
+        month -= 1
+    return '{}-{}-01'.format(year, month)
+
+
+def get_next_month_start(month_str=None):
+    # 获取下一个月的第一天
+    """
+    param: month_str 月份,2021-04
+    """
+    # return: 格式 %Y-%m-%d
+    if not month_str:
+        month_str = datetime.datetime.now().strftime('%Y-%m')
+    year, month = int(month_str.split('-')[0]), int(month_str.split('-')[1])
+    if month == 12:
+        year += 1
+        month = 1
+    else:
+        month += 1
+    return '{}-{}-01'.format(year, month)
+
+
+def get_last_month_end(month_str=None):
+    # 获取上一个月的最后一天
+    """
+    param: month_str 月份,2021-04
+    """
+    # return: 格式 %Y-%m-%d
+    if not month_str:
+        month_str = datetime.datetime.now().strftime('%Y-%m')
+    year, month = int(month_str.split('-')[0]), int(month_str.split('-')[1])
+    if month == 1:
+        year -= 1
+        month = 12
+    else:
+        month -= 1
+    end = calendar.monthrange(year, month)[1]
+    return '{}-{}-{}'.format(year, month, end)
+
+
+def get_next_month_end(month_str=None):
+    # 获取下一个月的最后一天
+    """
+    param: month_str 月份,2021-04
+    """
+    # return: 格式 %Y-%m-%d
+    if not month_str:
+        month_str = datetime.datetime.now().strftime('%Y-%m')
+    year, month = int(month_str.split('-')[0]), int(month_str.split('-')[1])
+    if month == 12:
+        year += 1
+        month = 1
+    else:
+        month += 1
+    end = calendar.monthrange(year, month)[1]
+    return '{}-{}-{}'.format(year, month, end)
+
 
 def get_last_first_date_and_last_date(n):
     """
@@ -71,6 +180,21 @@ def get_before_days_timestamp(timestamp, days=1):
     return 0
 
 
+def get_after_days_timestamp(timestamp, days=1):
+    """
+    获取之后日期时间戳-秒级
+    @param timestamp: 时间戳
+    @param days: 天数
+    @return: (timestamp + second * hour * days) 时间戳
+    """
+    if days:
+        second = 3600
+        hour = 24
+        if days > 0:
+            return timestamp + second * hour * days
+    return 0
+
+
 def date_to_week(str_date):
     """
     日期获取星期几
@@ -110,10 +234,43 @@ def get_start_and_end_time(date, str_format):
     return 0
 
 
-if __name__ == "__main__":
+if __name__ == '__main__':
+    zero_today, last_today = get_today_date(True)
+    month_end = get_cur_month_end()
+    start_time, month_end_time = get_start_and_end_time(month_end, '%Y-%m-%d')
+    print(zero_today)
+    print(month_end_time)
+
+
+    # # 获取当前月
+    # print('当前月', get_cur_month())
+    # # 获取上一个月
+    # print('上一个月', get_last_month_num())
+    # # 获取上两个月
+    # print('上两个月', get_last_month_num(number=2))
+    # # 获取下一个月
+    # print('下一个月', get_next_month())
+    # # 获取下两个月
+    # print('下两个月', get_next_month(number=2))
+    # # 获取当前月的第一天
+    # print('当前月的第一天', get_cur_month_start())
+    # # 获取当前月的最后一天
+    # print('当前月的最后一天', get_cur_month_end())
+    # # 获取上个月的第一天
+    # print('上个月的第一天', get_last_month_start())
+    # # 获取下个月的第一天
+    # print('下个月的第一天', get_next_month_start())
+    # # 获取上个月的最后一天
+    # print('上个月的最后一天', get_last_month_end())
+    # # 获取下个月的最后一天
+    # print('下个月的最后一天', get_next_month_end())
     dd = str(1650791368303)
     print(dd[0:10])
     print(dd[10:])
     dateArray = datetime.datetime.utcfromtimestamp(1650791368)
     print(dateArray.date())
-    print(get_start_and_end_time('20220317', '%Y%m%d'))
+    next_start_time, next_end_time = get_start_and_end_time(get_next_month_start(), '%Y-%m-%d')
+    print(type(next_end_time))
+    print('下月开始时间{}'.format(next_start_time))
+    start_time, end_time = get_start_and_end_time(get_next_month_end(), '%Y-%m-%d')
+    print('下月结束时间{}'.format(end_time))

+ 26 - 4
Object/utils/PayUtil.py

@@ -20,7 +20,18 @@ from Object.WechatPayObject import WechatPayObject
 class PayService:
 
     @staticmethod
-    def create_alipay_payment(lang, order_id, price, title, notify_url, content, response):
+    def create_alipay_payment(passback_params, order_id, price, title, notify_url, content, response):
+        """
+        创建支付宝支付
+        @param passback_params: 携带参数支付宝回调原样返回
+        @param order_id: 订单编号
+        @param price: 价格
+        @param title: 标题
+        @param notify_url: 异步回调通知URL
+        @param content: 内容
+        @param response: 响应结果
+        @return: 网站支付链接
+        """
         aliPayObj = AliPayObject()
         alipay = aliPayObj.conf()
         subject = title + content
@@ -31,18 +42,29 @@ class PayService:
             return_url="{}web/paid2/success.html".format(SERVER_DOMAIN_SSL),
             notify_url="{}{}".format(SERVER_DOMAIN_SSL, notify_url),
             quit_url="{}web/paid2/fail.html".format(SERVER_DOMAIN_SSL),
-            passback_params=quote("lang=" + lang)
+            passback_params=quote(passback_params)
         )
         if not order_string:
             return response.json(10, '生成订单错误.')
         return aliPayObj.alipay_prefix + order_string
 
     @staticmethod
-    def create_wechat_payment(lang, order_id, price, ip, notify_url, content, response):
+    def create_wechat_payment(attach, order_id, price, ip, notify_url, content, response):
+        """
+        创建微信支付
+        @param attach: 参数微信回调通知原样返回
+        @param order_id: 订单编号
+        @param price: 价格
+        @param ip: 用户支付ip地址
+        @param notify_url: 异步通知回调URL
+        @param content: 内容
+        @param response: 响应结果
+        @return: 网站支付链接
+        """
         notify_url = "{}{}".format(SERVER_DOMAIN_SSL, notify_url)
         pay = WechatPayObject()
         # 统一调用接口
-        pay.get_parameter(order_id, content, float(price) * 100, ip, notify_url, quote("lang=" + lang))
+        pay.get_parameter(order_id, content, float(price) * 100, ip, notify_url, quote(attach))
         sign_params = pay.re_finall(orderid=order_id)
         if not sign_params:
             return response.json(10, '生成订单错误.')