[ 'id' => 'exchange', 'title' => '兑换点数', 'attr' => 'EXCHANGE_POINTS', 'pv' => false, ], 'travel_points' => [ 'id' => 'travel_points', 'title' => '旅游积分', 'attr' => 'TRAVEL_POINTS', 'pv' => false, ], 'car_points' => [ 'id' => 'car_points', 'title' => '名车积分', 'attr' => 'CAR_POINTS', 'pv' => false, ], 'house_points' => [ 'id' => 'house_points', 'title' => '豪宅积分', 'attr' => 'HOUSE_POINTS', 'pv' => false, ], ]; /** * 发票流水 * @param $userId * @param $amount * @param $params * @return bool * @throws Exception * @throws \yii\db\Exception */ public static function changeInvoice($userId, $amount, $params) { if ($amount == 0) return true; $period = Period::instance(); if (!isset($params['PERIOD_NUM'])) { $periodNum = $period->getNowPeriodNum(); } else { $periodNum = $params['PERIOD_NUM']; } $calcYearMonth = $period->getYearMonth($periodNum); // redis加锁(防止并发余额数值不准确出错) $lockKey = self::INVOICE_BALANCE_LOCK_KEY . $userId; if (RedisLock::instance()->lock($lockKey)) { $userInfo = UserInfo::findOne(['USER_ID' => $userId]); $totals = $userInfo->INVOICE_BALANCE + $amount; $userInfo->INVOICE_BALANCE = $totals; if (!$userInfo->save()) { throw new \Exception(Form::formatErrorsForApi($userInfo->getErrors())); } //记录流水 $baseInfo = Info::baseInfoZh($userId); $flowInsertData = [ 'USER_ID' => $userId, 'REAL_NAME' => $baseInfo['REAL_NAME'], 'DEC_LV' => $baseInfo['DEC_LV'], 'EMP_LV' => $baseInfo['EMP_LV'], 'MOBILE' => $baseInfo['MOBILE'], 'REG_TYPE' => $userInfo['REG_TYPE'], 'REG_NAME' => $userInfo['REG_NAME'], 'CREDIT_CODE' => $userInfo['CREDIT_CODE'], 'SALE_NAME' => $params['SALE_NAME'] ?? null, 'TAXPAYER_NUMBER' => $params['TAXPAYER_NUMBER'] ?? null, 'INVOICE_SN' => $params['INVOICE_SN'] ?? null, 'INVOICE_ACCOUNT' => $params['INVOICE_ACCOUNT'] ?? null, 'TAX_ACCOUNT' => $params['TAX_ACCOUNT'] ?? null, 'OUTED_AT' => $params['OUTED_AT'] ?? 0, 'AMOUNT' => abs($amount), 'TOTAL' => $totals, 'WITHDRAW_SN' => $params['WITHDRAW_SN'] ?? null, 'IS_INCR' => $amount > 0 ? self::INCR_ADD : self::INCR_REDUCE, 'PERIOD_NUM' => $periodNum, 'CALC_MONTH' => $calcYearMonth, 'REMARK' => $params['REMARK'] ?? null, 'CREATE_ADMIN' => $params['CREATE_ADMIN'], 'CREATE_REMARK' => $params['CREATE_REMARK'] ?? null, 'CREATE_TIME' => $params['CREATE_TIME'], 'AUDIT_ADMIN' => $params['AUDIT_ADMIN'], 'AUDIT_REMARK' => $params['AUDIT_REMARK'] ?? null, 'AUDIT_TIME' => $params['AUDIT_TIME'], 'P_MONTH' => Date::ociToDate(), 'CREATED_AT' => $params['TIME'] ?? Date::nowTime(), ]; InvoiceFlow::insertOne($flowInsertData); unset($flowInsertData); RedisLock::instance()->unlock($lockKey); } else { throw new Exception('流水产生错误'); } return true; } /** * 获取当前可用余额 * @param $userId * @return int|mixed */ public static function getAvailableBalance($userId) { $oneData = UserBonus::find()->where('USER_ID=:USER_ID', [':USER_ID' => $userId])->asArray()->one(); if ($oneData) { return $oneData['BONUS'] - $oneData['BONUS_FREEZE']; } else { return 0; } } /** * 获取当前车房养老奖余额 * @param $userId * @return int|mixed */ public static function getBalanceCF($userId) { $oneData = UserBonus::find()->where('USER_ID=:USER_ID', [':USER_ID' => $userId])->asArray()->one(); if ($oneData) { return $oneData['CF']; } else { return 0; } } /** * 获取当前复消积分余额 * @param $userId * @return int|mixed */ public static function getBalanceReconsumePoints($userId) { $oneData = UserBonus::find()->where('USER_ID=:USER_ID', [':USER_ID' => $userId])->asArray()->one(); if ($oneData) { return $oneData['RECONSUME_POINTS']; } else { return 0; } } /** * 获取当前兑换积分余额 * @param $userId * @return int|mixed */ public static function getBalanceExchangePoints($userId) { $oneData = UserBonus::find()->where('USER_ID=:USER_ID', [':USER_ID' => $userId])->asArray()->one(); if ($oneData) { return $oneData['EXCHANGE_POINTS']; } else { return 0; } } /** * 获取当前车房养老奖余额 * @param $userId * @return int|mixed */ public static function getBalanceLX($userId) { $oneData = UserBonus::find()->where('USER_ID=:USER_ID', [':USER_ID' => $userId])->asArray()->one(); if ($oneData) { return $oneData['LX']; } else { return 0; } } /** * 查询会员账户余额. * @param $userId * @param $payType * @return int|mixed */ public static function getAccountBalance($userId, $payType) { $oneData = UserBonus::find()->where('USER_ID=:USER_ID', [':USER_ID' => $userId])->asArray()->one(); return !$oneData ? 0 : $oneData[Balance::BALANCE_TYPE[$payType]['attr']] ?? 0; } /** * 改变会员的余额 * @param $userId * @param $type * @param $amount * @param array $params * @param bool $allowMinus * @return bool * @throws Exception * @throws \yii\db\Exception */ public static function changeUserBonus($userId, $type, $amount, $params = [], $allowMinus = false) { if (array_key_exists($type, UserBonus::TYPE)) { $type = strtoupper($type); } if ($amount == 0) return true; $period = Period::instance(); if (!isset($params['PERIOD_NUM'])) { $periodNum = $period->getNowPeriodNum(); } else { $periodNum = $params['PERIOD_NUM']; } $calcYearMonth = $period->getYearMonth($periodNum); // 汇率 $exchangeRate = floatval(Cache::getSystemConfig()['exchangeRate']['VALUE'] ?? 0); // redis加锁(防止并发余额数值不准确出错) switch ($type) { case 'BONUS': $lockKey = self::BONUS_BALANCE_LOCK_KEY . $userId; break; case 'RECONSUME_POINTS': $lockKey = self::RECONSUME_POINTS_BALANCE_LOCK_KEY . $userId; break; case 'EXCHANGE_POINTS': $lockKey = self::EXCHANGE_POINTS_BALANCE_LOCK_KEY . $userId; break; case 'CF': $lockKey = self::CF_BALANCE_LOCK_KEY . $userId; break; case 'LX': $lockKey = self::LX_BALANCE_LOCK_KEY . $userId; break; case 'TRAVEL_POINTS': $lockKey = self::TRAVEL_POINTS_BALANCE_LOCK_KEY . $userId; break; case 'CAR_POINTS': $lockKey = self::CAR_POINTS_BALANCE_LOCK_KEY . $userId; break; case 'HOUSE_POINTS': $lockKey = self::HOUSE_POINTS_BALANCE_LOCK_KEY . $userId; break; default: throw new Exception('流水类型错误'); } if (RedisLock::instance()->lock($lockKey)) { // 改变发奖 $paramData = []; $oneUserBonusModel = UserBonus::findOne(['USER_ID' => $userId]); // 是否奖金发放操作 $issueBonus = $params['BONUS_ISSUE'] ?? false; if ($oneUserBonusModel) { $paramData[$type] = new Expression($type.' + ' . ($issueBonus ? $amount * $exchangeRate : $amount)); $oneUserBonusModel->$type += ($issueBonus ? $amount * $exchangeRate : $amount); if ($oneUserBonusModel->$type < 0) { RedisLock::instance()->unlock($lockKey); throw new Exception('金额不足'); } if (isset($params['QY'])) { $paramData['QY_TOTAL'] = new Expression('QY_TOTAL + ' . ($issueBonus ? $params['QY'] * $exchangeRate : $params['QY'])); //$oneUserBonusModel->QY_TOTAL += $params['QY']; } if (isset($params['FW'])) { $paramData['FW_TOTAL'] = new Expression('FW_TOTAL + ' . ($issueBonus ? $params['FW'] * $exchangeRate : $params['FW'])); } if (isset($params['YC'])) { $paramData['YC_TOTAL'] = new Expression('YC_TOTAL + ' . ($issueBonus ? $params['YC'] * $exchangeRate : $params['YC'])); //$oneUserBonusModel->YC_TOTAL += $params['YC']; } if (isset($params['VIP'])) { $paramData['VIP_TOTAL'] = new Expression('VIP_TOTAL + ' . ($issueBonus ? $params['VIP'] * $exchangeRate : $params['VIP'])); } if (isset($params['BD'])) { $paramData['BD_TOTAL'] = new Expression('BD_TOTAL + ' . ($issueBonus ? $params['BD'] * $exchangeRate : $params['BD'])); //$oneUserBonusModel->BD_TOTAL += $params['BD']; } if (isset($params['TG'])) { $paramData['TG_TOTAL'] = new Expression('TG_TOTAL + ' . ($issueBonus ? $params['TG'] * $exchangeRate : $params['TG'])); //$oneUserBonusModel->TG_TOTAL += $params['TG']; } if (isset($params['YJ'])) { $paramData['YJ_TOTAL'] = new Expression('YJ_TOTAL + ' . ($issueBonus ? $params['YJ'] * $exchangeRate : $params['YJ'])); //$oneUserBonusModel->YJ_TOTAL += $params['YJ']; } if (isset($params['GX'])) { $paramData['GX_TOTAL'] = new Expression('GX_TOTAL + ' . ($issueBonus ? $params['GX'] * $exchangeRate : $params['GX'])); //$oneUserBonusModel->GX_TOTAL += $params['GX']; } if (isset($params['GL'])) { $paramData['GL_TOTAL'] = new Expression('GL_TOTAL + ' . ($issueBonus ? $params['GL'] * $exchangeRate : $params['GL'])); //$oneUserBonusModel->GL_TOTAL += $params['GL']; } if (isset($params['BS'])) { $paramData['BS_TOTAL'] = new Expression('BS_TOTAL + ' . ($issueBonus ? $params['BS'] * $exchangeRate : $params['BS'])); } if (isset($params['BS_MNT'])) { $paramData['BS_MNT_TOTAL'] = new Expression('BS_MNT_TOTAL + ' . ($issueBonus ? $params['BS_MNT'] * $exchangeRate : $params['BS_MNT'])); } if (isset($params['BS_ABBR'])) { $paramData['BS_ABBR_TOTAL'] = new Expression('BS_ABBR_TOTAL + ' . ($issueBonus ? $params['BS_ABBR'] * $exchangeRate : $params['BS_ABBR'])); } if (isset($params['TRAVEL_POINTS'])) { $paramData['TRAVEL_POINTS_TOTAL'] = new Expression('TRAVEL_POINTS_TOTAL + ' . ($issueBonus ? $params['TRAVEL_POINTS'] * $exchangeRate : $params['TRAVEL_POINTS'])); } if (isset($params['CAR_POINTS'])) { $paramData['CAR_POINTS_TOTAL'] = new Expression('CAR_POINTS_TOTAL + ' . ($issueBonus ? $params['CAR_POINTS'] * $exchangeRate : $params['CAR_POINTS'])); } if (isset($params['HOUSE_POINTS'])) { $paramData['HOUSE_POINTS_TOTAL'] = new Expression('HOUSE_POINTS_TOTAL + ' . ($issueBonus ? $params['HOUSE_POINTS'] * $exchangeRate : $params['HOUSE_POINTS'])); } if (isset($params['RECONSUME_POINTS_TOTAL'])) { $paramData['RECONSUME_POINTS_TOTAL'] = new Expression('RECONSUME_POINTS_TOTAL + ' . ($issueBonus ? $params['RECONSUME_POINTS_TOTAL'] * $exchangeRate : $params['RECONSUME_POINTS_TOTAL'])); //$oneUserBonusModel->RECONSUME_POINTS_TOTAL += $params['RECONSUME_POINTS_TOTAL']; } if (isset($params['EXCHANGE_POINTS_TOTAL'])) { $paramData['EXCHANGE_POINTS_TOTAL'] = new Expression('EXCHANGE_POINTS_TOTAL + ' . ($issueBonus ? $params['EXCHANGE_POINTS_TOTAL'] * $exchangeRate : $params['EXCHANGE_POINTS_TOTAL'])); //$oneUserBonusModel->RECONSUME_POINTS_TOTAL += $params['RECONSUME_POINTS_TOTAL']; } if (isset($params['MANAGE_TAX'])) { $paramData['MANAGE_TAX'] = new Expression('MANAGE_TAX + ' . ($issueBonus ? $params['MANAGE_TAX'] * $exchangeRate : $params['MANAGE_TAX'])); //$oneUserBonusModel->MANAGE_TAX += $params['MANAGE_TAX']; } if (isset($params['ORI_QY'])) { $paramData['ORI_QY_TOTAL'] = new Expression('ORI_QY_TOTAL + ' . ($issueBonus ? $params['ORI_QY'] * $exchangeRate : $params['ORI_QY'])); //$oneUserBonusModel->ORI_QY_TOTAL += $params['ORI_QY']; } // if (isset($params['ORI_FW'])) { // $paramData['ORI_FW_TOTAL'] = new Expression('ORI_FW_TOTAL + '.$params['ORI_FW']); // } if (isset($params['ORI_YC'])) { $paramData['ORI_YC_TOTAL'] = new Expression('ORI_YC_TOTAL + ' . ($issueBonus ? $params['ORI_YC'] * $exchangeRate : $params['ORI_YC'])); //$oneUserBonusModel->ORI_YC_TOTAL += $params['ORI_YC']; } if (isset($params['ORI_VIP'])) { $paramData['ORI_VIP_TOTAL'] = new Expression('ORI_VIP_TOTAL + ' . ($issueBonus ? $params['ORI_VIP'] * $exchangeRate : $params['ORI_VIP'])); } if (isset($params['ORI_STANDARD'])) { $paramData['ORI_STANDARD_TOTAL'] = new Expression('ORI_STANDARD_TOTAL + ' . ($issueBonus ? $params['ORI_STANDARD'] * $exchangeRate : $params['ORI_STANDARD'])); } if (isset($params['ORI_TG'])) { $paramData['ORI_TG_TOTAL'] = new Expression('ORI_TG_TOTAL + ' . ($issueBonus ? $params['ORI_TG'] * $exchangeRate : $params['ORI_TG'])); //$oneUserBonusModel->ORI_TG_TOTAL += $params['ORI_TG']; } if (isset($params['ORI_YJ'])) { $paramData['ORI_YJ_TOTAL'] = new Expression('ORI_YJ_TOTAL + ' . ($issueBonus ? $params['ORI_YJ'] * $exchangeRate : $params['ORI_YJ'])); //$oneUserBonusModel->ORI_YJ_TOTAL += $params['ORI_YJ']; } if (isset($params['ORI_GX'])) { $paramData['ORI_GX_TOTAL'] = new Expression('ORI_GX_TOTAL + ' . ($issueBonus ? $params['ORI_GX'] * $exchangeRate : $params['ORI_GX'])); //$oneUserBonusModel->ORI_GX_TOTAL += $params['ORI_GX']; } if (isset($params['ORI_GL'])) { $paramData['ORI_GL_TOTAL'] = new Expression('ORI_GL_TOTAL + ' . ($issueBonus ? $params['ORI_GL'] * $exchangeRate : $params['ORI_GL'])); //$oneUserBonusModel->ORI_GL_TOTAL += $params['ORI_GL']; } if (isset($params['ORI_BS'])) { $paramData['ORI_BS_TOTAL'] = new Expression('ORI_BS_TOTAL + ' . ($issueBonus ? $params['ORI_BS'] * $exchangeRate : $params['ORI_BS'])); //$oneUserBonusModel->ORI_GL_TOTAL += $params['ORI_GL']; } if (isset($params['ORI_BS_MNT'])) { $paramData['BS_MNT_ORI_TOTAL'] = new Expression('BS_MNT_ORI_TOTAL + ' . ($issueBonus ? $params['ORI_BS_MNT'] * $exchangeRate : $params['ORI_BS_MNT'])); //$oneUserBonusModel->ORI_GL_TOTAL += $params['ORI_GL']; } if (isset($params['ORI_BS_ABBR'])) { $paramData['BS_ABBR_ORI_TOTAL'] = new Expression('BS_ABBR_ORI_TOTAL + ' . ($issueBonus ? $params['ORI_BS_ABBR'] * $exchangeRate : $params['ORI_BS_ABBR'])); //$oneUserBonusModel->ORI_GL_TOTAL += $params['ORI_GL']; } if (isset($params['BONUS_TOTAL'])) { $paramData['BONUS_TOTAL'] = new Expression('BONUS_TOTAL + ' . ($issueBonus ? $params['BONUS_TOTAL'] * $exchangeRate : $params['BONUS_TOTAL'])); //$oneUserBonusModel->BONUS_TOTAL += $params['BONUS_TOTAL']; } UserBonus::updateAll($paramData, 'USER_ID=:USER_ID', [':USER_ID' => $userId]); } else { $paramData = [ 'USER_ID'=>$userId, $type=>$amount, 'CREATED_AT'=>Date::nowTime() ]; if (isset($params['QY'])) { // $paramData['QY_TOTAL'] = new Expression('QY_TOTAL + '.$params['QY']); $paramData['QY_TOTAL'] = ($issueBonus ? $params['QY'] * $exchangeRate : $params['QY']); } if (isset($params['FW'])) { // $paramData['FW_TOTAL'] = new Expression('FW_TOTAL + '.$params['FW']); $paramData['FW_TOTAL'] = ($issueBonus ? $params['FW'] * $exchangeRate : $params['FW']); } if (isset($params['YC'])) { // $paramData['YC_TOTAL'] = new Expression('YC_TOTAL + '.$params['YC']); $paramData['YC_TOTAL'] = ($issueBonus ? $params['YC'] * $exchangeRate : $params['YC']); } if (isset($params['VIP'])) { // $paramData['VIP_TOTAL'] = new Expression('VIP_TOTAL + '.$params['VIP']); $paramData['VIP_TOTAL'] = ($issueBonus ? $params['VIP'] * $exchangeRate : $params['VIP']); } if (isset($params['BD'])) { // $paramData['BD_TOTAL'] = new Expression('BD_TOTAL + '.$params['BD']); $paramData['BD_TOTAL'] = ($issueBonus ? $params['BD'] * $exchangeRate : $params['BD']); //$oneUserBonusModel->BD_TOTAL += $params['BD']; } if (isset($params['TG'])) { // $paramData['TG_TOTAL'] = new Expression('TG_TOTAL + '.$params['TG']); $paramData['TG_TOTAL'] = ($issueBonus ? $params['TG'] * $exchangeRate : $params['TG']); } if (isset($params['YJ'])) { // $paramData['YJ_TOTAL'] = new Expression('YJ_TOTAL + '.$params['YJ']); $paramData['YJ_TOTAL'] = ($issueBonus ? $params['YJ'] * $exchangeRate : $params['YJ']); } if (isset($params['GX'])) { // $paramData['GX_TOTAL'] = new Expression('GX_TOTAL + '.$params['GX']); $paramData['GX_TOTAL'] = ($issueBonus ? $params['GX'] * $exchangeRate : $params['GX']); } if (isset($params['GL'])) { // $paramData['GL_TOTAL'] = new Expression('GL_TOTAL + '.$params['GL']); $paramData['GL_TOTAL'] = ($issueBonus ? $params['GL'] * $exchangeRate : $params['GL']); } if (isset($params['BS'])) { $paramData['BS_TOTAL'] = ($issueBonus ? $params['BS'] * $exchangeRate : $params['BS']); //$oneUserBonusModel->GL_TOTAL += $params['GL']; } if (isset($params['BS_MNT'])) { $paramData['BS_MNT_TOTAL'] = ($issueBonus ? $params['BS_MNT'] * $exchangeRate : $params['BS_MNT']); } if (isset($params['BS_ABBR'])) { $paramData['BS_ABBR_TOTAL'] = ($issueBonus ? $params['BS_ABBR'] * $exchangeRate : $params['BS_ABBR']); } if (isset($params['TRAVEL_POINTS'])) { $paramData['TRAVEL_POINTS_TOTAL'] = ($issueBonus ? $params['TRAVEL_POINTS'] * $exchangeRate : $params['TRAVEL_POINTS']); } if (isset($params['CAR_POINTS'])) { $paramData['CAR_POINTS_TOTAL'] = ($issueBonus ? $params['CAR_POINTS'] * $exchangeRate : $params['CAR_POINTS']); } if (isset($params['HOUSE_POINTS'])) { $paramData['HOUSE_POINTS_TOTAL'] = ($issueBonus ? $params['HOUSE_POINTS'] * $exchangeRate : $params['HOUSE_POINTS']); } if (isset($params['RECONSUME_POINTS_TOTAL'])) { // $paramData['RECONSUME_POINTS_TOTAL'] = new Expression('RECONSUME_POINTS_TOTAL + '.$params['RECONSUME_POINTS_TOTAL']); $paramData['RECONSUME_POINTS_TOTAL'] = ($issueBonus ? $params['RECONSUME_POINTS_TOTAL'] * $exchangeRate : $params['RECONSUME_POINTS_TOTAL']); } if (isset($params['MANAGE_TAX'])) { // $paramData['MANAGE_TAX'] = new Expression('MANAGE_TAX + '.$params['MANAGE_TAX']); $paramData['MANAGE_TAX'] = ($issueBonus ? $params['MANAGE_TAX'] * $exchangeRate : $params['MANAGE_TAX']); } if (isset($params['ORI_QY'])) { // $paramData['ORI_QY_TOTAL'] = new Expression('ORI_QY_TOTAL + '.$params['ORI_QY']); $paramData['ORI_QY_TOTAL'] = ($issueBonus ? $params['ORI_QY'] * $exchangeRate : $params['ORI_QY']); } // if (isset($params['ORI_FW'])) { //// $paramData['ORI_FW_TOTAL'] = new Expression('ORI_FW_TOTAL + '.$params['ORI_FW']); // $paramData['ORI_FW_TOTAL'] = $params['ORI_FW']; // } if (isset($params['ORI_YC'])) { // $paramData['ORI_YC_TOTAL'] = new Expression('ORI_YC_TOTAL + '.$params['ORI_YC']); $paramData['ORI_YC_TOTAL'] = ($issueBonus ? $params['ORI_YC'] * $exchangeRate : $params['ORI_YC']); } if (isset($params['ORI_VIP'])) { // $paramData['ORI_VIP_TOTAL'] = new Expression('ORI_VIP_TOTAL + '.$params['ORI_VIP']); $paramData['ORI_VIP_TOTAL'] = ($issueBonus ? $params['ORI_VIP'] * $exchangeRate : $params['ORI_VIP']); } if (isset($params['ORI_STANDARD'])) { $paramData['ORI_STANDARD_TOTAL'] = ($issueBonus ? $params['ORI_STANDARD'] * $exchangeRate : $params['ORI_STANDARD']); } if (isset($params['ORI_BD'])) { // $paramData['ORI_BD_TOTAL'] = new Expression('ORI_BD_TOTAL + '.$params['ORI_BD']); $paramData['ORI_BD_TOTAL'] = ($issueBonus ? $params['ORI_BD'] * $exchangeRate : $params['ORI_BD']); } if (isset($params['ORI_TG'])) { // $paramData['ORI_TG_TOTAL'] = new Expression('ORI_TG_TOTAL + '.$params['ORI_TG']); $paramData['ORI_TG_TOTAL'] = ($issueBonus ? $params['ORI_TG'] * $exchangeRate : $params['ORI_TG']); } if (isset($params['ORI_YJ'])) { // $paramData['ORI_YJ_TOTAL'] = new Expression('ORI_YJ_TOTAL + '.$params['ORI_YJ']); $paramData['ORI_YJ_TOTAL'] = ($issueBonus ? $params['ORI_YJ'] * $exchangeRate : $params['ORI_YJ']); } if (isset($params['ORI_GX'])) { // $paramData['ORI_GX_TOTAL'] = new Expression('ORI_GX_TOTAL + '.$params['ORI_GX']); $paramData['ORI_GX_TOTAL'] = ($issueBonus ? $params['ORI_GX'] * $exchangeRate : $params['ORI_GX']); } if (isset($params['ORI_GL'])) { // $paramData['ORI_GL_TOTAL'] = new Expression('ORI_GL_TOTAL + '.$params['ORI_GL']); $paramData['ORI_GL_TOTAL'] = ($issueBonus ? $params['ORI_GL'] * $exchangeRate : $params['ORI_GL']); } if (isset($params['ORI_BS'])) { $paramData['ORI_BS_TOTAL'] = ($issueBonus ? $params['ORI_BS'] * $exchangeRate : $params['ORI_BS']); //$oneUserBonusModel->ORI_GL_TOTAL += $params['ORI_GL']; } if (isset($params['ORI_BS_MNT'])) { $paramData['BS_MNT_ORI_TOTAL'] = ($issueBonus ? $params['ORI_BS_MNT'] * $exchangeRate : $params['ORI_BS_MNT']); } if (isset($params['ORI_BS_ABBR'])) { $paramData['BS_ABBR_ORI_TOTAL'] = ($issueBonus ? $params['ORI_BS_ABBR'] * $exchangeRate : $params['ORI_BS_ABBR']); } if (isset($params['BONUS_TOTAL'])) { // $paramData['BONUS_TOTAL'] = new Expression('BONUS_TOTAL + '.$params['BONUS_TOTAL']); $paramData['BONUS_TOTAL'] = ($issueBonus ? $params['BONUS_TOTAL'] * $exchangeRate : $params['BONUS_TOTAL']); } UserBonus::insertOne($paramData); } unset($oneUserBonusModel,$paramData); // 获取发放完成的奖金信息 $oneUserBonus = UserBonus::find()->where('USER_ID=:USER_ID', [':USER_ID' => $userId])->asArray()->one(); $userInfo = Info::getLastInfo($userId); // 记录流水 $flowInsertData = [ 'USER_ID' => $userId, 'LAST_DEC_LV' => $userInfo['DEC_LV'], 'LAST_EMP_LV' => $userInfo['EMP_LV'], 'LAST_STATUS' => $userInfo['STATUS'], 'CALC_ID' => $params['CALC_ID'] ?? null, 'AMOUNT' => ($issueBonus ? $amount * $exchangeRate : $amount), 'AMOUNT_STANDARD' => (!$issueBonus ? $amount / $exchangeRate : $amount), 'EXCHANGE_RATE' => $exchangeRate, 'TOTAL' => $oneUserBonus[$type], 'IS_INCR' => $amount > 0 ? FlowBonus::INCR_ADD : FlowBonus::INCR_REDUCE, 'REMARK' => $params['REMARK'] ?? null, 'REMARK_IS_SHOW' => $params['REMARK_IS_SHOW'] ?? 1, 'PERIOD_NUM' => $params['PERIOD_NUM'] ?? $periodNum, 'CALC_MONTH' => $calcYearMonth, 'P_MONTH' => Date::ociToDate(), 'CREATED_AT' => $params['TIME'] ?? Date::nowTime(), 'ADMIN_NAME' => $params['ADMIN_NAME'] ?? 'system', 'DEAL_TYPE_ID' => $params['DEAL_TYPE_ID'] ?? '', 'DEAL_TYPE_IS_PRESET' => $params['DEAL_TYPE_IS_PRESET'] ?? 1, 'TRANSFER_SN' => $params['TRANSFER_SN'] ?? '', 'SORT' => $params['SORT'] ?? 0, ]; unset($userInfo, $oneUserBonus); if (strtolower($type) == 'reconsume_points' || strtolower($type) == 'cf' || strtolower($type) == 'lx' || strtolower($type) == 'exchange_points' ) { unset($flowInsertData['CALC_ID']); unset($flowInsertData['TRANSFER_SN']); unset($flowInsertData['SORT']); } if (strtolower($type) == 'bonus') { FlowBonus::insertOne($flowInsertData); // } elseif (strtolower($type) == 'reconsume_points') { // //记录和扣除期数的积分 // if( $amount > 0 ) { // self::addPeriodReconsumePoints($userId, $periodNum, $amount); // }else { // self::deductPeriodReconsumePoints($userId, abs($amount)); // } // FlowReconsumePoints::insertOne($flowInsertData); } elseif (strtolower($type) == 'exchange_points') { //记录和扣除期数的积分 if( $amount > 0 ) { self::addPeriodExchangePoints($userId, $periodNum, (!$issueBonus ? $amount / $exchangeRate : $amount)); }else { self::deductPeriodExchangePoints($userId, abs($amount)); } FlowExchangePoints::insertOne($flowInsertData); // } elseif (strtolower($type) == 'cf') { // FlowCF::insertOne($flowInsertData); // } elseif (strtolower($type) == 'lx') { // FlowLX::insertOne($flowInsertData); } elseif (in_array(strtolower($type), ['travel_points', 'car_points', 'house_points'])) { // 这3个奖流水在一个表,需要加二级标识码 $flowInsertData['WALLET_TYPE'] = strtolower($type); FlowZonePoints::insertOne($flowInsertData); } unset($flowInsertData); RedisLock::instance()->unlock($lockKey); } else { throw new Exception('流水产生错误'); } return true; } /** * 添加对应期数的复消积分 * @param $userId * @param $periodNum * @param $amount * @throws \yii\db\Exception * @return boolean */ public static function addPeriodReconsumePoints($userId, $periodNum, $amount) { if($amount <= 0) return false; $exists = UserPeriodPoints::find()->where('USER_ID=:USER_ID AND PERIOD_NUM=:PERIOD_NUM', [ 'USER_ID' => $userId, 'PERIOD_NUM' => $periodNum, ])->asArray()->exists(); if( $exists ) { UserPeriodPoints::updateAllCounters([ 'RECONSUME_POINTS' => $amount, 'REMAINDER_POINTS' => $amount, ], 'USER_ID=:USER_ID AND PERIOD_NUM=:PERIOD_NUM', [ 'USER_ID' => $userId, 'PERIOD_NUM' => $periodNum, ]); }else { UserPeriodPoints::insertOne([ 'USER_ID' => $userId, 'PERIOD_NUM' => $periodNum, 'RECONSUME_POINTS' => $amount, 'REMAINDER_POINTS' => $amount, 'EXPIRED' => 0, 'CREATED_AT' => Date::nowTime() ]); } return true; } /** * 添加对应期数的兑换积分 * @param $userId * @param $periodNum * @param $amount * @throws \yii\db\Exception * @return boolean */ public static function addPeriodExchangePoints($userId, $periodNum, $amount) { if($amount <= 0) return false; $exists = UserPeriodExchangePoints::find()->where('USER_ID=:USER_ID AND PERIOD_NUM=:PERIOD_NUM', [ 'USER_ID' => $userId, 'PERIOD_NUM' => $periodNum, ])->asArray()->exists(); if( $exists ) { UserPeriodExchangePoints::updateAllCounters([ 'EXCHANGE_POINTS' => $amount, 'REMAINDER_POINTS' => $amount, ], 'USER_ID=:USER_ID AND PERIOD_NUM=:PERIOD_NUM', [ 'USER_ID' => $userId, 'PERIOD_NUM' => $periodNum, ]); }else { UserPeriodExchangePoints::insertOne([ 'USER_ID' => $userId, 'PERIOD_NUM' => $periodNum, 'EXCHANGE_POINTS' => $amount, 'REMAINDER_POINTS' => $amount, 'EXPIRED' => 0, 'CREATED_AT' => Date::nowTime() ]); } return true; } /** * 减少 * @param $userId * @param $amount * @return bool */ public static function deductPeriodReconsumePoints($userId, $amount) { if( $amount <= 0 ) return false; $avalidList = UserPeriodPoints::find()->where('USER_ID=:USER_ID AND EXPIRED=:EXPIRED AND REMAINDER_POINTS>0', [ 'USER_ID' => $userId, 'EXPIRED'=>0 ])->orderBy('PERIOD_NUM ASC')->asArray()->all(); if( !$avalidList ) return false; foreach ($avalidList as $everyData) { if( $amount <= 0 ) break; $remainderPoints = floatval($everyData['REMAINDER_POINTS']); if( $amount >= $remainderPoints ) { UserPeriodPoints::updateAllCounters([ 'REMAINDER_POINTS' => (-1) * $remainderPoints ], 'ID=:ID', ['ID'=>$everyData['ID']]); $amount -= $remainderPoints; }else { UserPeriodPoints::updateAllCounters([ 'REMAINDER_POINTS' => (-1) * $amount ], 'ID=:ID', ['ID'=>$everyData['ID']]); $amount = 0; } unset($everyData, $remainderPoints); } if( $amount > 0 ) return false; return true; } /** * 减少 * @param $userId * @param $amount * @return bool */ public static function deductPeriodExchangePoints($userId, $amount) { if( $amount <= 0 ) return false; $avalidList = UserPeriodExchangePoints::find()->where('USER_ID=:USER_ID AND EXPIRED=:EXPIRED AND REMAINDER_POINTS>0', [ 'USER_ID' => $userId, 'EXPIRED'=>0 ])->orderBy('PERIOD_NUM ASC')->asArray()->all(); if( !$avalidList ) return false; foreach ($avalidList as $everyData) { if( $amount <= 0 ) break; $remainderPoints = floatval($everyData['REMAINDER_POINTS']); if( $amount >= $remainderPoints ) { UserPeriodExchangePoints::updateAllCounters([ 'REMAINDER_POINTS' => (-1) * $remainderPoints ], 'ID=:ID', ['ID'=>$everyData['ID']]); $amount -= $remainderPoints; }else { UserPeriodExchangePoints::updateAllCounters([ 'REMAINDER_POINTS' => (-1) * $amount ], 'ID=:ID', ['ID'=>$everyData['ID']]); $amount = 0; } unset($everyData, $remainderPoints); } if( $amount > 0 ) return false; return true; } /** * 冻结用户余额 * @param $userId * @param $amount * @param null $remark * @param null $time * @return bool * @throws Exception * @throws \yii\db\Exception */ public static function freezeUserBonus($userId, $amount, $remark = null, $time = null) { return self::changeFreezeUserBonus($userId, $amount, ['REMARK' => $remark, 'TIME' => $time]); } /** * 解冻用户余额 * @param $userId * @param $amount * @param null $remark * @param null $time * @return bool * @throws Exception * @throws \yii\db\Exception */ public static function unfreezeUserBonus($userId, $amount, $remark = null, $time = null) { return self::changeFreezeUserBonus($userId, -$amount, ['REMARK' => $remark, 'TIME' => $time]); } /** * @param $userId * @param $amount * @param $params * [ * 'REMARK' => '备注', * 'PERIOD_NUM' => 100, * ] * @return bool * @throws Exception * @throws \yii\db\Exception */ public static function changeFreezeUserBonus($userId, $amount, $params) { if ($amount == 0) return true; $period = Period::instance(); if (!isset($params['PERIOD_NUM'])) { $periodNum = $period->getNowPeriodNum(); } else { $periodNum = $params['PERIOD_NUM']; } $calcYearMonth = $period->getYearMonth($periodNum); // 改变冻结 $oneUserBonusModel = UserBonus::findOne(['USER_ID' => $userId]); if ($oneUserBonusModel) { $oneUserBonusModel->BONUS_FREEZE = $oneUserBonusModel->BONUS_FREEZE + $amount; } else { $oneUserBonusModel = new UserBonus(); $oneUserBonusModel->USER_ID = $userId; $oneUserBonusModel->BONUS_FREEZE = $amount; } if (!$oneUserBonusModel->save()) { throw new Exception(Form::formatErrorsForApi($oneUserBonusModel->getErrors())); } unset($oneUserBonusModel); // 流水 // 获取发放完成的奖金信息 $oneUserBonus = UserBonus::find()->where('USER_ID=:USER_ID', [':USER_ID' => $userId])->asArray()->one(); // 记录流水 $flowInsertData = [ 'USER_ID' => $userId, 'AMOUNT' => abs($amount), 'TOTAL' => $oneUserBonus['BONUS'], 'IS_INCR' => $amount > 0 ? FlowBonus::INCR_FREEZE : FlowBonus::INCR_UNFREEZE, 'REMARK' => $params['REMARK'] ?? null, 'PERIOD_NUM' => $params['PERIOD_NUM'] ?? $periodNum, 'CALC_MONTH' => $calcYearMonth, 'P_MONTH' => Date::ociToDate(), 'CREATED_AT' => $params['TIME'] ?? Date::nowTime(), ]; FlowBonus::insertOne($flowInsertData); unset($flowInsertData); return true; } /** * 清空会员奖金有流水 * @param $userId * @param array $params * @throws Exception * @throws \yii\db\Exception */ public static function clearAllBonus($userId, $params = []) { // 先查找会员的全部余额 $userBonus = UserBonus::findOne(['USER_ID' => $userId]); // 如果没有会员余额数据,新建余额数据 if (!$userBonus) { UserBonus::insertOne(['USER_ID' => $userId, 'CREATED_AT' => Date::nowTime()]); } else { $period = Period::instance(); foreach (\Yii::$app->params['bonusWalletType'] as $type) { $field = strtoupper($type['name']); if ($userBonus[$field]<=0) continue; $userInfo = Info::getLastInfo($userId); $flowInsertData = [ 'USER_ID' => $userId, 'LAST_DEC_LV' => $userInfo['DEC_LV'], 'LAST_EMP_LV' => $userInfo['EMP_LV'], 'LAST_STATUS' => $userInfo['STATUS'], 'CALC_ID' => $params['CALC_ID'] ?? null, 'AMOUNT' => -$userBonus[$field], 'TOTAL' => 0, 'IS_INCR' => FlowBonus::INCR_REDUCE, 'REMARK' => $params['REMARK'] ?? null, 'REMARK_IS_SHOW' => $params['REMARK_IS_SHOW'] ?? 1, 'PERIOD_NUM' => $params['PERIOD_NUM'] ?? $period->getNowPeriodNum(), 'CALC_MONTH' => $period->getNowYearMonth(), 'P_MONTH' => Date::ociToDate(), 'CREATED_AT' => $params['TIME'] ?? Date::nowTime(), 'ADMIN_NAME' => $params['ADMIN_NAME'] ?? 'system', 'DEAL_TYPE_ID' => $params['DEAL_TYPE_ID'] ?? '', 'DEAL_TYPE_IS_PRESET' => $params['DEAL_TYPE_IS_PRESET'] ?? 1, 'TRANSFER_SN' => $params['TRANSFER_SN'] ?? '', 'SORT' => $params['SORT'] ?? 0, ]; // 流水 if (strtolower($field) == 'bonus') FlowBonus::insertOne($flowInsertData); elseif (strtolower($field) == 'cf') { unset($flowInsertData['CALC_ID']); unset($flowInsertData['SORT']); unset($flowInsertData['TRANSFER_SN']); FlowCF::insertOne($flowInsertData); } elseif (strtolower($field) == 'lx') { unset($flowInsertData['CALC_ID']); unset($flowInsertData['SORT']); unset($flowInsertData['TRANSFER_SN']); FlowLX::insertOne($flowInsertData); } } // 清空 $userBonus->BONUS = 0; $userBonus->CF = 0; $userBonus->LX = 0; if (!$userBonus->save()) { throw new Exception(Form::formatErrorsForApi($userBonus->getErrors())); } } FlowBonus::updateAll(['DELETED' => 1, 'DELETED_AT' => Date::nowTime()], 'USER_ID=:USER_ID', [':USER_ID' => $userId]); FlowCF::updateAll(['DELETED' => 1, 'DELETED_AT' => Date::nowTime()], 'USER_ID=:USER_ID', [':USER_ID' => $userId]); FlowLX::updateAll(['DELETED' => 1, 'DELETED_AT' => Date::nowTime()], 'USER_ID=:USER_ID', [':USER_ID' => $userId]); } /** * 是否存在奖金余额 * @param $userId * @return bool */ public static function hasBonus($userId) { $userBonus = UserBonus::findOne(['USER_ID' => $userId]); if (!$userBonus) { return false; } foreach (\Yii::$app->params['bonusWalletType'] as $type) { $field = strtoupper($type['name']); if (isset($userBonus[$field]) && $userBonus[$field] > 0) { return true; } } return false; } /** * 获取金额用于日志 * @param $userId * @return array */ public static function getLogData($userId){ $userWallet = UserWallet::findOne(['USER_ID' => $userId]); $cash = !empty($userWallet) ? $userWallet['CASH'] : ''; $userName = Info::getUserNameByUserId($userId); $data = []; $data[$userId]['label'] = $userName.'余额'; $data[$userId]['value'] = '奖金'.self::getAvailableBalance($userId).',现金'.$cash; return $data; } }