'json' ]; // 追加属性 protected $append = [ 'status_text', 'charge_rate_format', 'withdraw_info_hidden', 'withdraw_info_display', 'is_madow_withdraw', 'withdraw_type_text', 'wechat_transfer_state_text', ]; // 微信商家转账状态 const WECHAT_TRANSFER_STATE = [ 'ACCEPTED' => '单据已受理,请稍等', 'PROCESSING' => '单据处理中,请稍等', 'SUCCESS' => '转账成功', 'FAIL' => '转账失败', 'CANCELING' => '单据撤销中', 'CANCELLED' => '单据已撤销', 'WAIT_USER_CONFIRM' => '待收款用户确认', 'TRANSFERING' => '转账中', 'NOT_FOUND' => '未申请微信提现', ]; // 可以安全退还佣金的状态 const CAN_CANCEL_STATE = [ 'FAIL', 'WAIT_USER_CONFIRM', 'CANCELLED' ]; public function statusList() { return [ -3 => '撤销提现', -2 => '提现失败', -1 => '已拒绝', 0 => '待审核', 1 => '处理中', 2 => '已处理' ]; } public function withdrawTypeList() { return [ 'wechat' => '微信零钱', 'alipay' => '支付宝账户', 'bank' => '银行卡', ]; } /** * 类型获取器 */ public function getWithdrawTypeTextAttr($value, $data) { $value = $value ?: ($data['withdraw_type'] ?? null); $list = $this->withdrawTypeList(); return isset($list[$value]) ? $list[$value] : ''; } public function getWechatTransferStateTextAttr($value, $data) { $value = $value ?: ($data['wechat_transfer_state'] ?? null); $list = self::WECHAT_TRANSFER_STATE; return isset($list[$value]) ? $list[$value] : $value; } public function getChargeRateFormatAttr($value, $data) { $value = $value ?: ($data['charge_rate'] ?? null); return bcmul((string)$value, '100', 1) . '%'; } public function getIsMadowWithdrawAttr($value, $data) { $info = $this->withdraw_info ?? ($data['withdraw_info'] ?? null); if (is_string($info)) { $info = json_decode($info, true) ?: []; } if (!is_array($info)) { return false; } return (isset($info['wallet_type']) && $info['wallet_type'] === 'madow') || (isset($info['提现资产']) && strcasecmp($info['提现资产'], 'dmepa') === 0); } public function getWithdrawInfoDisplayAttr($value, $data) { $info = $this->withdraw_info ?? ($data['withdraw_info'] ?? null); if (is_string($info)) { $info = json_decode($info, true) ?: []; } if (!is_array($info)) { return []; } $display = []; $isMadow = (isset($info['wallet_type']) && $info['wallet_type'] === 'madow') || (isset($info['提现资产']) && strcasecmp($info['提现资产'], 'dmepa') === 0); if ($isMadow) { $display['提现资产'] = 'DMEPA'; // 扣除 DMEPA $madowAmount = $info['madow_amount'] ?? ($info['扣除DMEPA'] ?? ($info['扣除dmepa'] ?? null)); if ($madowAmount !== null) { $madowClean = trim(str_ireplace(['dmepa', ' '], '', (string)$madowAmount)); $display['扣除DMEPA'] = $madowClean . ' DMEPA'; } // 市值汇率 $rate = $info['rate'] ?? ($info['市值汇率'] ?? ($info['折算汇率'] ?? null)); if ($rate !== null) { if (is_numeric($rate)) { $rateClean = rtrim(rtrim(number_format((float)$rate, 12, '.', ''), '0'), '.'); $display['市值汇率'] = '1 DMEPA ≈ ' . $rateClean . ' 元'; } else { $rateStr = (string)$rate; $rateClean = trim(str_replace(['1 DMEPA ≈', '元/dmepa', '元/DMEPA', '元', ' '], '', $rateStr)); $display['市值汇率'] = '1 DMEPA ≈ ' . $rateClean . ' 元'; } } // 换算市值 $marketValue = $info['换算市值'] ?? ($data['amount'] ?? ($this->amount ?? null)); if ($marketValue !== null) { $valClean = trim(str_replace(['元', ' '], '', (string)$marketValue)); $display['换算市值'] = number_format((float)$valClean, 2, '.', '') . ' 元'; } } // 填充银行卡或其它常规账户信息,并过滤英文底层键 $excludeKeys = ['wallet_type', 'madow_amount', 'rate', '提现资产', '扣除DMEPA', '扣除dmepa', '市值汇率', '折算汇率', '换算市值']; foreach ($info as $k => $v) { if (!in_array($k, $excludeKeys)) { $display[$k] = $v; } } return $display; } public function getWithdrawInfoHiddenAttr($value, $data) { $withdraw_info = $value ?: ($this->withdraw_info ?? null); if (is_string($withdraw_info)) { $withdraw_info = json_decode($withdraw_info, true) ?: []; } if (!is_array($withdraw_info)) { return []; } foreach ($withdraw_info as $key => &$info) { if (in_array($key, ['微信用户', '真实姓名'])) { $info = string_hide($info, 2); } elseif (in_array($key, ['银行卡号', '支付宝账户', '微信ID'])) { $info = account_hide($info); } } return $withdraw_info; } public function user() { return $this->belongsTo(User::class, 'user_id', 'id')->field('id, nickname, avatar, total_consume'); } }