""" 小程序/微信系统配置 — 优先读数据库 XcxSysPeizhi,空则回退 settings.py(兼容旧部署)。 """ import logging from decimal import Decimal from django.conf import settings from django.core.cache import cache logger = logging.getLogger(__name__) _CACHE_KEY = 'xcx_sys_peizhi_row_v1' _CACHE_TTL = 120 def clear_xcx_sys_peizhi_cache(): cache.delete(_CACHE_KEY) def _load_row(): cached = cache.get(_CACHE_KEY) if cached is not _CACHE_NONE and cached is not None: return cached try: from peizhi.models import XcxSysPeizhi row = XcxSysPeizhi.objects.first() except Exception as e: logger.warning('读取 XcxSysPeizhi 失败,使用 settings 回退: %s', e) row = None cache.set(_CACHE_KEY, row if row else _CACHE_NONE, _CACHE_TTL) return row if row else None _CACHE_NONE = object() def _val(db_attr, settings_attr, default=None): row = _load_row() if row is not None: v = getattr(row, db_attr, None) if v is not None and v != '': return v if settings_attr: v = getattr(settings, settings_attr, default) return v if v is not None and v != '' else default return default class WxConfig: """微信/小程序配置代理(属性名与 settings 保持一致,便于渐进替换)""" @property def WEIXIN_APPID(self): return _val('weixin_appid', 'WEIXIN_APPID', '') @property def WEIXIN_SECRET(self): return _val('weixin_secret', 'WEIXIN_SECRET', '') @property def WEIXIN_OFFICIAL_APPID(self): return _val('weixin_official_appid', 'WEIXIN_OFFICIAL_APPID', '') @property def WEIXIN_OFFICIAL_SECRET(self): return _val('weixin_official_secret', 'WEIXIN_OFFICIAL_SECRET', '') @property def WEIXIN_OFFICIAL_TOKEN(self): return _val('weixin_official_token', 'WEIXIN_OFFICIAL_TOKEN', '') @property def WEIXIN_OFFICIAL_ENCODING_AES_KEY(self): return _val('weixin_official_encoding_aes_key', 'WEIXIN_OFFICIAL_ENCODING_AES_KEY', '') @property def WEIXIN_TEMPLATE_ID(self): return _val('weixin_template_id', 'WEIXIN_TEMPLATE_ID', '') @property def WEIXIN_TEMPLATE_MAX_PER_MINUTE(self): return _val('weixin_template_max_per_minute', 'WEIXIN_TEMPLATE_MAX_PER_MINUTE', 950) @property def WEIXIN_TEMPLATE_BATCH_SIZE(self): return _val('weixin_template_batch_size', 'WEIXIN_TEMPLATE_BATCH_SIZE', 100) @property def WEIXIN_BROADCAST_ENABLED(self): row = _load_row() if row is not None: return bool(row.weixin_broadcast_enabled) return getattr(settings, 'WEIXIN_BROADCAST_ENABLED', True) @property def WEIXIN_BROADCAST_WORKERS(self): return _val('weixin_broadcast_workers', 'WEIXIN_BROADCAST_WORKERS', 30) @property def WEIXIN_MCHID(self): return _val('weixin_mchid', 'WEIXIN_MCHID', '') @property def WEIXIN_SHANGHUMIYAO(self): return _val('weixin_shanghu_miyao', 'WEIXIN_SHANGHUMIYAO', '') @property def WEIXIN_NOTIFY_URL(self): return _val('weixin_notify_url', 'WEIXIN_NOTIFY_URL', '') @property def WEIXIN_CERT_PATH(self): return _val('weixin_cert_path', 'WEIXIN_CERT_PATH', '') @property def WEIXIN_KEY_PATH(self): return _val('weixin_key_path', 'WEIXIN_KEY_PATH', '') @property def NOTIFY_BASE_URL(self): return _val('notify_base_url', None, 'https://wenhe.nmslb.com/hqhd').rstrip('/') @property def SHANGPIN_SHENHE_MODE(self): row = _load_row() if row is not None and row.shangpin_shenhe_mode in (1, 2): return int(row.shangpin_shenhe_mode) return 2 @property def SHANGJIA_PAIFA_JIAGE_MIN(self): row = _load_row() if row is not None and row.shangjia_paifa_jiage_min is not None: return row.shangjia_paifa_jiage_min return Decimal('10') @property def SHANGJIA_PAIFA_JIAGE_MAX(self): row = _load_row() if row is not None and row.shangjia_paifa_jiage_max is not None: return row.shangjia_paifa_jiage_max return Decimal('10000') @property def SHANGJIA_PAIFA_YAJIN_MIN(self): row = _load_row() if row is not None and getattr(row, 'shangjia_paifa_yajin_min', None) is not None: return row.shangjia_paifa_yajin_min return Decimal('0.10') @property def SHANGJIA_PAIFA_YAJIN_MAX(self): row = _load_row() if row is not None and getattr(row, 'shangjia_paifa_yajin_max', None) is not None: return row.shangjia_paifa_yajin_max return Decimal('10000') wx_cfg = WxConfig() def get_shangpin_shenhe_zhuangtai(): """点单页商品接口筛选 shenhezhuangtai:1=正常,2=审核专用""" return wx_cfg.SHANGPIN_SHENHE_MODE