StoreDividendsCycle.php 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614
  1. <?php
  2. namespace app\models;
  3. use yii\behaviors\TimestampBehavior;/**
  4. * This is the model class for table "{{%store_dividends_cycle}}".
  5. *
  6. * @property integer $id
  7. * @property integer $sort_key
  8. * @property string $name
  9. * @property float $dividends_trigger_money
  10. * @property float $dividends_money
  11. * @property integer $dividends_user_num
  12. * @property float $league_price
  13. * @property float $integral_price
  14. * @property integer $is_send
  15. * @property string $created_at
  16. * @property string $updated_at
  17. */
  18. class StoreDividendsCycle extends \yii\db\ActiveRecord
  19. {
  20. /**
  21. * 是否发放:否
  22. */
  23. const IS_SEND_NO = 0;
  24. /**
  25. * 是否发放:是
  26. */
  27. const IS_SEND_YES = 1;
  28. /**
  29. * @inheritdoc
  30. */
  31. public static function tableName()
  32. {
  33. return '{{%store_dividends_cycle}}';
  34. }
  35. public function rules()
  36. {
  37. return [
  38. [['id', 'sort_key', 'dividends_user_num', 'is_send'], 'integer'],
  39. [['dividends_trigger_money', 'dividends_money', 'league_price', 'created_at', 'updated_at', 'integral_price'], 'number']
  40. ];
  41. }
  42. public function behaviors()
  43. {
  44. return [
  45. [
  46. 'class' => TimestampBehavior::class
  47. ]
  48. ];
  49. }
  50. public function attributeLabels()
  51. {
  52. return [
  53. 'id' => '',
  54. 'sort_key' => '序号',
  55. 'name' => '期数',
  56. 'dividends_trigger_money' => '分红触发金额',
  57. 'dividends_money' => '当前分红统计金额(订单金额*让利)',
  58. 'dividends_user_num' => '分红用户人数',
  59. 'league_price' => '预计/累计发放联盟券数量',
  60. 'is_send' => '是否发放',
  61. 'created_at' => '创建时间',
  62. 'updated_at' => '修改时间',
  63. ];
  64. }
  65. //有用户下单 获取配置信息 判断之前是否存在活动奖池
  66. public static function setDividendsCycle($order)
  67. {
  68. $tran = \Yii::$app->db->beginTransaction();
  69. try {
  70. //获取订单类型以及让利比例
  71. $store = Store::findOne($order->store_id);
  72. $transfer_profit = $store->transfer_profit;
  73. $order_type = StoreDividendsCycleSub::ORDER_TYPE_MALL;
  74. if ($order instanceof \app\plugins\scanCodePay\models\Order) {
  75. $order_type = StoreDividendsCycleSub::ORDER_TYPE_FACE;
  76. $transfer_profit = $store->scan_transfer_profit;
  77. $order->pay_price = bcsub($order->total_price, $order->coupon_sub_price, 2);
  78. }
  79. if (isset($order->food_flag_id) && intval($order->food_flag_id) > 0) {
  80. $order_type = StoreDividendsCycleSub::ORDER_TYPE_FOOD;
  81. $transfer_profit = $store->food_transfer_profit;;
  82. }
  83. // 收银台判断 判断收银订单中是否存在当前订单
  84. if (isset($order->hanging_order_id) && intval($order->hanging_order_id) > 0) {
  85. $order_type = StoreDividendsCycleSub::ORDER_TYPE_CASHIER;
  86. $transfer_profit = $store->cashier_transfer_profit;
  87. }
  88. //获取当前订单的分红值 订单支付金额 * 让利比例
  89. $store_dividends_money = bcdiv(bcmul($order->pay_price, $transfer_profit, 2), 100, 2);
  90. //获取配置项
  91. $store_dividends_setting = Option::get('store_dividends_setting', 0, 'store_dividends')['value'];
  92. $store_dividends_setting = json_decode($store_dividends_setting, true);
  93. if (empty($store_dividends_setting)) {
  94. throw new \Exception('请先配置分红设置');
  95. }
  96. //判断订单是否已经加入
  97. $order_is_join = StoreDividendsCycleSub::findOne(['order_id' => $order->id, 'order_type' => $order_type]);
  98. if ($order_is_join) {
  99. throw new \Exception('订单已经加入');
  100. }
  101. //获取当前分红周期
  102. $storeDividendsCycleArray = self::find()->where(['is_send' => self::IS_SEND_NO])->orderBy('id desc')
  103. ->select('id, sort_key')->asArray()->one();
  104. //添加分红用户
  105. $storeDividendsStore = StoreDividendsUser::addUser(StoreDividendsUser::ROLE_STORE, $store->id, $storeDividendsCycleArray['sort_key'] ?: 1);
  106. $storeDividendsUser = null;
  107. $user = User::findOne($order->user_id);
  108. if ($user) {
  109. $saasUser = SaasUser::findOne(['mobile' => $user->binding, 'is_delete' => 0]);
  110. $storeDividendsUser = StoreDividendsUser::addUser(StoreDividendsUser::ROLE_USER, $saasUser->id, $storeDividendsCycleArray['sort_key'] ?: 1);
  111. }
  112. if (!$storeDividendsStore || !$storeDividendsUser) {
  113. throw new \Exception('添加分红用户失败');
  114. }
  115. $user_dividends_integral = bcdiv(bcmul($store_dividends_money, $store_dividends_setting['store_dividends_give_user_integral_rate'], 2), 100, 2);
  116. $store_dividends_integral = bcdiv(bcmul($store_dividends_money, $store_dividends_setting['store_dividends_give_store_integral_rate'], 2), 100, 2);
  117. //添加用户积分记录 START
  118. //商城记录
  119. $storeDividendsIntegralStore = new StoreDividendsUserIntegralLog();
  120. $storeDividendsIntegralStore->dividends_user_id = $storeDividendsStore->id;
  121. $storeDividendsIntegralStore->order_id = $order->id;
  122. $storeDividendsIntegralStore->order_type = $order_type;
  123. $storeDividendsIntegralStore->dividends_integral = $store_dividends_integral;
  124. $storeDividendsIntegralStore->save();
  125. $storeDividendsStore->updateCounters(['dividends_integral' => $store_dividends_integral]);
  126. //用户记录
  127. $storeDividendsIntegralUser = new StoreDividendsUserIntegralLog();
  128. $storeDividendsIntegralUser->dividends_user_id = $storeDividendsUser->id;
  129. $storeDividendsIntegralUser->order_id = $order->id;
  130. $storeDividendsIntegralUser->order_type = $order_type;
  131. $storeDividendsIntegralUser->dividends_integral = $user_dividends_integral;
  132. $storeDividendsIntegralUser->save();
  133. $storeDividendsUser->updateCounters(['dividends_integral' => $user_dividends_integral]);
  134. //添加用户积分记录 END
  135. //查询未结束的分红周期(在额定分红范围内 没有达到最高层)
  136. $storeDividends = StoreDividends::findOne(['is_finish' => StoreDividends::IS_FINISH_NO]);
  137. if ($storeDividends) {
  138. $storeDividendsCycleId = $storeDividendsCycleArray['id'];
  139. $storeDividendsCycle = self::findOne($storeDividendsCycleId);
  140. if ($storeDividendsCycle) {
  141. $storeDividends->updateCounters(['dividends_money' => $store_dividends_money]);
  142. $current_money = $store_dividends_money;
  143. //判断 带上这次这期是否会结束
  144. $is_finish = false;
  145. $current_dividends_money = bcadd($storeDividendsCycle->dividends_money, $store_dividends_money, 2);
  146. if ($current_dividends_money >= $storeDividendsCycle->dividends_trigger_money) {
  147. //计算一下当前周期还查多少到达预计值 然后将差值放入当前周期池的来源表中
  148. $current_money = bcsub($storeDividendsCycle->dividends_trigger_money, $storeDividendsCycle->dividends_money, 2);
  149. //计算一下多出的值 然后计算一下当前周期需要多少 剩余多出来的增加到下一周期附表上
  150. $storeDividendsCycle->dividends_money = $storeDividendsCycle->dividends_trigger_money;
  151. $storeDividendsCycle->save();
  152. $is_finish = true;
  153. //添加期数用户记录
  154. } else {
  155. $storeDividendsCycle->updateCounters(['dividends_money' => $store_dividends_money]);
  156. //添加期数用户记录
  157. }
  158. StoreDividendsCycleUserSub::addCycleUserSub($storeDividendsCycle->id);
  159. $storeDividendsCycleSub = new StoreDividendsCycleSub();
  160. $storeDividendsCycleSub->dividends_cycle_id = $storeDividendsCycle->id;
  161. $storeDividendsCycleSub->order_id = $order->id;
  162. $storeDividendsCycleSub->order_type = $order_type;
  163. $storeDividendsCycleSub->order_no = $order->order_no;
  164. $storeDividendsCycleSub->store_profit = $transfer_profit;
  165. $storeDividendsCycleSub->money = $current_money;
  166. $storeDividendsCycleSub->user_dividends_integral = $user_dividends_integral;
  167. $storeDividendsCycleSub->store_dividends_integral = $store_dividends_integral;
  168. if (!$storeDividendsCycleSub->save()) {
  169. throw new \Exception('添加分红周期失败【' . implode(';', array_values($storeDividendsCycleSub->firstErrors)) . '】');
  170. };
  171. //先给附表中数据写入一下
  172. //如果结束 就先计算一下 用户以及商城可以拿取多少联盟券
  173. if ($is_finish) {
  174. // $num = 0;
  175. // $total_league_price = 0;
  176. // $result = self::handleSendLeague($order, $storeDividendsCycle->id, $num, $total_league_price);
  177. // if ($result['code']) {
  178. // throw new \Exception($result['msg']);
  179. // }
  180. // $storeDividendsCycle->is_send = self::IS_SEND_YES;
  181. // $storeDividendsCycle->dividends_user_num = $num;
  182. // $storeDividendsCycle->league_price = $total_league_price;
  183. // $storeDividendsCycle->save();
  184. //然后执行下一轮的分期
  185. $result = self::handleOutDividends(
  186. $order,
  187. $order_type,
  188. $transfer_profit,
  189. $storeDividendsCycle->sort_key,
  190. $current_dividends_money,
  191. $storeDividendsCycle->dividends_trigger_money,
  192. $store_dividends_setting['store_dividends_pool_profit_rate'],
  193. $storeDividendsUser->id,
  194. $storeDividendsStore->id,
  195. $user_dividends_integral,
  196. $store_dividends_integral
  197. );
  198. if ($result['code']) {
  199. throw new \Exception($result['msg']);
  200. }
  201. }
  202. } else {
  203. $storeDividendsCycle = self::find()->where(['is_send' => 1])->orderBy('sort_key DESC')->asArray()->all();
  204. $current_dividends_money = bcadd($storeDividendsCycle['dividends_money'], $store_dividends_money, 2);
  205. //然后执行下一轮的分期
  206. $result = self::handleOutDividends(
  207. $order,
  208. $order_type,
  209. $transfer_profit,
  210. $storeDividendsCycle['sort_key'],
  211. $current_dividends_money,
  212. $storeDividendsCycle['dividends_trigger_money'],
  213. $store_dividends_setting['store_dividends_pool_profit_rate'],
  214. $storeDividendsUser->id,
  215. $storeDividendsStore->id,
  216. $user_dividends_integral,
  217. $store_dividends_integral
  218. );
  219. if ($result['code']) {
  220. throw new \Exception($result['msg']);
  221. }
  222. }
  223. } else {
  224. $storeDividends = new StoreDividends();
  225. $storeDividends->max_cycle = $store_dividends_setting['store_dividends_max_cycle'];
  226. $storeDividends->current_cycle = 1;
  227. $storeDividends->dividends_money = $store_dividends_money;
  228. $storeDividends->is_finish = StoreDividends::IS_FINISH_NO;
  229. if (!$storeDividends->save()) {
  230. throw new \Exception('添加分红周期失败【' . implode(';', array_values($storeDividends->firstErrors)) . '】');
  231. };
  232. $is_finish = false;
  233. $current_money = $store_dividends_money;
  234. if ($store_dividends_money >= $store_dividends_setting['store_dividends_init_profit']) {
  235. $current_money = $store_dividends_setting['store_dividends_init_profit'];
  236. $is_finish = true;
  237. }
  238. $storeDividendsCycle = new self();
  239. $storeDividendsCycle->sort_key = 1;
  240. $storeDividendsCycle->name = '第一期';
  241. $storeDividendsCycle->dividends_trigger_money = $store_dividends_setting['store_dividends_init_profit'];
  242. $storeDividendsCycle->dividends_money = $current_money;
  243. $storeDividendsCycle->dividends_user_num = 0;
  244. $storeDividendsCycle->is_send = self::IS_SEND_NO;
  245. if (!$storeDividendsCycle->save()) {
  246. throw new \Exception('添加分红周期失败【' . implode(';', array_values($storeDividendsCycle->firstErrors)) . '】');
  247. };
  248. //添加期数用户记录
  249. StoreDividendsCycleUserSub::addCycleUserSub($storeDividendsCycle->id);
  250. $storeDividendsCycleSub = new StoreDividendsCycleSub();
  251. $storeDividendsCycleSub->dividends_cycle_id = $storeDividendsCycle->id;
  252. $storeDividendsCycleSub->order_id = $order->id;
  253. $storeDividendsCycleSub->order_type = $order_type;
  254. $storeDividendsCycleSub->order_no = $order->order_no;
  255. $storeDividendsCycleSub->store_profit = $transfer_profit;
  256. $storeDividendsCycleSub->money = $current_money;
  257. $storeDividendsCycleSub->user_dividends_integral = $user_dividends_integral;
  258. $storeDividendsCycleSub->store_dividends_integral = $store_dividends_integral;
  259. if (!$storeDividendsCycleSub->save()) {
  260. throw new \Exception('添加分红周期失败【' . implode(';', array_values($storeDividendsCycleSub->firstErrors)) . '】');
  261. };
  262. if ($is_finish) {
  263. // $num = 0;
  264. // $total_league_price = 0;
  265. // $result = self::handleSendLeague($order, $storeDividendsCycle->id, $num, $total_league_price);
  266. // if ($result['code']) {
  267. // throw new \Exception($result['msg']);
  268. // }
  269. // $storeDividendsCycle->is_send = self::IS_SEND_YES;
  270. // $storeDividendsCycle->dividends_user_num = $num;
  271. // $storeDividendsCycle->league_price = $total_league_price;
  272. // $storeDividendsCycle->save();
  273. //然后执行下一轮的分期
  274. $result = self::handleOutDividends(
  275. $order,
  276. $order_type,
  277. $transfer_profit,
  278. $storeDividendsCycle->sort_key,
  279. $store_dividends_money,
  280. $storeDividendsCycle->dividends_trigger_money,
  281. $store_dividends_setting['store_dividends_pool_profit_rate'],
  282. $storeDividendsUser->id,
  283. $storeDividendsStore->id,
  284. $user_dividends_integral,
  285. $store_dividends_integral
  286. );
  287. if ($result['code']) {
  288. throw new \Exception($result['msg']);
  289. }
  290. }
  291. }
  292. $tran->commit();
  293. return [
  294. 'code' => 0,
  295. 'msg' => '操作成功'
  296. ];
  297. } catch (\Exception $e) {
  298. $tran->rollBack();
  299. return [
  300. 'code' => 1,
  301. 'msg' => $e->getMessage()
  302. ];
  303. }
  304. }
  305. /**
  306. * @param $order Order | \app\plugins\scanCodePay\models\Order 上次分红结束后的分期数
  307. * @param $order_type integer 订单类型
  308. * @param $transfer_profit float 让利比例
  309. * @param $sort_key integer 上次分红结束后的分期数
  310. * @param $store_dividends_money float 累计的分红金额
  311. * @param $dividends_trigger_money float 上次分红触发金额
  312. * @param $store_dividends_pool_profit_rate float 分红池分红触发增长比例
  313. * @param $storeDividendsUserId integer 某店分红用户ID
  314. * @param $storeDividendsStoreId integer 某店分红商家ID
  315. * @param $user_dividends_integral float 某店分红当期用户积分数量
  316. * @param $store_dividends_integral float 某店分红当期商家积分数量
  317. * 处理超出部分的分红 如果上次超出的分红只是等于0 那么就添加一期分红 不做其他处理
  318. */
  319. public static function handleOutDividends(
  320. $order,
  321. $order_type,
  322. $transfer_profit,
  323. $sort_key,
  324. $store_dividends_money,
  325. $prev_dividends_trigger_money,
  326. $store_dividends_pool_profit_rate,
  327. $storeDividendsUserId,
  328. $storeDividendsStoreId,
  329. $user_dividends_integral,
  330. $store_dividends_integral
  331. )
  332. {
  333. try {
  334. $store_dividends_setting = Option::get('store_dividends_setting', 0, 'store_dividends')['value'];
  335. $store_dividends_setting = json_decode($store_dividends_setting, true);
  336. //计算当前的分红池触发金额
  337. $dividends_trigger_money = bcadd($prev_dividends_trigger_money, bcdiv(bcmul($prev_dividends_trigger_money, $store_dividends_pool_profit_rate, 2), 100, 2), 2);
  338. $is_finish = false;
  339. $next_store_dividends_money = $store_dividends_money;
  340. $current_money = bcsub($next_store_dividends_money, $dividends_trigger_money, 2);
  341. //如果当前分红值直接超过分红池触发金额 就再开始考虑下一次期分红
  342. if ($store_dividends_money >= $dividends_trigger_money) {
  343. $current_money = bcsub($dividends_trigger_money, $prev_dividends_trigger_money, 2);//计算一下当前的分红值
  344. $next_store_dividends_money = $dividends_trigger_money;
  345. $is_finish = true;
  346. }
  347. $nextStoreDividendsCycle = new self();
  348. $nextStoreDividendsCycle->sort_key = $sort_key + 1;
  349. $nextStoreDividendsCycle->name = '第' . self::numberToChinese($nextStoreDividendsCycle->sort_key) . '期';
  350. $nextStoreDividendsCycle->dividends_trigger_money = $dividends_trigger_money;
  351. $nextStoreDividendsCycle->dividends_money = $next_store_dividends_money;
  352. $nextStoreDividendsCycle->dividends_user_num = 0;
  353. $nextStoreDividendsCycle->is_send = self::IS_SEND_NO;
  354. if (!$nextStoreDividendsCycle->save()) {
  355. throw new \Exception('添加分红周期失败【' . implode(';', array_values($nextStoreDividendsCycle->firstErrors)) . '】');
  356. };
  357. //添加期数用户记录
  358. StoreDividendsCycleUserSub::addCycleUserSub($nextStoreDividendsCycle->id);
  359. if ($current_money > 0) {
  360. $storeDividendsCycleSub = new StoreDividendsCycleSub();
  361. $storeDividendsCycleSub->dividends_cycle_id = $nextStoreDividendsCycle->id;
  362. $storeDividendsCycleSub->order_id = $order->id;
  363. $storeDividendsCycleSub->order_type = $order_type;
  364. $storeDividendsCycleSub->order_no = $order->order_no;
  365. $storeDividendsCycleSub->store_profit = $transfer_profit;
  366. $storeDividendsCycleSub->money = $current_money;
  367. $storeDividendsCycleSub->user_dividends_integral = 0;
  368. $storeDividendsCycleSub->store_dividends_integral = 0;
  369. if (!$storeDividendsCycleSub->save()) {
  370. throw new \Exception('添加分红周期失败【' . implode(';', array_values($storeDividendsCycleSub->firstErrors)) . '】');
  371. };
  372. if ($is_finish) {
  373. // $num = 0;
  374. // $total_league_price = 0;
  375. // $result = self::handleSendLeague($order, $nextStoreDividendsCycle->id, $num, $total_league_price);
  376. // if ($result['code']) {
  377. // return $result;
  378. // }
  379. //
  380. // $nextStoreDividendsCycle->is_send = self::IS_SEND_YES;
  381. // $nextStoreDividendsCycle->dividends_user_num = $num;
  382. // $nextStoreDividendsCycle->league_price = $total_league_price;
  383. // $nextStoreDividendsCycle->save();
  384. //然后执行下一轮的分期
  385. $result = self::handleOutDividends(
  386. $order,
  387. $order_type,
  388. $transfer_profit,
  389. $nextStoreDividendsCycle->sort_key,
  390. $store_dividends_money,
  391. $nextStoreDividendsCycle->dividends_trigger_money,
  392. $store_dividends_setting['store_dividends_pool_profit_rate'],
  393. $storeDividendsUserId,
  394. $storeDividendsStoreId,
  395. $user_dividends_integral,
  396. $store_dividends_integral
  397. );
  398. if ($result['code']) {
  399. return $result;
  400. }
  401. }
  402. }
  403. return [
  404. 'code' => 0,
  405. 'msg' => '操作成功'
  406. ];
  407. } catch (\Exception $e) {
  408. return [
  409. 'code' => 1,
  410. 'msg' => $e->getMessage()
  411. ];
  412. }
  413. }
  414. /**
  415. * 分红时候给商家和用户发放联盟券
  416. */
  417. public static function handleSendLeague($order, $cycle_id, &$num = 0, &$total_league_price = 0, &$total_integral_price = 0) {
  418. try {
  419. $store_dividends_setting = Option::get('store_dividends_setting', 0, 'store_dividends')['value'];
  420. $store_dividends_setting = json_decode($store_dividends_setting, true);
  421. if (empty($store_dividends_setting)) {
  422. throw new \Exception('请先配置分红设置');
  423. }
  424. $single_integral_profit = $store_dividends_setting['store_dividends_single_integral_profit'];
  425. $cycle = StoreDividendsCycle::findOne($cycle_id);
  426. // $userList = StoreDividendsCycleUserSub::find()->alias('cus')
  427. // ->leftJoin(['u' => StoreDividendsUser::tableName()], 'cus.dividends_user_id = u.id')
  428. // ->where(['>', 'cus.dividends_integral', 0])
  429. // ->andWhere(['cus.dividends_cycle_id' => $cycle->id])
  430. // ->select('u.id, u.role, u.role_id, cus.dividends_integral')->asArray()->all();
  431. $userList = StoreDividendsUser::find()->where(['>', 'dividends_integral', 0])
  432. ->andWhere(['<=', 'join_cycle_key', $cycle->sort_key])
  433. ->select('id, role, role_id, dividends_integral')->asArray()->all();
  434. foreach ($userList as $item) {
  435. $total_integral_price = bcadd($total_integral_price, $item['dividends_integral'], 2);
  436. $league_price = bcdiv(bcmul($item['dividends_integral'], $single_integral_profit, 2), 100, 2);
  437. $model = Store::findOne($item['role_id']);
  438. if (intval($item['role']) === StoreDividendsUser::ROLE_USER) {
  439. $model = SaasUser::findOne($item['role_id']);
  440. }
  441. if (!$model) {
  442. continue;
  443. }
  444. $storeDividendsUser = StoreDividendsUser::addUser($item['role'], $item['role_id']);
  445. $storeDividendsLeagueLog = new StoreDividendsUserLeagueLog();
  446. $storeDividendsLeagueLog->dividends_cycle_id = $cycle_id;
  447. $storeDividendsLeagueLog->dividends_user_id = $item['id'];
  448. $storeDividendsLeagueLog->dividends_integral = $item['dividends_integral'];
  449. $storeDividendsLeagueLog->league_price = $league_price;
  450. $storeDividendsLeagueLog->save();
  451. $before = $model->league_price;
  452. $model->updateCounters(['league_price' => $league_price]);
  453. $storeDividendsUser->updateCounters(['league_price' => $league_price]);
  454. //给商城增加联盟券
  455. SaaSLeaguePriceLog::setLeaguePriceLog(
  456. intval($item['role']) === StoreDividendsUser::ROLE_STORE ? $item['role_id'] : 0,
  457. intval($item['role']) === StoreDividendsUser::ROLE_USER ? $item['role_id'] : 0,
  458. $league_price,
  459. $before,
  460. SaaSLeaguePriceLog::TYPE_STORE_DIVIDENDS_CYCLE,
  461. SaaSLeaguePriceLog::SEND_TYPE,
  462. intval($item['role']),
  463. $order->id);
  464. $total_league_price += $league_price;
  465. }
  466. $num = count($userList);
  467. return [
  468. 'code' => 0,
  469. 'msg' => ''
  470. ];
  471. } catch (\Exception $e) {
  472. return [
  473. 'code' => 1,
  474. 'msg' => $e->getMessage()
  475. ];
  476. }
  477. }
  478. /**
  479. * 将数字转换为中文大写形式(支持整数)
  480. * @param int $number 需要转换的数字
  481. * @return string
  482. */
  483. public static function numberToChinese($number) {
  484. if ($number < 0 || $number > 99999999) {
  485. return '暂不支持超出范围的数字';
  486. }
  487. // 定义中文字符
  488. $char = ['零', '一', '二', '三', '四', '五', '六', '七', '八', '九'];
  489. $unit = ['', '十', '百', '千'];
  490. $sectionUnit = ['', '万', '亿', '万亿'];
  491. // 拆分数字为每四位一组处理
  492. $sections = [];
  493. while ($number > 0) {
  494. $sections[] = $number % 10000;
  495. $number = intval($number / 10000);
  496. }
  497. $result = '';
  498. for ($i = count($sections) - 1; $i >= 0; $i--) {
  499. $n = $sections[$i];
  500. if ($n == 0) {
  501. continue; // 当前节全为0时跳过
  502. }
  503. $str = '';
  504. $zeroCount = 0;
  505. for ($j = 0; $j < 4; $j++) {
  506. $digit = $n % 10;
  507. $n = intval($n / 10);
  508. if ($digit == 0) {
  509. $zeroCount++;
  510. } else {
  511. if ($zeroCount > 0) {
  512. $str = $char[0] . $str;
  513. $zeroCount = 0;
  514. }
  515. $str = $char[$digit] . $unit[$j] . $str;
  516. }
  517. }
  518. $result .= $str . $sectionUnit[$i];
  519. }
  520. // 处理特殊情况
  521. $result = str_replace(['一十', '零万'], ['十', '万'], $result);
  522. return $result ?: '零';
  523. }
  524. }