Balance.php 42 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949
  1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. * User: leo
  5. * Date: 2018/10/30
  6. * Time: 下午3:19
  7. */
  8. namespace common\helpers\user;
  9. use common\components\ActiveRecord;
  10. use common\helpers\Cache;
  11. use common\helpers\Date;
  12. use common\helpers\Form;
  13. use common\libs\lock\RedisLock;
  14. use common\models\FlowBonus;
  15. use common\models\FlowCF;
  16. use common\models\FlowLX;
  17. use common\models\FlowReconsumePoints;
  18. use common\models\FlowZonePoints;
  19. use common\models\InvoiceFlow;
  20. use common\models\Period;
  21. use common\models\DeclarationLevel;
  22. use common\models\DecRole;
  23. use common\models\FlowExchangePoints;
  24. use common\models\UserPeriodPoints;
  25. use common\models\UserWallet;
  26. use common\models\UserBonus;
  27. use common\models\UserInfo;
  28. use common\models\UserPeriodExchangePoints;
  29. use yii\base\Exception;
  30. use yii\db\Expression;
  31. class Balance {
  32. const INCR_REDUCE = 0; // 减少
  33. const INCR_ADD = 1; // 增加
  34. const INCR_FREEZE = 2; // 冻结
  35. const INCR_UNFREEZE = 3; // 解冻
  36. const BONUS_BALANCE_LOCK_KEY = 'Bonus';
  37. const RECONSUME_POINTS_BALANCE_LOCK_KEY = 'reconsumePoints';
  38. const EXCHANGE_POINTS_BALANCE_LOCK_KEY = 'exchangePoints';
  39. const CF_BALANCE_LOCK_KEY = 'CF';
  40. const LX_BALANCE_LOCK_KEY = 'LX';
  41. const INVOICE_BALANCE_LOCK_KEY = 'Invoice';
  42. const TRAVEL_POINTS_BALANCE_LOCK_KEY = 'travelPoints';
  43. const CAR_POINTS_BALANCE_LOCK_KEY = 'carPoints';
  44. const HOUSE_POINTS_BALANCE_LOCK_KEY = 'housePoints';
  45. const BALANCE_TYPE = [
  46. 'exchange' => [
  47. 'id' => 'exchange',
  48. 'title' => '兑换点数',
  49. 'attr' => 'EXCHANGE_POINTS',
  50. 'pv' => false,
  51. ],
  52. 'travel_points' => [
  53. 'id' => 'travel_points',
  54. 'title' => '旅游积分',
  55. 'attr' => 'TRAVEL_POINTS',
  56. 'pv' => false,
  57. ],
  58. 'car_points' => [
  59. 'id' => 'car_points',
  60. 'title' => '名车积分',
  61. 'attr' => 'CAR_POINTS',
  62. 'pv' => false,
  63. ],
  64. 'house_points' => [
  65. 'id' => 'house_points',
  66. 'title' => '豪宅积分',
  67. 'attr' => 'HOUSE_POINTS',
  68. 'pv' => false,
  69. ],
  70. ];
  71. /**
  72. * 发票流水
  73. * @param $userId
  74. * @param $amount
  75. * @param $params
  76. * @return bool
  77. * @throws Exception
  78. * @throws \yii\db\Exception
  79. */
  80. public static function changeInvoice($userId, $amount, $params) {
  81. if ($amount == 0) return true;
  82. $period = Period::instance();
  83. if (!isset($params['PERIOD_NUM'])) {
  84. $periodNum = $period->getNowPeriodNum();
  85. } else {
  86. $periodNum = $params['PERIOD_NUM'];
  87. }
  88. $calcYearMonth = $period->getYearMonth($periodNum);
  89. // redis加锁(防止并发余额数值不准确出错)
  90. $lockKey = self::INVOICE_BALANCE_LOCK_KEY . $userId;
  91. if (RedisLock::instance()->lock($lockKey)) {
  92. $userInfo = UserInfo::findOne(['USER_ID' => $userId]);
  93. $totals = $userInfo->INVOICE_BALANCE + $amount;
  94. $userInfo->INVOICE_BALANCE = $totals;
  95. if (!$userInfo->save()) {
  96. throw new \Exception(Form::formatErrorsForApi($userInfo->getErrors()));
  97. }
  98. //记录流水
  99. $baseInfo = Info::baseInfoZh($userId);
  100. $flowInsertData = [
  101. 'USER_ID' => $userId,
  102. 'REAL_NAME' => $baseInfo['REAL_NAME'],
  103. 'DEC_LV' => $baseInfo['DEC_LV'],
  104. 'EMP_LV' => $baseInfo['EMP_LV'],
  105. 'MOBILE' => $baseInfo['MOBILE'],
  106. 'REG_TYPE' => $userInfo['REG_TYPE'],
  107. 'REG_NAME' => $userInfo['REG_NAME'],
  108. 'CREDIT_CODE' => $userInfo['CREDIT_CODE'],
  109. 'SALE_NAME' => $params['SALE_NAME'] ?? null,
  110. 'TAXPAYER_NUMBER' => $params['TAXPAYER_NUMBER'] ?? null,
  111. 'INVOICE_SN' => $params['INVOICE_SN'] ?? null,
  112. 'INVOICE_ACCOUNT' => $params['INVOICE_ACCOUNT'] ?? null,
  113. 'TAX_ACCOUNT' => $params['TAX_ACCOUNT'] ?? null,
  114. 'OUTED_AT' => $params['OUTED_AT'] ?? 0,
  115. 'AMOUNT' => abs($amount),
  116. 'TOTAL' => $totals,
  117. 'WITHDRAW_SN' => $params['WITHDRAW_SN'] ?? null,
  118. 'IS_INCR' => $amount > 0 ? self::INCR_ADD : self::INCR_REDUCE,
  119. 'PERIOD_NUM' => $periodNum,
  120. 'CALC_MONTH' => $calcYearMonth,
  121. 'REMARK' => $params['REMARK'] ?? null,
  122. 'CREATE_ADMIN' => $params['CREATE_ADMIN'],
  123. 'CREATE_REMARK' => $params['CREATE_REMARK'] ?? null,
  124. 'CREATE_TIME' => $params['CREATE_TIME'],
  125. 'AUDIT_ADMIN' => $params['AUDIT_ADMIN'],
  126. 'AUDIT_REMARK' => $params['AUDIT_REMARK'] ?? null,
  127. 'AUDIT_TIME' => $params['AUDIT_TIME'],
  128. 'P_MONTH' => Date::ociToDate(),
  129. 'CREATED_AT' => $params['TIME'] ?? Date::nowTime(),
  130. ];
  131. InvoiceFlow::insertOne($flowInsertData);
  132. unset($flowInsertData);
  133. RedisLock::instance()->unlock($lockKey);
  134. } else {
  135. throw new Exception('流水产生错误');
  136. }
  137. return true;
  138. }
  139. /**
  140. * 获取当前可用余额
  141. * @param $userId
  142. * @return int|mixed
  143. */
  144. public static function getAvailableBalance($userId) {
  145. $oneData = UserBonus::find()->where('USER_ID=:USER_ID', [':USER_ID' => $userId])->asArray()->one();
  146. if ($oneData) {
  147. return $oneData['BONUS'] - $oneData['BONUS_FREEZE'];
  148. } else {
  149. return 0;
  150. }
  151. }
  152. /**
  153. * 获取当前车房养老奖余额
  154. * @param $userId
  155. * @return int|mixed
  156. */
  157. public static function getBalanceCF($userId) {
  158. $oneData = UserBonus::find()->where('USER_ID=:USER_ID', [':USER_ID' => $userId])->asArray()->one();
  159. if ($oneData) {
  160. return $oneData['CF'];
  161. } else {
  162. return 0;
  163. }
  164. }
  165. /**
  166. * 获取当前复消积分余额
  167. * @param $userId
  168. * @return int|mixed
  169. */
  170. public static function getBalanceReconsumePoints($userId) {
  171. $oneData = UserBonus::find()->where('USER_ID=:USER_ID', [':USER_ID' => $userId])->asArray()->one();
  172. if ($oneData) {
  173. return $oneData['RECONSUME_POINTS'];
  174. } else {
  175. return 0;
  176. }
  177. }
  178. /**
  179. * 获取当前兑换积分余额
  180. * @param $userId
  181. * @return int|mixed
  182. */
  183. public static function getBalanceExchangePoints($userId) {
  184. $oneData = UserBonus::find()->where('USER_ID=:USER_ID', [':USER_ID' => $userId])->asArray()->one();
  185. if ($oneData) {
  186. return $oneData['EXCHANGE_POINTS'];
  187. } else {
  188. return 0;
  189. }
  190. }
  191. /**
  192. * 获取当前车房养老奖余额
  193. * @param $userId
  194. * @return int|mixed
  195. */
  196. public static function getBalanceLX($userId) {
  197. $oneData = UserBonus::find()->where('USER_ID=:USER_ID', [':USER_ID' => $userId])->asArray()->one();
  198. if ($oneData) {
  199. return $oneData['LX'];
  200. } else {
  201. return 0;
  202. }
  203. }
  204. /**
  205. * 查询会员账户余额.
  206. * @param $userId
  207. * @param $payType
  208. * @return int|mixed
  209. */
  210. public static function getAccountBalance($userId, $payType) {
  211. $oneData = UserBonus::find()->where('USER_ID=:USER_ID', [':USER_ID' => $userId])->asArray()->one();
  212. return !$oneData ? 0 : $oneData[Balance::BALANCE_TYPE[$payType]['attr']] ?? 0;
  213. }
  214. /**
  215. * 改变会员的余额
  216. * @param $userId
  217. * @param $type
  218. * @param $amount
  219. * @param array $params
  220. * @param bool $allowMinus
  221. * @return bool
  222. * @throws Exception
  223. * @throws \yii\db\Exception
  224. */
  225. public static function changeUserBonus($userId, $type, $amount, $params = [], $allowMinus = false) {
  226. if (array_key_exists($type, UserBonus::TYPE)) {
  227. $type = strtoupper($type);
  228. }
  229. if ($amount == 0) return true;
  230. $period = Period::instance();
  231. if (!isset($params['PERIOD_NUM'])) {
  232. $periodNum = $period->getNowPeriodNum();
  233. } else {
  234. $periodNum = $params['PERIOD_NUM'];
  235. }
  236. $calcYearMonth = $period->getYearMonth($periodNum);
  237. // 汇率
  238. $exchangeRate = floatval(Cache::getSystemConfig()['exchangeRate']['VALUE'] ?? 0);
  239. // redis加锁(防止并发余额数值不准确出错)
  240. switch ($type) {
  241. case 'BONUS':
  242. $lockKey = self::BONUS_BALANCE_LOCK_KEY . $userId;
  243. break;
  244. case 'RECONSUME_POINTS':
  245. $lockKey = self::RECONSUME_POINTS_BALANCE_LOCK_KEY . $userId;
  246. break;
  247. case 'EXCHANGE_POINTS':
  248. $lockKey = self::EXCHANGE_POINTS_BALANCE_LOCK_KEY . $userId;
  249. break;
  250. case 'CF':
  251. $lockKey = self::CF_BALANCE_LOCK_KEY . $userId;
  252. break;
  253. case 'LX':
  254. $lockKey = self::LX_BALANCE_LOCK_KEY . $userId;
  255. break;
  256. case 'TRAVEL_POINTS':
  257. $lockKey = self::TRAVEL_POINTS_BALANCE_LOCK_KEY . $userId;
  258. break;
  259. case 'CAR_POINTS':
  260. $lockKey = self::CAR_POINTS_BALANCE_LOCK_KEY . $userId;
  261. break;
  262. case 'HOUSE_POINTS':
  263. $lockKey = self::HOUSE_POINTS_BALANCE_LOCK_KEY . $userId;
  264. break;
  265. default:
  266. throw new Exception('流水类型错误');
  267. }
  268. if (RedisLock::instance()->lock($lockKey)) {
  269. // 改变发奖
  270. $paramData = [];
  271. $oneUserBonusModel = UserBonus::findOne(['USER_ID' => $userId]);
  272. // 是否奖金发放操作
  273. $issueBonus = $params['BONUS_ISSUE'] ?? false;
  274. if ($oneUserBonusModel) {
  275. $paramData[$type] = new Expression($type.' + ' . ($issueBonus ? $amount * $exchangeRate : $amount));
  276. $oneUserBonusModel->$type += ($issueBonus ? $amount * $exchangeRate : $amount);
  277. if ($oneUserBonusModel->$type < 0) {
  278. RedisLock::instance()->unlock($lockKey);
  279. throw new Exception('金额不足');
  280. }
  281. if (isset($params['QY'])) {
  282. $paramData['QY_TOTAL'] = new Expression('QY_TOTAL + ' . ($issueBonus ? $params['QY'] * $exchangeRate : $params['QY']));
  283. //$oneUserBonusModel->QY_TOTAL += $params['QY'];
  284. }
  285. if (isset($params['FW'])) {
  286. $paramData['FW_TOTAL'] = new Expression('FW_TOTAL + ' . ($issueBonus ? $params['FW'] * $exchangeRate : $params['FW']));
  287. }
  288. if (isset($params['YC'])) {
  289. $paramData['YC_TOTAL'] = new Expression('YC_TOTAL + ' . ($issueBonus ? $params['YC'] * $exchangeRate : $params['YC']));
  290. //$oneUserBonusModel->YC_TOTAL += $params['YC'];
  291. }
  292. if (isset($params['VIP'])) {
  293. $paramData['VIP_TOTAL'] = new Expression('VIP_TOTAL + ' . ($issueBonus ? $params['VIP'] * $exchangeRate : $params['VIP']));
  294. }
  295. if (isset($params['BD'])) {
  296. $paramData['BD_TOTAL'] = new Expression('BD_TOTAL + ' . ($issueBonus ? $params['BD'] * $exchangeRate : $params['BD']));
  297. //$oneUserBonusModel->BD_TOTAL += $params['BD'];
  298. }
  299. if (isset($params['TG'])) {
  300. $paramData['TG_TOTAL'] = new Expression('TG_TOTAL + ' . ($issueBonus ? $params['TG'] * $exchangeRate : $params['TG']));
  301. //$oneUserBonusModel->TG_TOTAL += $params['TG'];
  302. }
  303. if (isset($params['YJ'])) {
  304. $paramData['YJ_TOTAL'] = new Expression('YJ_TOTAL + ' . ($issueBonus ? $params['YJ'] * $exchangeRate : $params['YJ']));
  305. //$oneUserBonusModel->YJ_TOTAL += $params['YJ'];
  306. }
  307. if (isset($params['GX'])) {
  308. $paramData['GX_TOTAL'] = new Expression('GX_TOTAL + ' . ($issueBonus ? $params['GX'] * $exchangeRate : $params['GX']));
  309. //$oneUserBonusModel->GX_TOTAL += $params['GX'];
  310. }
  311. if (isset($params['GL'])) {
  312. $paramData['GL_TOTAL'] = new Expression('GL_TOTAL + ' . ($issueBonus ? $params['GL'] * $exchangeRate : $params['GL']));
  313. //$oneUserBonusModel->GL_TOTAL += $params['GL'];
  314. }
  315. if (isset($params['BS'])) {
  316. $paramData['BS_TOTAL'] = new Expression('BS_TOTAL + ' . ($issueBonus ? $params['BS'] * $exchangeRate : $params['BS']));
  317. }
  318. if (isset($params['BS_MNT'])) {
  319. $paramData['BS_MNT_TOTAL'] = new Expression('BS_MNT_TOTAL + ' . ($issueBonus ? $params['BS_MNT'] * $exchangeRate : $params['BS_MNT']));
  320. }
  321. if (isset($params['BS_ABBR'])) {
  322. $paramData['BS_ABBR_TOTAL'] = new Expression('BS_ABBR_TOTAL + ' . ($issueBonus ? $params['BS_ABBR'] * $exchangeRate : $params['BS_ABBR']));
  323. }
  324. if (isset($params['TRAVEL_POINTS'])) {
  325. $paramData['TRAVEL_POINTS_TOTAL'] = new Expression('TRAVEL_POINTS_TOTAL + ' . ($issueBonus ? $params['TRAVEL_POINTS'] * $exchangeRate : $params['TRAVEL_POINTS']));
  326. }
  327. if (isset($params['CAR_POINTS'])) {
  328. $paramData['CAR_POINTS_TOTAL'] = new Expression('CAR_POINTS_TOTAL + ' . ($issueBonus ? $params['CAR_POINTS'] * $exchangeRate : $params['CAR_POINTS']));
  329. }
  330. if (isset($params['HOUSE_POINTS'])) {
  331. $paramData['HOUSE_POINTS_TOTAL'] = new Expression('HOUSE_POINTS_TOTAL + ' . ($issueBonus ? $params['HOUSE_POINTS'] * $exchangeRate : $params['HOUSE_POINTS']));
  332. }
  333. if (isset($params['RECONSUME_POINTS_TOTAL'])) {
  334. $paramData['RECONSUME_POINTS_TOTAL'] = new Expression('RECONSUME_POINTS_TOTAL + ' . ($issueBonus ? $params['RECONSUME_POINTS_TOTAL'] * $exchangeRate : $params['RECONSUME_POINTS_TOTAL']));
  335. //$oneUserBonusModel->RECONSUME_POINTS_TOTAL += $params['RECONSUME_POINTS_TOTAL'];
  336. }
  337. if (isset($params['EXCHANGE_POINTS_TOTAL'])) {
  338. $paramData['EXCHANGE_POINTS_TOTAL'] = new Expression('EXCHANGE_POINTS_TOTAL + ' . ($issueBonus ? $params['EXCHANGE_POINTS_TOTAL'] * $exchangeRate : $params['EXCHANGE_POINTS_TOTAL']));
  339. //$oneUserBonusModel->RECONSUME_POINTS_TOTAL += $params['RECONSUME_POINTS_TOTAL'];
  340. }
  341. if (isset($params['MANAGE_TAX'])) {
  342. $paramData['MANAGE_TAX'] = new Expression('MANAGE_TAX + ' . ($issueBonus ? $params['MANAGE_TAX'] * $exchangeRate : $params['MANAGE_TAX']));
  343. //$oneUserBonusModel->MANAGE_TAX += $params['MANAGE_TAX'];
  344. }
  345. if (isset($params['ORI_QY'])) {
  346. $paramData['ORI_QY_TOTAL'] = new Expression('ORI_QY_TOTAL + ' . ($issueBonus ? $params['ORI_QY'] * $exchangeRate : $params['ORI_QY']));
  347. //$oneUserBonusModel->ORI_QY_TOTAL += $params['ORI_QY'];
  348. }
  349. // if (isset($params['ORI_FW'])) {
  350. // $paramData['ORI_FW_TOTAL'] = new Expression('ORI_FW_TOTAL + '.$params['ORI_FW']);
  351. // }
  352. if (isset($params['ORI_YC'])) {
  353. $paramData['ORI_YC_TOTAL'] = new Expression('ORI_YC_TOTAL + ' . ($issueBonus ? $params['ORI_YC'] * $exchangeRate : $params['ORI_YC']));
  354. //$oneUserBonusModel->ORI_YC_TOTAL += $params['ORI_YC'];
  355. }
  356. if (isset($params['ORI_VIP'])) {
  357. $paramData['ORI_VIP_TOTAL'] = new Expression('ORI_VIP_TOTAL + ' . ($issueBonus ? $params['ORI_VIP'] * $exchangeRate : $params['ORI_VIP']));
  358. }
  359. if (isset($params['ORI_STANDARD'])) {
  360. $paramData['ORI_STANDARD_TOTAL'] = new Expression('ORI_STANDARD_TOTAL + ' . ($issueBonus ? $params['ORI_STANDARD'] * $exchangeRate : $params['ORI_STANDARD']));
  361. }
  362. if (isset($params['ORI_TG'])) {
  363. $paramData['ORI_TG_TOTAL'] = new Expression('ORI_TG_TOTAL + ' . ($issueBonus ? $params['ORI_TG'] * $exchangeRate : $params['ORI_TG']));
  364. //$oneUserBonusModel->ORI_TG_TOTAL += $params['ORI_TG'];
  365. }
  366. if (isset($params['ORI_YJ'])) {
  367. $paramData['ORI_YJ_TOTAL'] = new Expression('ORI_YJ_TOTAL + ' . ($issueBonus ? $params['ORI_YJ'] * $exchangeRate : $params['ORI_YJ']));
  368. //$oneUserBonusModel->ORI_YJ_TOTAL += $params['ORI_YJ'];
  369. }
  370. if (isset($params['ORI_GX'])) {
  371. $paramData['ORI_GX_TOTAL'] = new Expression('ORI_GX_TOTAL + ' . ($issueBonus ? $params['ORI_GX'] * $exchangeRate : $params['ORI_GX']));
  372. //$oneUserBonusModel->ORI_GX_TOTAL += $params['ORI_GX'];
  373. }
  374. if (isset($params['ORI_GL'])) {
  375. $paramData['ORI_GL_TOTAL'] = new Expression('ORI_GL_TOTAL + ' . ($issueBonus ? $params['ORI_GL'] * $exchangeRate : $params['ORI_GL']));
  376. //$oneUserBonusModel->ORI_GL_TOTAL += $params['ORI_GL'];
  377. }
  378. if (isset($params['ORI_BS'])) {
  379. $paramData['ORI_BS_TOTAL'] = new Expression('ORI_BS_TOTAL + ' . ($issueBonus ? $params['ORI_BS'] * $exchangeRate : $params['ORI_BS']));
  380. //$oneUserBonusModel->ORI_GL_TOTAL += $params['ORI_GL'];
  381. }
  382. if (isset($params['ORI_BS_MNT'])) {
  383. $paramData['BS_MNT_ORI_TOTAL'] = new Expression('BS_MNT_ORI_TOTAL + ' . ($issueBonus ? $params['ORI_BS_MNT'] * $exchangeRate : $params['ORI_BS_MNT']));
  384. //$oneUserBonusModel->ORI_GL_TOTAL += $params['ORI_GL'];
  385. }
  386. if (isset($params['ORI_BS_ABBR'])) {
  387. $paramData['BS_ABBR_ORI_TOTAL'] = new Expression('BS_ABBR_ORI_TOTAL + ' . ($issueBonus ? $params['ORI_BS_ABBR'] * $exchangeRate : $params['ORI_BS_ABBR']));
  388. //$oneUserBonusModel->ORI_GL_TOTAL += $params['ORI_GL'];
  389. }
  390. if (isset($params['BONUS_TOTAL'])) {
  391. $paramData['BONUS_TOTAL'] = new Expression('BONUS_TOTAL + ' . ($issueBonus ? $params['BONUS_TOTAL'] * $exchangeRate : $params['BONUS_TOTAL']));
  392. //$oneUserBonusModel->BONUS_TOTAL += $params['BONUS_TOTAL'];
  393. }
  394. UserBonus::updateAll($paramData, 'USER_ID=:USER_ID', [':USER_ID' => $userId]);
  395. } else {
  396. $paramData = [
  397. 'USER_ID'=>$userId,
  398. $type=>$amount,
  399. 'CREATED_AT'=>Date::nowTime()
  400. ];
  401. if (isset($params['QY'])) {
  402. // $paramData['QY_TOTAL'] = new Expression('QY_TOTAL + '.$params['QY']);
  403. $paramData['QY_TOTAL'] = ($issueBonus ? $params['QY'] * $exchangeRate : $params['QY']);
  404. }
  405. if (isset($params['FW'])) {
  406. // $paramData['FW_TOTAL'] = new Expression('FW_TOTAL + '.$params['FW']);
  407. $paramData['FW_TOTAL'] = ($issueBonus ? $params['FW'] * $exchangeRate : $params['FW']);
  408. }
  409. if (isset($params['YC'])) {
  410. // $paramData['YC_TOTAL'] = new Expression('YC_TOTAL + '.$params['YC']);
  411. $paramData['YC_TOTAL'] = ($issueBonus ? $params['YC'] * $exchangeRate : $params['YC']);
  412. }
  413. if (isset($params['VIP'])) {
  414. // $paramData['VIP_TOTAL'] = new Expression('VIP_TOTAL + '.$params['VIP']);
  415. $paramData['VIP_TOTAL'] = ($issueBonus ? $params['VIP'] * $exchangeRate : $params['VIP']);
  416. }
  417. if (isset($params['BD'])) {
  418. // $paramData['BD_TOTAL'] = new Expression('BD_TOTAL + '.$params['BD']);
  419. $paramData['BD_TOTAL'] = ($issueBonus ? $params['BD'] * $exchangeRate : $params['BD']);
  420. //$oneUserBonusModel->BD_TOTAL += $params['BD'];
  421. }
  422. if (isset($params['TG'])) {
  423. // $paramData['TG_TOTAL'] = new Expression('TG_TOTAL + '.$params['TG']);
  424. $paramData['TG_TOTAL'] = ($issueBonus ? $params['TG'] * $exchangeRate : $params['TG']);
  425. }
  426. if (isset($params['YJ'])) {
  427. // $paramData['YJ_TOTAL'] = new Expression('YJ_TOTAL + '.$params['YJ']);
  428. $paramData['YJ_TOTAL'] = ($issueBonus ? $params['YJ'] * $exchangeRate : $params['YJ']);
  429. }
  430. if (isset($params['GX'])) {
  431. // $paramData['GX_TOTAL'] = new Expression('GX_TOTAL + '.$params['GX']);
  432. $paramData['GX_TOTAL'] = ($issueBonus ? $params['GX'] * $exchangeRate : $params['GX']);
  433. }
  434. if (isset($params['GL'])) {
  435. // $paramData['GL_TOTAL'] = new Expression('GL_TOTAL + '.$params['GL']);
  436. $paramData['GL_TOTAL'] = ($issueBonus ? $params['GL'] * $exchangeRate : $params['GL']);
  437. }
  438. if (isset($params['BS'])) {
  439. $paramData['BS_TOTAL'] = ($issueBonus ? $params['BS'] * $exchangeRate : $params['BS']);
  440. //$oneUserBonusModel->GL_TOTAL += $params['GL'];
  441. }
  442. if (isset($params['BS_MNT'])) {
  443. $paramData['BS_MNT_TOTAL'] = ($issueBonus ? $params['BS_MNT'] * $exchangeRate : $params['BS_MNT']);
  444. }
  445. if (isset($params['BS_ABBR'])) {
  446. $paramData['BS_ABBR_TOTAL'] = ($issueBonus ? $params['BS_ABBR'] * $exchangeRate : $params['BS_ABBR']);
  447. }
  448. if (isset($params['TRAVEL_POINTS'])) {
  449. $paramData['TRAVEL_POINTS_TOTAL'] = ($issueBonus ? $params['TRAVEL_POINTS'] * $exchangeRate : $params['TRAVEL_POINTS']);
  450. }
  451. if (isset($params['CAR_POINTS'])) {
  452. $paramData['CAR_POINTS_TOTAL'] = ($issueBonus ? $params['CAR_POINTS'] * $exchangeRate : $params['CAR_POINTS']);
  453. }
  454. if (isset($params['HOUSE_POINTS'])) {
  455. $paramData['HOUSE_POINTS_TOTAL'] = ($issueBonus ? $params['HOUSE_POINTS'] * $exchangeRate : $params['HOUSE_POINTS']);
  456. }
  457. if (isset($params['RECONSUME_POINTS_TOTAL'])) {
  458. // $paramData['RECONSUME_POINTS_TOTAL'] = new Expression('RECONSUME_POINTS_TOTAL + '.$params['RECONSUME_POINTS_TOTAL']);
  459. $paramData['RECONSUME_POINTS_TOTAL'] = ($issueBonus ? $params['RECONSUME_POINTS_TOTAL'] * $exchangeRate : $params['RECONSUME_POINTS_TOTAL']);
  460. }
  461. if (isset($params['MANAGE_TAX'])) {
  462. // $paramData['MANAGE_TAX'] = new Expression('MANAGE_TAX + '.$params['MANAGE_TAX']);
  463. $paramData['MANAGE_TAX'] = ($issueBonus ? $params['MANAGE_TAX'] * $exchangeRate : $params['MANAGE_TAX']);
  464. }
  465. if (isset($params['ORI_QY'])) {
  466. // $paramData['ORI_QY_TOTAL'] = new Expression('ORI_QY_TOTAL + '.$params['ORI_QY']);
  467. $paramData['ORI_QY_TOTAL'] = ($issueBonus ? $params['ORI_QY'] * $exchangeRate : $params['ORI_QY']);
  468. }
  469. // if (isset($params['ORI_FW'])) {
  470. //// $paramData['ORI_FW_TOTAL'] = new Expression('ORI_FW_TOTAL + '.$params['ORI_FW']);
  471. // $paramData['ORI_FW_TOTAL'] = $params['ORI_FW'];
  472. // }
  473. if (isset($params['ORI_YC'])) {
  474. // $paramData['ORI_YC_TOTAL'] = new Expression('ORI_YC_TOTAL + '.$params['ORI_YC']);
  475. $paramData['ORI_YC_TOTAL'] = ($issueBonus ? $params['ORI_YC'] * $exchangeRate : $params['ORI_YC']);
  476. }
  477. if (isset($params['ORI_VIP'])) {
  478. // $paramData['ORI_VIP_TOTAL'] = new Expression('ORI_VIP_TOTAL + '.$params['ORI_VIP']);
  479. $paramData['ORI_VIP_TOTAL'] = ($issueBonus ? $params['ORI_VIP'] * $exchangeRate : $params['ORI_VIP']);
  480. }
  481. if (isset($params['ORI_STANDARD'])) {
  482. $paramData['ORI_STANDARD_TOTAL'] = ($issueBonus ? $params['ORI_STANDARD'] * $exchangeRate : $params['ORI_STANDARD']);
  483. }
  484. if (isset($params['ORI_BD'])) {
  485. // $paramData['ORI_BD_TOTAL'] = new Expression('ORI_BD_TOTAL + '.$params['ORI_BD']);
  486. $paramData['ORI_BD_TOTAL'] = ($issueBonus ? $params['ORI_BD'] * $exchangeRate : $params['ORI_BD']);
  487. }
  488. if (isset($params['ORI_TG'])) {
  489. // $paramData['ORI_TG_TOTAL'] = new Expression('ORI_TG_TOTAL + '.$params['ORI_TG']);
  490. $paramData['ORI_TG_TOTAL'] = ($issueBonus ? $params['ORI_TG'] * $exchangeRate : $params['ORI_TG']);
  491. }
  492. if (isset($params['ORI_YJ'])) {
  493. // $paramData['ORI_YJ_TOTAL'] = new Expression('ORI_YJ_TOTAL + '.$params['ORI_YJ']);
  494. $paramData['ORI_YJ_TOTAL'] = ($issueBonus ? $params['ORI_YJ'] * $exchangeRate : $params['ORI_YJ']);
  495. }
  496. if (isset($params['ORI_GX'])) {
  497. // $paramData['ORI_GX_TOTAL'] = new Expression('ORI_GX_TOTAL + '.$params['ORI_GX']);
  498. $paramData['ORI_GX_TOTAL'] = ($issueBonus ? $params['ORI_GX'] * $exchangeRate : $params['ORI_GX']);
  499. }
  500. if (isset($params['ORI_GL'])) {
  501. // $paramData['ORI_GL_TOTAL'] = new Expression('ORI_GL_TOTAL + '.$params['ORI_GL']);
  502. $paramData['ORI_GL_TOTAL'] = ($issueBonus ? $params['ORI_GL'] * $exchangeRate : $params['ORI_GL']);
  503. }
  504. if (isset($params['ORI_BS'])) {
  505. $paramData['ORI_BS_TOTAL'] = ($issueBonus ? $params['ORI_BS'] * $exchangeRate : $params['ORI_BS']);
  506. //$oneUserBonusModel->ORI_GL_TOTAL += $params['ORI_GL'];
  507. }
  508. if (isset($params['ORI_BS_MNT'])) {
  509. $paramData['BS_MNT_ORI_TOTAL'] = ($issueBonus ? $params['ORI_BS_MNT'] * $exchangeRate : $params['ORI_BS_MNT']);
  510. }
  511. if (isset($params['ORI_BS_ABBR'])) {
  512. $paramData['BS_ABBR_ORI_TOTAL'] = ($issueBonus ? $params['ORI_BS_ABBR'] * $exchangeRate : $params['ORI_BS_ABBR']);
  513. }
  514. if (isset($params['BONUS_TOTAL'])) {
  515. // $paramData['BONUS_TOTAL'] = new Expression('BONUS_TOTAL + '.$params['BONUS_TOTAL']);
  516. $paramData['BONUS_TOTAL'] = ($issueBonus ? $params['BONUS_TOTAL'] * $exchangeRate : $params['BONUS_TOTAL']);
  517. }
  518. UserBonus::insertOne($paramData);
  519. }
  520. unset($oneUserBonusModel,$paramData);
  521. // 获取发放完成的奖金信息
  522. $oneUserBonus = UserBonus::find()->where('USER_ID=:USER_ID', [':USER_ID' => $userId])->asArray()->one();
  523. $userInfo = Info::getLastInfo($userId);
  524. // 记录流水
  525. $flowInsertData = [
  526. 'USER_ID' => $userId,
  527. 'LAST_DEC_LV' => $userInfo['DEC_LV'],
  528. 'LAST_EMP_LV' => $userInfo['EMP_LV'],
  529. 'LAST_STATUS' => $userInfo['STATUS'],
  530. 'CALC_ID' => $params['CALC_ID'] ?? null,
  531. 'AMOUNT' => ($issueBonus ? $amount * $exchangeRate : $amount),
  532. 'AMOUNT_STANDARD' => (!$issueBonus ? $amount / $exchangeRate : $amount),
  533. 'EXCHANGE_RATE' => $exchangeRate,
  534. 'TOTAL' => $oneUserBonus[$type],
  535. 'IS_INCR' => $amount > 0 ? FlowBonus::INCR_ADD : FlowBonus::INCR_REDUCE,
  536. 'REMARK' => $params['REMARK'] ?? null,
  537. 'REMARK_IS_SHOW' => $params['REMARK_IS_SHOW'] ?? 1,
  538. 'PERIOD_NUM' => $params['PERIOD_NUM'] ?? $periodNum,
  539. 'CALC_MONTH' => $calcYearMonth,
  540. 'P_MONTH' => Date::ociToDate(),
  541. 'CREATED_AT' => $params['TIME'] ?? Date::nowTime(),
  542. 'ADMIN_NAME' => $params['ADMIN_NAME'] ?? 'system',
  543. 'DEAL_TYPE_ID' => $params['DEAL_TYPE_ID'] ?? '',
  544. 'DEAL_TYPE_IS_PRESET' => $params['DEAL_TYPE_IS_PRESET'] ?? 1,
  545. 'TRANSFER_SN' => $params['TRANSFER_SN'] ?? '',
  546. 'SORT' => $params['SORT'] ?? 0,
  547. ];
  548. unset($userInfo, $oneUserBonus);
  549. if (strtolower($type) == 'reconsume_points' || strtolower($type) == 'cf' || strtolower($type) == 'lx'
  550. || strtolower($type) == 'exchange_points'
  551. ) {
  552. unset($flowInsertData['CALC_ID']);
  553. unset($flowInsertData['TRANSFER_SN']);
  554. unset($flowInsertData['SORT']);
  555. }
  556. if (strtolower($type) == 'bonus') {
  557. FlowBonus::insertOne($flowInsertData);
  558. // } elseif (strtolower($type) == 'reconsume_points') {
  559. // //记录和扣除期数的积分
  560. // if( $amount > 0 ) {
  561. // self::addPeriodReconsumePoints($userId, $periodNum, $amount);
  562. // }else {
  563. // self::deductPeriodReconsumePoints($userId, abs($amount));
  564. // }
  565. // FlowReconsumePoints::insertOne($flowInsertData);
  566. } elseif (strtolower($type) == 'exchange_points') {
  567. //记录和扣除期数的积分
  568. if( $amount > 0 ) {
  569. self::addPeriodExchangePoints($userId, $periodNum, (!$issueBonus ? $amount / $exchangeRate : $amount));
  570. }else {
  571. self::deductPeriodExchangePoints($userId, abs($amount));
  572. }
  573. FlowExchangePoints::insertOne($flowInsertData);
  574. // } elseif (strtolower($type) == 'cf') {
  575. // FlowCF::insertOne($flowInsertData);
  576. // } elseif (strtolower($type) == 'lx') {
  577. // FlowLX::insertOne($flowInsertData);
  578. } elseif (in_array(strtolower($type), ['travel_points', 'car_points', 'house_points'])) {
  579. // 这3个奖流水在一个表,需要加二级标识码
  580. $flowInsertData['WALLET_TYPE'] = strtolower($type);
  581. FlowZonePoints::insertOne($flowInsertData);
  582. }
  583. unset($flowInsertData);
  584. RedisLock::instance()->unlock($lockKey);
  585. } else {
  586. throw new Exception('流水产生错误');
  587. }
  588. return true;
  589. }
  590. /**
  591. * 添加对应期数的复消积分
  592. * @param $userId
  593. * @param $periodNum
  594. * @param $amount
  595. * @throws \yii\db\Exception
  596. * @return boolean
  597. */
  598. public static function addPeriodReconsumePoints($userId, $periodNum, $amount) {
  599. if($amount <= 0) return false;
  600. $exists = UserPeriodPoints::find()->where('USER_ID=:USER_ID AND PERIOD_NUM=:PERIOD_NUM', [
  601. 'USER_ID' => $userId,
  602. 'PERIOD_NUM' => $periodNum,
  603. ])->asArray()->exists();
  604. if( $exists ) {
  605. UserPeriodPoints::updateAllCounters([
  606. 'RECONSUME_POINTS' => $amount,
  607. 'REMAINDER_POINTS' => $amount,
  608. ], 'USER_ID=:USER_ID AND PERIOD_NUM=:PERIOD_NUM', [
  609. 'USER_ID' => $userId,
  610. 'PERIOD_NUM' => $periodNum,
  611. ]);
  612. }else {
  613. UserPeriodPoints::insertOne([
  614. 'USER_ID' => $userId,
  615. 'PERIOD_NUM' => $periodNum,
  616. 'RECONSUME_POINTS' => $amount,
  617. 'REMAINDER_POINTS' => $amount,
  618. 'EXPIRED' => 0,
  619. 'CREATED_AT' => Date::nowTime()
  620. ]);
  621. }
  622. return true;
  623. }
  624. /**
  625. * 添加对应期数的兑换积分
  626. * @param $userId
  627. * @param $periodNum
  628. * @param $amount
  629. * @throws \yii\db\Exception
  630. * @return boolean
  631. */
  632. public static function addPeriodExchangePoints($userId, $periodNum, $amount) {
  633. if($amount <= 0) return false;
  634. $exists = UserPeriodExchangePoints::find()->where('USER_ID=:USER_ID AND PERIOD_NUM=:PERIOD_NUM', [
  635. 'USER_ID' => $userId,
  636. 'PERIOD_NUM' => $periodNum,
  637. ])->asArray()->exists();
  638. if( $exists ) {
  639. UserPeriodExchangePoints::updateAllCounters([
  640. 'EXCHANGE_POINTS' => $amount,
  641. 'REMAINDER_POINTS' => $amount,
  642. ], 'USER_ID=:USER_ID AND PERIOD_NUM=:PERIOD_NUM', [
  643. 'USER_ID' => $userId,
  644. 'PERIOD_NUM' => $periodNum,
  645. ]);
  646. }else {
  647. UserPeriodExchangePoints::insertOne([
  648. 'USER_ID' => $userId,
  649. 'PERIOD_NUM' => $periodNum,
  650. 'EXCHANGE_POINTS' => $amount,
  651. 'REMAINDER_POINTS' => $amount,
  652. 'EXPIRED' => 0,
  653. 'CREATED_AT' => Date::nowTime()
  654. ]);
  655. }
  656. return true;
  657. }
  658. /**
  659. * 减少
  660. * @param $userId
  661. * @param $amount
  662. * @return bool
  663. */
  664. public static function deductPeriodReconsumePoints($userId, $amount) {
  665. if( $amount <= 0 ) return false;
  666. $avalidList = UserPeriodPoints::find()->where('USER_ID=:USER_ID AND EXPIRED=:EXPIRED AND REMAINDER_POINTS>0', [
  667. 'USER_ID' => $userId,
  668. 'EXPIRED'=>0
  669. ])->orderBy('PERIOD_NUM ASC')->asArray()->all();
  670. if( !$avalidList ) return false;
  671. foreach ($avalidList as $everyData) {
  672. if( $amount <= 0 ) break;
  673. $remainderPoints = floatval($everyData['REMAINDER_POINTS']);
  674. if( $amount >= $remainderPoints ) {
  675. UserPeriodPoints::updateAllCounters([
  676. 'REMAINDER_POINTS' => (-1) * $remainderPoints
  677. ], 'ID=:ID', ['ID'=>$everyData['ID']]);
  678. $amount -= $remainderPoints;
  679. }else {
  680. UserPeriodPoints::updateAllCounters([
  681. 'REMAINDER_POINTS' => (-1) * $amount
  682. ], 'ID=:ID', ['ID'=>$everyData['ID']]);
  683. $amount = 0;
  684. }
  685. unset($everyData, $remainderPoints);
  686. }
  687. if( $amount > 0 ) return false;
  688. return true;
  689. }
  690. /**
  691. * 减少
  692. * @param $userId
  693. * @param $amount
  694. * @return bool
  695. */
  696. public static function deductPeriodExchangePoints($userId, $amount) {
  697. if( $amount <= 0 ) return false;
  698. $avalidList = UserPeriodExchangePoints::find()->where('USER_ID=:USER_ID AND EXPIRED=:EXPIRED AND REMAINDER_POINTS>0', [
  699. 'USER_ID' => $userId,
  700. 'EXPIRED'=>0
  701. ])->orderBy('PERIOD_NUM ASC')->asArray()->all();
  702. if( !$avalidList ) return false;
  703. foreach ($avalidList as $everyData) {
  704. if( $amount <= 0 ) break;
  705. $remainderPoints = floatval($everyData['REMAINDER_POINTS']);
  706. if( $amount >= $remainderPoints ) {
  707. UserPeriodExchangePoints::updateAllCounters([
  708. 'REMAINDER_POINTS' => (-1) * $remainderPoints
  709. ], 'ID=:ID', ['ID'=>$everyData['ID']]);
  710. $amount -= $remainderPoints;
  711. }else {
  712. UserPeriodExchangePoints::updateAllCounters([
  713. 'REMAINDER_POINTS' => (-1) * $amount
  714. ], 'ID=:ID', ['ID'=>$everyData['ID']]);
  715. $amount = 0;
  716. }
  717. unset($everyData, $remainderPoints);
  718. }
  719. if( $amount > 0 ) return false;
  720. return true;
  721. }
  722. /**
  723. * 冻结用户余额
  724. * @param $userId
  725. * @param $amount
  726. * @param null $remark
  727. * @param null $time
  728. * @return bool
  729. * @throws Exception
  730. * @throws \yii\db\Exception
  731. */
  732. public static function freezeUserBonus($userId, $amount, $remark = null, $time = null) {
  733. return self::changeFreezeUserBonus($userId, $amount, ['REMARK' => $remark, 'TIME' => $time]);
  734. }
  735. /**
  736. * 解冻用户余额
  737. * @param $userId
  738. * @param $amount
  739. * @param null $remark
  740. * @param null $time
  741. * @return bool
  742. * @throws Exception
  743. * @throws \yii\db\Exception
  744. */
  745. public static function unfreezeUserBonus($userId, $amount, $remark = null, $time = null) {
  746. return self::changeFreezeUserBonus($userId, -$amount, ['REMARK' => $remark, 'TIME' => $time]);
  747. }
  748. /**
  749. * @param $userId
  750. * @param $amount
  751. * @param $params
  752. * [
  753. * 'REMARK' => '备注',
  754. * 'PERIOD_NUM' => 100,
  755. * ]
  756. * @return bool
  757. * @throws Exception
  758. * @throws \yii\db\Exception
  759. */
  760. public static function changeFreezeUserBonus($userId, $amount, $params) {
  761. if ($amount == 0) return true;
  762. $period = Period::instance();
  763. if (!isset($params['PERIOD_NUM'])) {
  764. $periodNum = $period->getNowPeriodNum();
  765. } else {
  766. $periodNum = $params['PERIOD_NUM'];
  767. }
  768. $calcYearMonth = $period->getYearMonth($periodNum);
  769. // 改变冻结
  770. $oneUserBonusModel = UserBonus::findOne(['USER_ID' => $userId]);
  771. if ($oneUserBonusModel) {
  772. $oneUserBonusModel->BONUS_FREEZE = $oneUserBonusModel->BONUS_FREEZE + $amount;
  773. } else {
  774. $oneUserBonusModel = new UserBonus();
  775. $oneUserBonusModel->USER_ID = $userId;
  776. $oneUserBonusModel->BONUS_FREEZE = $amount;
  777. }
  778. if (!$oneUserBonusModel->save()) {
  779. throw new Exception(Form::formatErrorsForApi($oneUserBonusModel->getErrors()));
  780. }
  781. unset($oneUserBonusModel);
  782. // 流水
  783. // 获取发放完成的奖金信息
  784. $oneUserBonus = UserBonus::find()->where('USER_ID=:USER_ID', [':USER_ID' => $userId])->asArray()->one();
  785. // 记录流水
  786. $flowInsertData = [
  787. 'USER_ID' => $userId,
  788. 'AMOUNT' => abs($amount),
  789. 'TOTAL' => $oneUserBonus['BONUS'],
  790. 'IS_INCR' => $amount > 0 ? FlowBonus::INCR_FREEZE : FlowBonus::INCR_UNFREEZE,
  791. 'REMARK' => $params['REMARK'] ?? null,
  792. 'PERIOD_NUM' => $params['PERIOD_NUM'] ?? $periodNum,
  793. 'CALC_MONTH' => $calcYearMonth,
  794. 'P_MONTH' => Date::ociToDate(),
  795. 'CREATED_AT' => $params['TIME'] ?? Date::nowTime(),
  796. ];
  797. FlowBonus::insertOne($flowInsertData);
  798. unset($flowInsertData);
  799. return true;
  800. }
  801. /**
  802. * 清空会员奖金有流水
  803. * @param $userId
  804. * @param array $params
  805. * @throws Exception
  806. * @throws \yii\db\Exception
  807. */
  808. public static function clearAllBonus($userId, $params = []) {
  809. // 先查找会员的全部余额
  810. $userBonus = UserBonus::findOne(['USER_ID' => $userId]);
  811. // 如果没有会员余额数据,新建余额数据
  812. if (!$userBonus) {
  813. UserBonus::insertOne(['USER_ID' => $userId, 'CREATED_AT' => Date::nowTime()]);
  814. } else {
  815. $period = Period::instance();
  816. foreach (\Yii::$app->params['bonusWalletType'] as $type) {
  817. $field = strtoupper($type['name']);
  818. if ($userBonus[$field]<=0) continue;
  819. $userInfo = Info::getLastInfo($userId);
  820. $flowInsertData = [
  821. 'USER_ID' => $userId,
  822. 'LAST_DEC_LV' => $userInfo['DEC_LV'],
  823. 'LAST_EMP_LV' => $userInfo['EMP_LV'],
  824. 'LAST_STATUS' => $userInfo['STATUS'],
  825. 'CALC_ID' => $params['CALC_ID'] ?? null,
  826. 'AMOUNT' => -$userBonus[$field],
  827. 'TOTAL' => 0,
  828. 'IS_INCR' => FlowBonus::INCR_REDUCE,
  829. 'REMARK' => $params['REMARK'] ?? null,
  830. 'REMARK_IS_SHOW' => $params['REMARK_IS_SHOW'] ?? 1,
  831. 'PERIOD_NUM' => $params['PERIOD_NUM'] ?? $period->getNowPeriodNum(),
  832. 'CALC_MONTH' => $period->getNowYearMonth(),
  833. 'P_MONTH' => Date::ociToDate(),
  834. 'CREATED_AT' => $params['TIME'] ?? Date::nowTime(),
  835. 'ADMIN_NAME' => $params['ADMIN_NAME'] ?? 'system',
  836. 'DEAL_TYPE_ID' => $params['DEAL_TYPE_ID'] ?? '',
  837. 'DEAL_TYPE_IS_PRESET' => $params['DEAL_TYPE_IS_PRESET'] ?? 1,
  838. 'TRANSFER_SN' => $params['TRANSFER_SN'] ?? '',
  839. 'SORT' => $params['SORT'] ?? 0,
  840. ];
  841. // 流水
  842. if (strtolower($field) == 'bonus') FlowBonus::insertOne($flowInsertData);
  843. elseif (strtolower($field) == 'cf') {
  844. unset($flowInsertData['CALC_ID']);
  845. unset($flowInsertData['SORT']);
  846. unset($flowInsertData['TRANSFER_SN']);
  847. FlowCF::insertOne($flowInsertData);
  848. } elseif (strtolower($field) == 'lx') {
  849. unset($flowInsertData['CALC_ID']);
  850. unset($flowInsertData['SORT']);
  851. unset($flowInsertData['TRANSFER_SN']);
  852. FlowLX::insertOne($flowInsertData);
  853. }
  854. }
  855. // 清空
  856. $userBonus->BONUS = 0;
  857. $userBonus->CF = 0;
  858. $userBonus->LX = 0;
  859. if (!$userBonus->save()) {
  860. throw new Exception(Form::formatErrorsForApi($userBonus->getErrors()));
  861. }
  862. }
  863. FlowBonus::updateAll(['DELETED' => 1, 'DELETED_AT' => Date::nowTime()], 'USER_ID=:USER_ID', [':USER_ID' => $userId]);
  864. FlowCF::updateAll(['DELETED' => 1, 'DELETED_AT' => Date::nowTime()], 'USER_ID=:USER_ID', [':USER_ID' => $userId]);
  865. FlowLX::updateAll(['DELETED' => 1, 'DELETED_AT' => Date::nowTime()], 'USER_ID=:USER_ID', [':USER_ID' => $userId]);
  866. }
  867. /**
  868. * 是否存在奖金余额
  869. * @param $userId
  870. * @return bool
  871. */
  872. public static function hasBonus($userId) {
  873. $userBonus = UserBonus::findOne(['USER_ID' => $userId]);
  874. if (!$userBonus) {
  875. return false;
  876. }
  877. foreach (\Yii::$app->params['bonusWalletType'] as $type) {
  878. $field = strtoupper($type['name']);
  879. if (isset($userBonus[$field]) && $userBonus[$field] > 0) {
  880. return true;
  881. }
  882. }
  883. return false;
  884. }
  885. /**
  886. * 获取金额用于日志
  887. * @param $userId
  888. * @return array
  889. */
  890. public static function getLogData($userId){
  891. $userWallet = UserWallet::findOne(['USER_ID' => $userId]);
  892. $cash = !empty($userWallet) ? $userWallet['CASH'] : '';
  893. $userName = Info::getUserNameByUserId($userId);
  894. $data = [];
  895. $data[$userId]['label'] = $userName.'余额';
  896. $data[$userId]['value'] = '奖金'.self::getAvailableBalance($userId).',现金'.$cash;
  897. return $data;
  898. }
  899. }