UserTeamPerformanceStatistics.php 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227
  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\StatusEnum;
  7. use common\models\mall\MallAddons;
  8. use common\models\order\OrderDetail;
  9. use Yii;
  10. /**
  11. * This is the model class for table "{{%user_team_performance_statistics}}".
  12. *
  13. * @property int $id ID
  14. * @property int $mall_id 商城ID
  15. * @property int $user_id 用户ID
  16. * @property float $pay_team_performance 总团队利润业绩[订单支付]
  17. * @property float $accomplish_team_performance 总团队利润业绩[订单完成]
  18. * @property float $pay_big_market_performance 大市场利润业绩[订单支付]
  19. * @property float $accomplish_big_market_performance 大市场利润业绩[订单完成]
  20. * @property float $pay_user_performance 用户利润业绩[订单支付]
  21. * @property float $accomplish_user_performance 用户利润业绩[订单完成]
  22. * @property int $status 状态[-1删除; 0禁用; 1正常]
  23. * @property int $created_at 创建时间
  24. * @property int $updated_at 更新时间
  25. */
  26. class UserTeamPerformanceStatistics extends \common\models\base\BaseActiveRecord
  27. {
  28. /**
  29. * {@inheritdoc}
  30. */
  31. public static function tableName()
  32. {
  33. return '{{%user_team_performance_statistics}}';
  34. }
  35. /**
  36. * {@inheritdoc}
  37. */
  38. public function rules()
  39. {
  40. return [
  41. [['mall_id', 'user_id', 'status', 'created_at', 'updated_at'], 'integer'],
  42. [['pay_team_performance', 'accomplish_team_performance', 'pay_big_market_performance', 'accomplish_big_market_performance', 'pay_user_performance', 'accomplish_user_performance'], 'number'],
  43. ];
  44. }
  45. /**
  46. * {@inheritdoc}
  47. */
  48. public function attributeLabels()
  49. {
  50. return [
  51. 'id' => 'ID',
  52. 'mall_id' => '商城ID',
  53. 'user_id' => '用户ID',
  54. 'pay_team_performance' => '总团队利润业绩[订单支付]',
  55. 'accomplish_team_performance' => '总团队利润业绩[订单完成]',
  56. 'pay_big_market_performance' => '大市场利润业绩[订单支付]',
  57. 'accomplish_big_market_performance' => '大市场利润业绩[订单完成]',
  58. 'pay_user_performance' => '用户利润业绩[订单支付]',
  59. 'accomplish_user_performance' => '用户利润业绩[订单完成]',
  60. 'status' => '状态[-1删除; 0禁用; 1正常]',
  61. 'created_at' => '创建时间',
  62. 'updated_at' => '更新时间',
  63. ];
  64. }
  65. /**
  66. * @Description: 保存数据
  67. * @Author: zsan
  68. * @DateTime 2024-04-11 10:21:30
  69. * @param array $data
  70. * @return bool|self
  71. */
  72. public static function setData(array $data)
  73. {
  74. try {
  75. $model = self::findOne(['user_id' => $data['user_id'], 'status' => StatusEnum::ENABLED]);
  76. if (empty($model)) {
  77. $model = new self();
  78. $model->loadDefaultValues();
  79. }
  80. if (!$model->load($data, '') || !$model->save()) {
  81. throw new \Exception($model->getErrorMessage());
  82. }
  83. return $model;
  84. } catch (\Exception $e) {
  85. self::setStaticError($e->getMessage());
  86. return false;
  87. }
  88. }
  89. public static function calculatePerformance($params)
  90. {
  91. $mall_id= $params['mall_id'];
  92. $uid = $params['user_id'];
  93. $order_id = $params['order_id'];
  94. try {
  95. // 判断是否开启
  96. $config = Yii::$app->services->setting->mall->get($mall_id, 'order');
  97. $achievementGoodsIds = [];
  98. if (!empty($config['is_designated_achievement_goods'])) {
  99. $achievementGoodsIds = json_decode($config['achievement_goods_ids'], true);
  100. if (empty($achievementGoodsIds)) {
  101. $achievementGoodsIds = true;
  102. }
  103. }
  104. $parent_id_arr = UserPartitionRelationship::getParentIdArr($uid);
  105. $parent_id_arr[] = $uid;
  106. foreach ($parent_id_arr as $user_id) {
  107. $user_id_arr = UserPartitionRelationship::getChildIdArr($user_id);
  108. $pay_team_performance = 0;
  109. $accomplish_team_performance = 0;
  110. if (!empty($user_id_arr)) {
  111. $pay_team_performance = self::computeGoodsPerformance($user_id_arr, ['order_status' => [OrderStatusEnum::PAY, OrderStatusEnum::SHIPMENTS, OrderStatusEnum::SING, OrderStatusEnum::ACCOMPLISH]], $achievementGoodsIds);
  112. $accomplish_team_performance = self::computeGoodsPerformance($user_id_arr, ['order_status' => OrderStatusEnum::ACCOMPLISH], $achievementGoodsIds);
  113. }
  114. $pay_user_performance = self::computeGoodsPerformance($user_id, ['order_status' => [OrderStatusEnum::PAY, OrderStatusEnum::SHIPMENTS, OrderStatusEnum::SING, OrderStatusEnum::ACCOMPLISH]], $achievementGoodsIds);
  115. $accomplish_user_performance = self::computeGoodsPerformance($user_id, ['order_status' => [OrderStatusEnum::ACCOMPLISH]], $achievementGoodsIds);
  116. $direct_user_id_arr = UserPartitionRelationship::getChildIdArr($user_id, 1);
  117. $pay_big_market_performance = 0;
  118. $accomplish_big_market_performance = 0;
  119. if (!empty($direct_user_id_arr)) {
  120. $pay_performance_arr = [];
  121. $accomplish_performance_arr = [];
  122. foreach ($direct_user_id_arr as $id) {
  123. $child_id_arr = UserPartitionRelationship::getChildIdArr($id);
  124. $child_id_arr[] = $id;
  125. $pay_performance_arr[] = self::computeGoodsPerformance($child_id_arr, ['order_status' => [OrderStatusEnum::PAY, OrderStatusEnum::SHIPMENTS, OrderStatusEnum::SING, OrderStatusEnum::ACCOMPLISH]], $achievementGoodsIds);
  126. $accomplish_performance_arr[] = self::computeGoodsPerformance($child_id_arr, ['order_status' => [OrderStatusEnum::ACCOMPLISH]], $achievementGoodsIds);
  127. }
  128. $pay_big_market_performance = max($pay_performance_arr);
  129. $accomplish_big_market_performance = max($accomplish_performance_arr);
  130. }
  131. if (self::setData([
  132. 'mall_id' => $mall_id,
  133. 'user_id' => $user_id,
  134. 'pay_team_performance' => $pay_team_performance > 0 ? $pay_team_performance : 0,
  135. 'accomplish_team_performance' => $accomplish_team_performance > 0 ? $accomplish_team_performance : 0,
  136. 'pay_big_market_performance' => $pay_big_market_performance > 0 ? $pay_big_market_performance : 0,
  137. 'accomplish_big_market_performance' => $accomplish_big_market_performance > 0 ? $accomplish_big_market_performance : 0,
  138. 'pay_user_performance' => $pay_user_performance > 0 ? $pay_user_performance : 0,
  139. 'accomplish_user_performance' => $accomplish_user_performance > 0 ? $accomplish_user_performance : 0,
  140. ]) === false) {
  141. throw new \Exception(self::getStaticError());
  142. }
  143. }
  144. //再次执行会员升级任务
  145. \Yii::$app->services->rabbitMq->push(RabbitMqEnum::EXCHANGE_ORDER, RabbitMqEnum::ORDER_QUEUE, ['id' => $order_id], \common\listeners\user\UserUpgradeListener::class, 'handleSync');
  146. return true;
  147. } catch (\Exception $e) {
  148. \Yii::error(__METHOD__ . ' ' . json_encode(['msg' => $e->getMessage(), 'line' => $e->getLine()]));
  149. self::setStaticError($e->getMessage());
  150. return false;
  151. }
  152. }
  153. public static function computeGoodsPerformance($user_id, $andwhere, $achievementGoodsIds = [])
  154. {
  155. $data = OrderDetail::find()
  156. ->where(['user_id' => $user_id, 'status' => StatusEnum::ENABLED]);
  157. if ($achievementGoodsIds === true) return 0;
  158. if (!empty($achievementGoodsIds)) {
  159. $data->andWhere(['goods_id' => $achievementGoodsIds]);
  160. }
  161. $data = (array)$data->andWhere($andwhere)
  162. ->select('goods_price,cost_price,num')
  163. ->asArray()
  164. ->all();
  165. $goods_performance = 0;
  166. foreach ($data as $value) {
  167. $performance = $value['goods_price'] - bcmul($value['cost_price'], $value['num'], 2);
  168. if ($performance > 0) $goods_performance += $performance;
  169. }
  170. return $goods_performance;
  171. }
  172. public static function getTeamInfo($mall_id, $user_id)
  173. {
  174. $data = [
  175. 'is_show' => 0,
  176. 'team_performance' => 0,
  177. 'big_market_performance' => 0,
  178. 'small_market_performance' => 0
  179. ];
  180. if (MallAddons::isInstall($mall_id, AddonsEnum::ADDONS_NAME_STOCKHOLDER) == true) {
  181. $setting = \addons\Stockholder\common\services\BackendService::getSetting($mall_id);
  182. $data['is_show'] = (int)($setting['is_show_performance'] ?? 0);
  183. if ($data['is_show']) {
  184. $statistics = UserTeamPerformanceStatistics::getOne([['user_id' => $user_id], ['status' => StatusEnum::ENABLED]], true);
  185. $settlement_method = (int)($setting['settlement_method'] ?? 0);
  186. $is_include_yourself = (int)($setting['is_include_yourself'] ?? 0);
  187. switch ($settlement_method) {
  188. case 0:
  189. $data['team_performance'] = $statistics['accomplish_team_performance'];
  190. $data['big_market_performance'] = $statistics['accomplish_big_market_performance'];
  191. break;
  192. case 1:
  193. $data['team_performance'] = $statistics['pay_team_performance'];
  194. $data['big_market_performance'] = $statistics['pay_big_market_performance'];
  195. break;
  196. }
  197. if ($data['big_market_performance'] > 0) {
  198. $data['small_market_performance'] = bcsub($data['team_performance'], $data['big_market_performance'], 2);
  199. }
  200. switch ($settlement_method) {
  201. case 0:
  202. if (!empty($is_include_yourself)) $data['team_performance'] += $statistics['accomplish_user_performance'];
  203. break;
  204. case 1:
  205. if (!empty($is_include_yourself)) $data['team_performance'] += $statistics['pay_user_performance'];
  206. break;
  207. }
  208. }
  209. }
  210. return $data;
  211. }
  212. }