'ID', 'cx_mch_id' => '平台商户ID', 'scene' => '场景类型', 'user_id' => '用户ID', 'account_integral' => '账户积分', 'account_total_integral' => '累计积分', 'created_at' => '添加时间', 'reset_at' => '重置时间', 'updated_at' => '更新时间', 'deleted_at' => '删除时间', 'is_delete' => '是否删除:0=否,1=是', ]; } public function beforeSave($insert) { if(parent::beforeSave($insert)){ if($this->isNewRecord){ $this->created_at = time(); } $this->updated_at = time(); if($this->is_delete == 1) $this->deleted_at = time(); return true; } else { return false; } } /** ----- INTEGRAL SCENE START ----- */ public static $cxIntegralSceneUserIntegralWallet = 0; //积分钱包 public static function getIntegralSceneLabels() { return [ '0' => '积分钱包' ]; } public static function getIntegralScene($scene) { $labels = self::getIntegralSceneLabels(); return isset($labels[$scene]) ? $labels[$scene] : "未知"; } /** ----- INTEGRAL SCENE END ----- */ /** * 用户账户初始化 * @param integer $user_id 用户ID * @param integer $scene 场景类型 * @param integer $cx_mch_id 平台商户ID */ public static function initIntegral($user_id, $scene = 0, $cx_mch_id = 0) { $model = Integral::findOne([ 'cx_mch_id' => $cx_mch_id, 'scene' => $scene, 'user_id' => $user_id, 'is_delete' => 0 ]); if($model != null) return Model::asReturnSuccess(); $model = new Integral(); $model->cx_mch_id = $cx_mch_id; $model->scene = $scene; $model->user_id = $user_id; $model->account_integral = 0; $model->account_total_integral = 0; $model->reset_at = 0; $model->is_delete = 0; if(!$model->save()) return (new Model())->getModelError($model); return Model::asReturnSuccess(); } /** * 用户账户积分变动 * @param integer $user_id 用户ID * @param integer $type 类型,1=收入,2=支出 * @param integer $integral 积分 * @param string $desc 交易描述 * @param integer $order_type 订单类型 * @param string $order_no 订单号 * @param integer $scene 场景类型 * @param string $ext 扩展信息(JSON) * @param integer $cx_mch_id 平台商户ID */ public static function logger($user_id, $type, $integral, $desc, $order_type, $order_no, $scene = 0, $ext = "", $cx_mch_id = 0) { //账户积分变动 $integral_model = Integral::findOne([ 'cx_mch_id' => $cx_mch_id, 'scene' => $scene, 'user_id' => $user_id, 'is_delete' => 0 ]); if($integral_model == null){ $res = self::initIntegral($user_id, $scene, $cx_mch_id); if($res['code'] != 0) return $res; return self::logger($user_id, $type, $integral, $desc, $order_type, $order_no, $scene, $ext, $cx_mch_id); } $integral = intval($integral); $before_account_integral = $integral_model->account_integral; if($type == self::TYPE_INCOME){ $integral_model->account_integral += $integral; $integral_model->account_total_integral += $integral; $after_account_integral = $before_account_integral + $integral; } if($type == self::TYPE_PAY){ $integral_model->account_integral -= $integral; $integral_model->account_total_integral -= $integral; $after_account_integral = $before_account_integral - $integral; //账户不够扣的情况 if($integral_model->account_integral < 0){ $scene_cn = self::getIntegralScene($scene); return Model::asReturnError("{$scene_cn}积分不足"); } } if(!$integral_model->save()) return (new Model())->getModelError($integral_model); //账户变动日志 $integral_log = new IntegralLog(); $integral_log->cx_mch_id = $cx_mch_id; $integral_log->scene = $scene; $integral_log->type = $type; $integral_log->user_id = $user_id; $integral_log->integral = $integral; $integral_log->before_account_integral = $before_account_integral; $integral_log->after_account_integral = $after_account_integral; $integral_log->desc = $desc; $integral_log->order_type = $order_type; $integral_log->order_no = $order_no; $integral_log->ext = $ext; if(!$integral_log->save()){ return (new Model())->getModelError($integral_log); } return Model::asReturnSuccess(); } /** * 用户积分钱包积分变动 * @param integer $user_id 用户ID * @param integer $type 类型,1=收入,2=支出 * @param integer $integral 积分 * @param string $desc 交易描述 * @param integer $order_type 订单类型 * @param string $order_no 订单号 * @param string $ext 扩展信息(JSON) * @param integer $cx_mch_id 平台商户ID */ public static function userIntegralWalletLog($user_id, $type, $integral, $desc, $order_type, $order_no, $ext = "", $cx_mch_id = 0) { $scene = self::$cxIntegralSceneUserIntegralWallet; return self::logger($user_id, $type, $integral, $desc, $order_type, $order_no, $scene, $ext, $cx_mch_id); } }