UserTeamProfitStatistics.php 36 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722
  1. <?php
  2. namespace common\models\user;
  3. use common\enums\AddonsEnum;
  4. use common\enums\OrderStatusEnum;
  5. use common\enums\RabbitMqEnum;
  6. use common\enums\RefundTypeEnum;
  7. use common\enums\StatusEnum;
  8. use common\models\mall\Mall;
  9. use common\models\mall\MallAddons;
  10. use common\models\order\Order;
  11. use common\models\order\OrderDetail;
  12. use common\models\order\OrderRefund;
  13. use common\models\user\UserTeamProfitStatisticsLog;
  14. use Exception;
  15. use Yii;
  16. /**
  17. * This is the model class for table "qimall_user_team_profit_statistics".
  18. *
  19. * @property int $id
  20. * @property int $mall_id 商城id
  21. * @property int $user_id 用户id
  22. * @property float $children_order_pay_profit 下级团队订单支付总利润(不包含自己)
  23. * @property float $team_order_pay_profit 团队订单支付总利润(包含自己)
  24. * @property float $children_order_finish_profit 下级团队订单完成总利润(不包含自己)
  25. * @property float $team_order_finish_profit 团队订单完成总利润(包含自己)
  26. * @property int|null $created_at 添加时间
  27. * @property int|null $updated_at 修改时间
  28. */
  29. class UserTeamProfitStatistics extends \common\models\base\BaseActiveRecord
  30. {
  31. /**
  32. * {@inheritdoc}
  33. */
  34. public static function tableName()
  35. {
  36. return 'qimall_user_team_profit_statistics';
  37. }
  38. /**
  39. * {@inheritdoc}
  40. */
  41. public function rules()
  42. {
  43. return [
  44. [['mall_id', 'user_id', 'children_order_pay_profit', 'team_order_pay_profit', 'children_order_finish_profit', 'team_order_finish_profit'], 'required'],
  45. [['mall_id', 'user_id', 'created_at', 'updated_at'], 'integer'],
  46. [['children_order_pay_profit', 'team_order_pay_profit', 'children_order_finish_profit', 'team_order_finish_profit'], 'number'],
  47. [['children_order_pay_achievement', 'team_order_pay_achievement', 'children_order_finish_achievement', 'team_order_finish_achievement'], 'number'],
  48. [['children_order_pay_goods_achievement', 'team_order_pay_goods_achievement', 'children_order_finish_goods_achievement', 'team_order_finish_goods_achievement'], 'number'],
  49. ];
  50. }
  51. /**
  52. * {@inheritdoc}
  53. */
  54. public function attributeLabels()
  55. {
  56. return [
  57. 'id' => 'ID',
  58. 'mall_id' => 'Mall ID',
  59. 'user_id' => 'User ID',
  60. 'children_order_pay_profit' => 'Children Order Pay Profit',
  61. 'team_order_pay_profit' => 'Team Order Pay Profit',
  62. 'children_order_finish_profit' => 'Children Order Finish Profit',
  63. 'team_order_finish_profit' => 'Team Order Finish Profit',
  64. 'created_at' => 'Created At',
  65. 'updated_at' => 'Updated At',
  66. ];
  67. }
  68. public static function setData(array $data)
  69. {
  70. try {
  71. $model = self::findOne(['user_id' => $data['user_id']]);
  72. if (empty($model)) {
  73. $model = new self();
  74. $model->loadDefaultValues();
  75. }
  76. if (!$model->load($data, '') || !$model->save()) {
  77. throw new \Exception($model->getErrorMessage());
  78. }
  79. return $model;
  80. } catch (\Exception $e) {
  81. self::setStaticError($e->getMessage());
  82. return false;
  83. }
  84. }
  85. public static function calculatePerformance($params)
  86. {
  87. try {
  88. $mall_id = $params['mall_id'];
  89. $user_id = $params['user_id'];
  90. $order_id = $params['order_id'];
  91. $is_virtual = $params['is_virtual'];
  92. // $type = $params['type'] ?? 0;
  93. //获取订单信息
  94. $order = Order::getOne([
  95. ['mall_id' => $mall_id],
  96. ['user_id' => $user_id],
  97. ['id' => $order_id],
  98. // ['order_status' => [OrderStatusEnum::PAY, OrderStatusEnum::SHIPMENTS, OrderStatusEnum::SING, OrderStatusEnum::ACCOMPLISH]]
  99. ], true, ['detail']);
  100. //查无订单,则中止
  101. if (empty($order)) return true;
  102. // 判断是否开启
  103. $config = Yii::$app->services->setting->mall->get($mall_id, 'order');
  104. $achievementGoodsIds = [];
  105. // 判断是否开启订单业绩商品:如果开启,则获取指定商品ID。不开则获取所有商品ID
  106. if (!empty($config['is_designated_achievement_goods'])) {
  107. $achievementGoodsIds = json_decode($config['achievement_goods_ids'], true);
  108. }
  109. $children_order_pay_profit = 0;
  110. $team_order_pay_profit = 0;
  111. $children_order_finish_profit = 0;
  112. $team_order_finish_profit = 0;
  113. $children_order_pay_achievement = 0;
  114. $team_order_pay_achievement = 0;
  115. $children_order_finish_achievement = 0;
  116. $team_order_finish_achievement = 0;
  117. $achievement_sum = 0;
  118. $pay_money = 0;
  119. $original_goods_price = 0;
  120. $children_order_pay_goods_achievement = 0;
  121. $team_order_pay_goods_achievement = 0;
  122. $children_order_finish_goods_achievement = 0;
  123. $team_order_finish_goods_achievement = 0;
  124. foreach ($order['detail'] as $key => $value) {
  125. // 判断是否开启订单业绩商品
  126. if (!empty($config['is_designated_achievement_goods']) && !in_array($value['goods_id'], $achievementGoodsIds)) {
  127. // 如果开启了订单业绩商品 并且 当前商品不在订单业绩商品列表中则跳过
  128. continue;
  129. }
  130. $performance = $value['goods_price'] - bcmul($value['cost_price'], $value['num'], 2);
  131. $pay_money += $value['goods_price'] ?? 0;
  132. $original_goods_price += $value['original_goods_price'] ?? 0;
  133. if ($performance > 0 || $pay_money > 0 || $original_goods_price > 0) {
  134. $achievement_sum += $performance;
  135. //记录累加日志
  136. $log_data = [
  137. 'mall_id' => $mall_id,
  138. 'goods_id' => $value['goods_id'],
  139. 'order_detail_id' => $value['id'],
  140. 'order_id' => $order_id,
  141. 'status' => StatusEnum::ENABLED,
  142. ];
  143. UserTeamProfitStatisticsLog::setData($log_data);
  144. }
  145. }
  146. //利润业绩为0,实付金额为0,则不需要累计数据
  147. if ($achievement_sum <= 0 && $pay_money <= 0 && $original_goods_price <= 0) return true;
  148. //数据累计
  149. /* 如果订单是虚拟订单时。订单在次方法之前已经将订单状态改为完成。此处数据统计永远无法统计订单支付数据。
  150. 所以需要修改订单为虚拟订单时。需要统计支付数据此参数为支付时使用 */
  151. if ($is_virtual) {
  152. $children_order_pay_profit += $achievement_sum;
  153. $team_order_pay_profit += $achievement_sum;
  154. $children_order_pay_achievement += $pay_money;
  155. $team_order_pay_achievement += $pay_money;
  156. $children_order_pay_goods_achievement += $original_goods_price;
  157. $team_order_pay_goods_achievement += $original_goods_price;
  158. } else {
  159. if ($order['order_status'] == OrderStatusEnum::ACCOMPLISH) {
  160. $children_order_finish_profit += $achievement_sum;
  161. $team_order_finish_profit += $achievement_sum;
  162. $children_order_finish_achievement += $pay_money;
  163. $team_order_finish_achievement += $pay_money;
  164. $children_order_finish_goods_achievement += $original_goods_price;
  165. $team_order_finish_goods_achievement += $original_goods_price;
  166. //用作累计历史订单数据,正常下单累计数据是type = 0
  167. // if ($type == 1) {
  168. // $children_order_pay_profit += $achievement_sum;
  169. // $team_order_pay_profit += $achievement_sum;
  170. // }
  171. } else {
  172. $children_order_pay_profit += $achievement_sum;
  173. $team_order_pay_profit += $achievement_sum;
  174. $children_order_pay_achievement += $pay_money;
  175. $team_order_pay_achievement += $pay_money;
  176. $children_order_pay_goods_achievement += $original_goods_price;
  177. $team_order_pay_goods_achievement += $original_goods_price;
  178. }
  179. }
  180. //获取上级数据
  181. $parent_id_arr = UserPartitionRelationship::getParentIdArr($user_id);
  182. $parent_id_arr[] = $user_id;
  183. //获取当前用户的订单利润数据
  184. $list = self::lists([
  185. 'where' => [
  186. ['mall_id' => $mall_id],
  187. ['user_id' => $parent_id_arr]
  188. ],
  189. 'index' => 'user_id',
  190. ], false);
  191. //用户订单利润数据操作
  192. foreach ($parent_id_arr as $key => $value) {
  193. $item = $list[$value];
  194. if (empty($item)) {
  195. $item = new UserTeamProfitStatistics();
  196. $item->loadDefaultValues();
  197. $item->mall_id = $mall_id;
  198. $item->user_id = $value;
  199. $item->team_order_pay_profit = 0;
  200. $item->team_order_finish_profit = 0;
  201. $item->children_order_pay_profit = 0;
  202. $item->children_order_finish_profit = 0;
  203. $item->team_order_pay_achievement = 0;
  204. $item->team_order_finish_achievement = 0;
  205. $item->children_order_pay_achievement = 0;
  206. $item->children_order_finish_achievement = 0;
  207. $item->children_order_pay_goods_achievement = 0;
  208. $item->team_order_pay_goods_achievement = 0;
  209. $item->children_order_finish_goods_achievement = 0;
  210. $item->team_order_finish_goods_achievement = 0;
  211. }
  212. //订单正常累加
  213. $item->team_order_pay_profit += $team_order_pay_profit;
  214. $item->team_order_finish_profit += $team_order_finish_profit;
  215. $item->team_order_pay_achievement += $team_order_pay_achievement;
  216. $item->team_order_finish_achievement += $team_order_finish_achievement;
  217. $item->team_order_pay_goods_achievement += $team_order_pay_goods_achievement;
  218. $item->team_order_finish_goods_achievement += $team_order_finish_goods_achievement;
  219. if ($value != $user_id) {
  220. $item->children_order_pay_profit += $children_order_pay_profit;
  221. $item->children_order_finish_profit += $children_order_finish_profit;
  222. $item->children_order_pay_achievement += $children_order_pay_achievement;
  223. $item->children_order_finish_achievement += $children_order_finish_achievement;
  224. $item->children_order_pay_goods_achievement += $children_order_pay_goods_achievement;
  225. $item->children_order_finish_goods_achievement += $children_order_finish_goods_achievement;
  226. }
  227. if (!$item->save()) var_dump('记录用户利润信息失败:user_id:'.$value.',order_id:'. $order_id);
  228. }
  229. // if ($type != 1) {
  230. //再次执行会员升级任务
  231. \Yii::$app->services->rabbitMq->push(RabbitMqEnum::EXCHANGE_ORDER, RabbitMqEnum::ORDER_QUEUE, ['id' => $order_id], \common\listeners\user\UserUpgradeListener::class, 'handleSync');
  232. // }
  233. return true;
  234. } catch (\Exception $e) {
  235. throw new Exception('统计用户订单利润失败:'. $e->getMessage());
  236. }
  237. }
  238. public static function calculatePerformanceRefund($params)
  239. {
  240. try {
  241. $mall_id = $params['mall_id'];
  242. $user_id = $params['user_id'];
  243. $refund_id = $params['refund_id'];
  244. $refund_data = OrderRefund::getOne([
  245. ['mall_id' => $mall_id],
  246. ['user_id' => $user_id],
  247. ['id' => $refund_id],
  248. ], true, ['orderDetail']);
  249. if (empty($refund_data)) throw new Exception('查无此售后订单');
  250. if ($refund_data['type'] == RefundTypeEnum::EXCHANGE_GOODS) {
  251. return true;
  252. }
  253. $parent_id_arr = UserPartitionRelationship::getParentIdArr($user_id);
  254. $parent_id_arr[] = $user_id;
  255. //查找该商品是否已增加利润业绩
  256. $log_data = UserTeamProfitStatisticsLog::getOne([
  257. ['mall_id' => $mall_id],
  258. ['goods_id' => $refund_data['orderDetail']['goods_id']],
  259. ['order_detail_id' => $refund_data['orderDetail']['id']],
  260. ['status' => StatusEnum::ENABLED],
  261. ], true);
  262. if (empty($log_data)) throw new Exception('该售后商品未曾为用户增加利润业绩');
  263. //获取订单详情数据
  264. $list = self::lists([
  265. 'where' => [
  266. ['mall_id' => $mall_id],
  267. ['user_id' => $parent_id_arr]
  268. ],
  269. ], false);
  270. $achievement_sum = $refund_data['orderDetail']['goods_price'] - bcmul($refund_data['orderDetail']['cost_price'], $refund_data['orderDetail']['num'], 2);
  271. $pay_money = $refund_data['orderDetail']['goods_price'];
  272. $original_goods_price = $refund_data['orderDetail']['original_goods_price'];
  273. if ($achievement_sum <= 0 && $pay_money <= 0) return true;
  274. foreach ($list as $key => $value) {
  275. if ($value['user_id'] != $user_id) {
  276. $value->children_order_pay_profit -= $achievement_sum;
  277. $value->children_order_pay_achievement -= $pay_money;
  278. }
  279. $value->team_order_pay_profit -= $achievement_sum;
  280. $value->team_order_pay_achievement -= $pay_money;
  281. $value->team_order_pay_goods_achievement -= $original_goods_price;
  282. if (!$value->save()) var_dump('售后扣减业绩失败:user_id:'. $user_id.',refund_id:'.$refund_id);
  283. }
  284. } catch (\Exception $e) {
  285. throw new Exception($e->getMessage());
  286. }
  287. }
  288. //数据迁移累计历史订单利润
  289. public static function cumulativeOrderProfit($params)
  290. {
  291. try {
  292. $type = $params['type'] ?? 0;
  293. //获取商城id
  294. $mall_list = Mall::getEnableMallList(true);
  295. if(!empty($mall_list)){
  296. foreach ($mall_list as $mall){
  297. // var_dump('商城:'. $mall['id']);
  298. self::orderProfit(['mall_id' => $mall['id'], 'type' => $type]);
  299. }
  300. }
  301. return true;
  302. } catch (\Exception $e) {
  303. throw new Exception();
  304. }
  305. }
  306. //处理历史订单数据
  307. public static function orderProfit($params)
  308. {
  309. try {
  310. // 判断是否开启
  311. $config = Yii::$app->services->setting->mall->get($params['mall_id'], 'order');
  312. $achievementGoodsIds = [];
  313. if (!empty($config['is_designated_achievement_goods'])) {
  314. $achievementGoodsIds = json_decode($config['achievement_goods_ids'], true);
  315. }
  316. // 重置用户团队业绩数据
  317. UserTeamProfitStatisticsLog::updateAll(['status' => StatusEnum::DELETE], ['mall_id' => $params['mall_id'], 'status' => StatusEnum::ENABLED]);
  318. UserTeamProfitStatistics::updateAll([
  319. 'children_order_pay_profit' => 0,
  320. 'team_order_pay_profit' => 0,
  321. 'children_order_finish_profit' => 0,
  322. 'team_order_finish_profit' => 0,
  323. 'children_order_pay_achievement' => 0,
  324. 'team_order_pay_achievement' => 0,
  325. 'children_order_finish_achievement' => 0,
  326. 'team_order_finish_achievement' => 0
  327. ],
  328. ['mall_id' => $params['mall_id']]
  329. );
  330. // 查询数据更新统计
  331. $orderDetailModel = OrderDetail::find()
  332. ->where(['mall_id' => $params['mall_id'], 'status' => StatusEnum::ENABLED])
  333. ->andWhere(['order_status' => [OrderStatusEnum::PAY, OrderStatusEnum::SHIPMENTS, OrderStatusEnum::SING, OrderStatusEnum::ACCOMPLISH, OrderStatusEnum::TAKE, OrderStatusEnum::TAKE_FINISH]])
  334. ->select('id, user_id, mall_id, order_status, goods_price, cost_price, num');
  335. if (!empty($config['is_designated_achievement_goods'])) {
  336. $orderDetailModel->andWhere(['goods_id' => $achievementGoodsIds]);
  337. }
  338. foreach ($orderDetailModel->asArray()->batch(1000) as $orderDetails) {
  339. foreach ($orderDetails as $orderDetail) {
  340. $children_order_pay_profit = 0; // 下级支付订单业绩 (不包含自己)
  341. $team_order_pay_profit = 0; // 团队支付订单业绩(包含自己)
  342. $children_order_finish_profit = 0; // 下级完成订单业绩 (不包含自己)
  343. $team_order_finish_profit = 0; // 团队完成订单业绩(包含自己)
  344. $children_order_pay_achievement = 0; // 下级支付订单业绩(实付金额) (不包含自己)
  345. $team_order_pay_achievement = 0; // 团队支付订单业绩(实付金额) (包含自己)
  346. $children_order_finish_achievement = 0; // 下级完成订单业绩(实付金额) (不包含自己)
  347. $team_order_finish_achievement = 0; // 团队完成订单业绩(实付金额) (包含自己)
  348. // 获取当前订单价对应的业绩
  349. $achievementMoney = bcsub($orderDetail['goods_price'], $orderDetail['cost_price'] * $orderDetail['num'], 2);
  350. $pay_money = $orderDetail['goods_price'];
  351. if ($achievementMoney > 0) { // 如果大于0进行累加计算
  352. $children_order_pay_profit = $achievementMoney;
  353. $team_order_pay_profit = $achievementMoney;
  354. if ($orderDetail['order_status'] == OrderStatusEnum::ACCOMPLISH) {
  355. $children_order_finish_profit = $achievementMoney;
  356. $team_order_finish_profit = $achievementMoney;
  357. }
  358. }
  359. //实付金额
  360. if ($pay_money > 0) {
  361. $children_order_pay_achievement = $pay_money;
  362. $team_order_pay_achievement = $pay_money;
  363. if ($orderDetail['order_status'] == OrderStatusEnum::ACCOMPLISH) {
  364. $children_order_finish_achievement = $pay_money;
  365. $team_order_finish_achievement = $pay_money;
  366. }
  367. }
  368. // 获取用户上级
  369. $parent_id_arr = UserPartitionRelationship::getParentIdArr($orderDetail['user_id']);
  370. if (empty($parent_id_arr)) {
  371. $parent_id_arr = [];
  372. }
  373. $parent_id_arr[] = $orderDetail['user_id'];
  374. $userTeamList = self::find()
  375. ->where(['user_id' => $parent_id_arr, 'mall_id' => $params['mall_id']])
  376. ->indexBy('user_id')
  377. ->all();
  378. foreach ($parent_id_arr as $user_id) {
  379. $userTeamModel = $userTeamList[$user_id] ?? null;
  380. if (empty($userTeamModel)) { // 如果没有则创建
  381. $userTeamModel = new UserTeamProfitStatistics();
  382. $userTeamModel->loadDefaultValues();
  383. $userTeamModel->mall_id = $params['mall_id'];
  384. $userTeamModel->user_id = $user_id;
  385. //商品利润
  386. $userTeamModel->team_order_pay_profit = 0;
  387. $userTeamModel->team_order_finish_profit = 0;
  388. $userTeamModel->children_order_pay_profit = 0;
  389. $userTeamModel->children_order_finish_profit = 0;
  390. //实付金额
  391. $userTeamModel->team_order_pay_achievement = 0;
  392. $userTeamModel->team_order_finish_achievement = 0;
  393. $userTeamModel->children_order_pay_achievement = 0;
  394. $userTeamModel->children_order_finish_achievement = 0;
  395. }
  396. //商品利润
  397. $userTeamModel->team_order_pay_profit += $team_order_pay_profit;
  398. $userTeamModel->team_order_finish_profit += $team_order_finish_profit;
  399. //实付金额
  400. $userTeamModel->team_order_pay_achievement += $team_order_pay_achievement;
  401. $userTeamModel->team_order_finish_achievement += $team_order_finish_achievement;
  402. if ($user_id != $orderDetail['user_id']) { // 如果不是自己那么就是追加到父级的业绩中
  403. //商品利润
  404. $userTeamModel->children_order_pay_profit += $children_order_pay_profit;
  405. $userTeamModel->children_order_finish_profit += $children_order_finish_profit;
  406. //实付金额
  407. $userTeamModel->children_order_pay_achievement += $children_order_pay_achievement;
  408. $userTeamModel->children_order_finish_achievement += $children_order_finish_achievement;
  409. }
  410. if (!$userTeamModel->save()) {
  411. var_dump("团队业绩统计失败");
  412. }
  413. }
  414. }
  415. }
  416. return true;
  417. } catch (\Exception $e) {
  418. print_r($e->getMessage());exit;
  419. throw new Exception($e->getMessage());
  420. }
  421. }
  422. //数据迁移累计历史订单业绩
  423. public static function cumulativeOrderAchievement($params)
  424. {
  425. try {
  426. $type = $params['type'] ?? 0;
  427. //获取商城id
  428. $mall_list = Mall::getEnableMallList(true);
  429. if(!empty($mall_list)){
  430. foreach ($mall_list as $mall){
  431. // var_dump('商城:'. $mall['id']);
  432. self::orderAchievement(['mall_id' => $mall['id'], 'type' => $type]);
  433. }
  434. }
  435. return true;
  436. } catch (\Exception $e) {
  437. throw new Exception();
  438. }
  439. }
  440. //处理历史订单实付金额数据
  441. public static function orderAchievement($params)
  442. {
  443. try {
  444. // 判断是否开启
  445. $config = Yii::$app->services->setting->mall->get($params['mall_id'], 'order');
  446. $achievementGoodsIds = [];
  447. if (!empty($config['is_designated_achievement_goods'])) {
  448. $achievementGoodsIds = json_decode($config['achievement_goods_ids'], true);
  449. }
  450. // 重置用户团队业绩数据
  451. UserTeamProfitStatisticsLog::updateAll(['status' => StatusEnum::DELETE], ['mall_id' => $params['mall_id'], 'status' => StatusEnum::ENABLED]);
  452. UserTeamProfitStatistics::updateAll([
  453. 'children_order_pay_achievement' => 0,
  454. 'team_order_pay_achievement' => 0,
  455. 'children_order_finish_achievement' => 0,
  456. 'team_order_finish_achievement' => 0
  457. ],
  458. ['mall_id' => $params['mall_id']]
  459. );
  460. // 查询数据更新统计
  461. $orderDetailModel = OrderDetail::find()
  462. ->where(['mall_id' => $params['mall_id'], 'status' => StatusEnum::ENABLED])
  463. ->andWhere(['order_status' => [OrderStatusEnum::PAY, OrderStatusEnum::SHIPMENTS, OrderStatusEnum::SING, OrderStatusEnum::ACCOMPLISH, OrderStatusEnum::TAKE, OrderStatusEnum::TAKE_FINISH]])
  464. ->select('id, user_id, mall_id, order_status, goods_price, cost_price, num');
  465. if (!empty($config['is_designated_achievement_goods'])) {
  466. $orderDetailModel->andWhere(['goods_id' => $achievementGoodsIds]);
  467. }
  468. foreach ($orderDetailModel->asArray()->batch(1000) as $orderDetails) {
  469. foreach ($orderDetails as $orderDetail) {
  470. $children_order_pay_achievement = 0; // 下级支付订单业绩(实付金额) (不包含自己)
  471. $team_order_pay_achievement = 0; // 团队支付订单业绩(实付金额) (包含自己)
  472. $children_order_finish_achievement = 0; // 下级完成订单业绩(实付金额) (不包含自己)
  473. $team_order_finish_achievement = 0; // 团队完成订单业绩(实付金额) (包含自己)
  474. // 获取当前订单价对应的业绩
  475. $pay_money = $orderDetail['goods_price'];
  476. //实付金额
  477. if ($pay_money > 0) {
  478. $children_order_pay_achievement = $pay_money;
  479. $team_order_pay_achievement = $pay_money;
  480. if ($orderDetail['order_status'] == OrderStatusEnum::ACCOMPLISH) {
  481. $children_order_finish_achievement = $pay_money;
  482. $team_order_finish_achievement = $pay_money;
  483. }
  484. }
  485. // 获取用户上级
  486. $parent_id_arr = UserPartitionRelationship::getParentIdArr($orderDetail['user_id']);
  487. if (empty($parent_id_arr)) {
  488. $parent_id_arr = [];
  489. }
  490. $parent_id_arr[] = $orderDetail['user_id'];
  491. $userTeamList = self::find()
  492. ->where(['user_id' => $parent_id_arr, 'mall_id' => $params['mall_id']])
  493. ->indexBy('user_id')
  494. ->all();
  495. foreach ($parent_id_arr as $user_id) {
  496. $userTeamModel = $userTeamList[$user_id] ?? null;
  497. if (empty($userTeamModel)) { // 如果没有则创建
  498. $userTeamModel = new UserTeamProfitStatistics();
  499. $userTeamModel->loadDefaultValues();
  500. $userTeamModel->mall_id = $params['mall_id'];
  501. $userTeamModel->user_id = $user_id;
  502. //商品利润
  503. $userTeamModel->team_order_pay_profit = 0;
  504. $userTeamModel->team_order_finish_profit = 0;
  505. $userTeamModel->children_order_pay_profit = 0;
  506. $userTeamModel->children_order_finish_profit = 0;
  507. //实付金额
  508. $userTeamModel->team_order_pay_achievement = 0;
  509. $userTeamModel->team_order_finish_achievement = 0;
  510. $userTeamModel->children_order_pay_achievement = 0;
  511. $userTeamModel->children_order_finish_achievement = 0;
  512. }
  513. //实付金额
  514. $userTeamModel->team_order_pay_achievement += $team_order_pay_achievement;
  515. $userTeamModel->team_order_finish_achievement += $team_order_finish_achievement;
  516. if ($user_id != $orderDetail['user_id']) { // 如果不是自己那么就是追加到父级的业绩中
  517. //实付金额
  518. $userTeamModel->children_order_pay_achievement += $children_order_pay_achievement;
  519. $userTeamModel->children_order_finish_achievement += $children_order_finish_achievement;
  520. }
  521. if (!$userTeamModel->save()) {
  522. var_dump("团队业绩统计失败");
  523. }
  524. }
  525. }
  526. }
  527. return true;
  528. } catch (\Exception $e) {
  529. print_r($e->getMessage());exit;
  530. throw new Exception($e->getMessage());
  531. }
  532. }
  533. public static function getTeamInfo($mall_id, $user_id)
  534. {
  535. $data = [
  536. 'is_show' => 0,
  537. 'team_performance' => 0,
  538. 'big_market_performance' => 0,
  539. 'small_market_performance' => 0
  540. ];
  541. if (MallAddons::isInstall($mall_id, AddonsEnum::ADDONS_NAME_STOCKHOLDER) == true) {
  542. $setting = \addons\Stockholder\common\services\BackendService::getSetting($mall_id);
  543. $data['is_show'] = (int)($setting['is_show_performance'] ?? 0);
  544. if ($data['is_show']) {
  545. $statistics = self::getOne([['user_id' => $user_id]], true);
  546. $settlement_method = (int)($setting['settlement_method'] ?? 0);
  547. $is_include_yourself = (int)($setting['is_include_yourself'] ?? 0);
  548. //获取直推用户id
  549. $direct_child_ids = UserPartitionRelationship::getChildIdArr($user_id, 1);
  550. $child_team_data = UserTeamProfitStatistics::lists([
  551. 'where' => [
  552. ['user_id' => $direct_child_ids],
  553. ],
  554. 'select' => 'id,user_id,team_order_pay_profit,team_order_finish_profit',
  555. ]);
  556. switch ($settlement_method) {
  557. case 0:
  558. $data['team_performance'] = $statistics['children_order_finish_profit'];
  559. if (!empty($child_team_data)) {
  560. $big_market_performance_arr = array_column($child_team_data, 'team_order_finish_profit');
  561. $data['big_market_performance'] = max($big_market_performance_arr);
  562. }
  563. break;
  564. case 1:
  565. $data['team_performance'] = $statistics['children_order_pay_profit'];
  566. if (!empty($child_team_data)) {
  567. $big_market_performance_arr = array_column($child_team_data, 'team_order_pay_profit');
  568. $data['big_market_performance'] = max($big_market_performance_arr);
  569. }
  570. break;
  571. }
  572. if ($data['big_market_performance'] > 0) {
  573. $data['small_market_performance'] = bcsub($data['team_performance'], $data['big_market_performance'], 2);
  574. }
  575. switch ($settlement_method) {
  576. case 0:
  577. if (!empty($is_include_yourself)) $data['team_performance'] = $statistics['team_order_finish_profit'];
  578. break;
  579. case 1:
  580. if (!empty($is_include_yourself)) $data['team_performance'] = $statistics['team_order_pay_profit'];
  581. break;
  582. }
  583. }
  584. }
  585. return $data;
  586. }
  587. public static function userChangeRelationship($params)
  588. {
  589. try {
  590. $user_id = $params['user_id'];
  591. $new_all_tree = $params['new_all_tree'];
  592. $old_all_tree = $params['old_all_tree'];
  593. //获取当前用户的业绩
  594. $user_data = UserTeamProfitStatistics::getOne([
  595. ['user_id' => $user_id],
  596. ]);
  597. if (!empty($new_all_tree)) {
  598. $parent_id_arr = UserPartitionRelationship::getParentIdArr($user_id);
  599. //获取当前用户的订单利润数据
  600. $user_list = self::lists([
  601. 'where' => [
  602. ['mall_id' => $user_data['mall_id']],
  603. ['user_id' => $parent_id_arr]
  604. ],
  605. 'index' => 'user_id',
  606. ], false);
  607. //用户订单利润数据操作
  608. foreach ($parent_id_arr as $user) {
  609. $item = $user_list[$user];
  610. if (empty($item)) {
  611. $item = new UserTeamProfitStatistics();
  612. $item->loadDefaultValues();
  613. $item->mall_id = $user_data['mall_id'];
  614. $item->user_id = $user;
  615. $item->team_order_pay_profit = 0;
  616. $item->team_order_finish_profit = 0;
  617. $item->children_order_pay_profit = 0;
  618. $item->children_order_finish_profit = 0;
  619. }
  620. //订单正常累加
  621. $item->team_order_pay_profit += $user_data->team_order_pay_profit;
  622. $item->team_order_finish_profit += $user_data->team_order_finish_profit;
  623. $item->children_order_pay_profit += $user_data->children_order_pay_profit;
  624. $item->children_order_finish_profit += $user_data->children_order_finish_profit;
  625. if (!$item->save()) var_dump('记录用户利润信息失败:user_id:'.$user);
  626. }
  627. }
  628. if (!empty($old_all_tree)) {
  629. $old_tree = explode(',', $old_all_tree);
  630. //获取用户数据
  631. $old_user = User::lists([
  632. 'where' => [
  633. ['base64_code' => $old_tree],
  634. ['status' => StatusEnum::ENABLED],
  635. ],
  636. 'index' => 'id',
  637. 'select' => 'id,mall_id,mobile'
  638. ]);
  639. if (!empty($old_ids)) {
  640. $old_ids = array_column($old_user, 'id');
  641. //获取当前用户的订单利润数据
  642. $user_list = self::lists([
  643. 'where' => [
  644. ['mall_id' => $user_data['mall_id']],
  645. ['user_id' => $old_ids]
  646. ],
  647. 'index' => 'user_id',
  648. ], false);
  649. //用户订单利润数据操作
  650. foreach ($old_ids as $old_user_id) {
  651. $item = $user_list[$old_user_id];
  652. if (empty($item)) {
  653. $item = new UserTeamProfitStatistics();
  654. $item->loadDefaultValues();
  655. $item->mall_id = $user_data['mall_id'];
  656. $item->user_id = $old_user_id;
  657. $item->team_order_pay_profit = 0;
  658. $item->team_order_finish_profit = 0;
  659. $item->children_order_pay_profit = 0;
  660. $item->children_order_finish_profit = 0;
  661. }
  662. //订单正常累加
  663. $item->team_order_pay_profit -= $user_data->team_order_pay_profit;
  664. $item->team_order_finish_profit -= $user_data->team_order_finish_profit;
  665. $item->children_order_pay_profit -= $user_data->children_order_pay_profit;
  666. $item->children_order_finish_profit -= $user_data->children_order_finish_profit;
  667. if (!$item->save()) var_dump('记录用户利润信息失败:user_id:'.$old_user_id);
  668. }
  669. }
  670. }
  671. } catch (\Throwable $th) {
  672. //throw $th;
  673. }
  674. }
  675. }