20], ]; } /** * {@inheritdoc} */ public function attributeLabels() { return [ 'id' => 'ID', 'mall_id' => '商城ID', 'pay_type' => '支付方式', 'total_pay_money' => '支付金额', 'month' => '月份', 'status' => '状态[-1:删除;0:禁用;1启用;]', 'created_at' => '创建时间', 'updated_at' => '上次更新数据时间', ]; } public static function setData($params) { try { if (empty($params['mall_id']) && empty($params['month']) && empty($params['pay_type'])) { return false; } $model = self::findOne(['mall_id' => $params['mall_id'], 'month' => $params['month'], 'pay_type' => $params['pay_type'], 'status' => [StatusEnum::ENABLED, StatusEnum::DISABLED]]); if (empty($model)) { $model = new self(); $model->mall_id = $params['mall_id']; $model->month = $params['month']; $model->pay_type = $params['pay_type']; $model->loadDefaultValues(); if (!empty($params['total_pay_money'])) $model->total_pay_money += $params['total_pay_money']; if (!$model->save()) throw new \Exception($model->getErrorMessage()); } else { Yii::$app->db->createCommand()->update(self::tableName(), ['total_pay_money' => new Expression('total_pay_money+' . ($params['total_pay_money'] ?? 0))], ['id' => $model->id] )->execute(); } return true; } catch (\Exception $e) { Yii::$app->custom->logs('计数错误:' . $e->getMessage()); self::$static_error = $e->getMessage(); return false; } } /** * 保存退款金额 */ public static function setRefundMoney($params) { try { // 增强输入验证 if (empty($params['mall_id']) || empty($params['month'])) { return false; } // 查找现有模型 $model = self::findOne([ 'mall_id' => $params['mall_id'], 'month' => $params['month'], 'pay_type' => $params['pay_type'], 'status' => [StatusEnum::ENABLED, StatusEnum::DISABLED] ]); if (!empty($params['is_initial']) && empty($model)) { // 如果是初始化,切数据不存在,直接返回 return true; } if (empty($model)) { $model = new self(); $model->mall_id = $params['mall_id']; $model->month = $params['month']; $model->pay_type = $params['pay_type']; $model->loadDefaultValues(); // 如果保存失败,抛出异常 if (!$model->save()) { throw new \Exception($model->getErrorMessage()); } } // 使用参数化查询来防止 SQL 注入 if (!empty($params['total_refund_money'])) { $command = Yii::$app->db->createCommand() ->update(self::tableName(), [ 'total_refund_money' => new Expression('total_refund_money + :amount'), 'updated_at' => time() ], ['id' => $model->id]) ->bindValue(':amount', $params['total_refund_money'] ?? 0); $command->execute(); } return true; } catch (\Exception $e) { // 记录错误日志 Yii::$app->custom->logs('统计退款金额失败:' . $e->getMessage()); return false; } } public static function getCensusMallCache($mall_id, $month) { $data = []; $list = self::lists(['where' => [['mall_id' => $mall_id], ['month' => $month], ['status' => StatusEnum::ENABLED]]]); $rows = array_column($list, null, 'pay_type'); foreach ($rows as $k => $v) { if ($k == PayTypeEnum::BALANCE) { $data['balance'] = [ 'name' => '余额支付', 'value' => $v['total_pay_money'], 'refund_value' => $v['total_refund_money'], ]; } elseif ($k == PayTypeEnum::WECHAT) { $data['wechat'] = [ 'name' => '微信支付', 'value' => $v['total_pay_money'], 'refund_value' => $v['total_refund_money'], ]; } elseif ($k == PayTypeEnum::ALI) { $data['alipay'] = [ 'name' => '支付宝支付', 'value' => $v['total_pay_money'], 'refund_value' => $v['total_refund_money'], ]; } elseif (in_array($k, [PayTypeEnum::JOINPAY, PayTypeEnum::JOINPAY_FAST_PAY])) { $data['joinpay_pay'] = [ 'name' => '汇聚支付', 'value' => ($data['joinpay_pay']['value'] ?? 0) + $v['total_pay_money'], 'refund_value' => ($data['joinpay_pay']['refund_value'] ?? 0) + $v['total_refund_money'], ]; } elseif (in_array($k, [PayTypeEnum::SCORE,])) { $data['score'] = [ 'name' => '积分支付', 'value' => $v['total_pay_money'], 'refund_value' => $v['total_refund_money'], ]; } elseif (in_array($k, [PayTypeEnum::SIC_PAY,])) { $data['sic_pay'] = [ 'name' => '中金支付', 'value' => $v['total_pay_money'], 'refund_value' => $v['total_refund_money'], ]; } elseif (in_array($k, [PayTypeEnum::HUIJU_BILL,])) { $data['huiju_bill'] = [ 'name' => '汇聚分账', 'value' => $v['total_pay_money'], 'refund_value' => $v['total_refund_money'], ]; } elseif (in_array($k, [PayTypeEnum::FREE,])) { $data['free'] = [ 'name' => '免支付', 'value' => $v['total_pay_money'], 'refund_value' => $v['total_refund_money'], ]; } elseif (in_array($k, [PayTypeEnum::UNION,])) { $data['union'] = [ 'name' => '银联卡', 'value' => $v['total_pay_money'], 'refund_value' => $v['total_refund_money'], ]; // } elseif (in_array($k, [PayTypeEnum::MIXED])) { // $data['combination'] = [ // 'name' => '组合支付', // 'value' => $v['total_pay_money'], // 'refund_value' => $v['total_refund_money'], // ]; } elseif ($k == PayTypeEnum::HUIFUPAY){ $data['huifupay'] = [ 'name'=>'汇付天下', 'value'=>$v['total_pay_money'], 'refund_value'=>$v['total_refund_money'], ]; } elseif ($k == PayTypeEnum::ON_LINE){ $data['online'] = [ 'name'=>'在线支付', 'value'=>$v['total_pay_money'], 'refund_value'=>$v['total_refund_money'], ]; } } return $data; } public static function setSinglePaymentMonthCache($mall_id, $pay_money, $pay_type) { $redis = \Yii::$app->redis; $month = date('Y-m', time()); $key = RedisKeyEnum::CENSUS_MALL_PAYMENT_SINGLE_MONTH . ':' . $mall_id . ':' . $month; $redis_key = RedisKeyEnum::suffix($key, '', true); $field = 'pay_type:' . $pay_type; $result = $redis->hget($redis_key, $field); !empty($result) ? $result += $pay_money : $result = $pay_money; $set_data = []; $set_data[] = $field; $set_data[] = $result; $redis->hmset($redis_key, ...$set_data); $data['mall_id'] = $mall_id; $data['month'] = $month; $data['pay_type'] = $pay_type; $data['total_pay_money'] = $pay_money; \Yii::$app->services->rabbitMq->push(RabbitMqEnum::EXCHANGE_TASK_CENSUS, RabbitMqEnum::CENSUS_QUEUE, $data, CensusMallPaymentSingleMonth::class, 'setData'); } /** * 退款金额统计 * @param array $refundData * @return bool */ public static function setSingleRefundMonthCache(array $refundData = []) { if (empty($refundData) || empty($refundData['mall_id'])) { self::$static_error = '参数错误'; return false; } $month = empty($refundData['month']) ? date('Y-m', time()) : $refundData['month']; try { $data = [ 'mall_id' => $refundData['mall_id'], 'month' => $month, 'pay_type' => $refundData['payment_type'], 'total_refund_money' => $refundData['refund_price'], 'is_initial' => $refundData['is_initial'] ?? false, ]; // 数据插入数据库 $res = self::setRefundMoney($data); if ($res === false) { self::$static_error = '退款金额统计插入数据库失败'; return false; } return true; } catch (\Exception $e) { Yii::$app->custom->logs('退款金额统计失败:' . $e->getMessage()); return false; } } }