| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326 |
- <?php
- namespace addons\BusinessActivity\common\logic;
- use addons\BusinessActivity\common\enums\BusinessActivityEnum;
- use addons\BusinessActivity\common\enums\ConfigEnum;
- use addons\BusinessActivity\common\models\AddonsBusinessActivityCommissionModel;
- use addons\BusinessActivity\common\models\AddonsBusinessActivityGoodsModel;
- use addons\BusinessActivity\common\models\AddonsBusinessActivityModel;
- use addons\BusinessActivity\common\models\AddonsBusinessActivityOrderModel;
- use addons\BusinessActivity\common\service\SettingService;
- use common\enums\StatusEnum;
- use common\helpers\FormatHelper;
- use common\models\mall\MallAddons;
- use common\models\order\Order;
- use common\models\order\OrderDetail;
- use common\models\user\User;
- use Exception;
- use services\common\UserWalletService;
- use Yii;
- use yii\helpers\Json;
- class CommissionLogic
- {
- public function exec(Order $order, array $config, array $ext)
- {
- $t = Yii::$app->db->beginTransaction();
- try {
- $this->execMain($order, $config, $ext);
- $t->commit();
- } catch (\Exception $e) {
- $t->rollBack();
- $exception = FormatHelper::exception($e, "订单支付触发社区团购插件事件: 分润失败 {$order->id} " . Json::encode($ext) . " " . Json::encode($config));
- Yii::error($exception);
- }
- }
- /**
- * @throws Exception
- */
- public function execMain(Order $order, array $config, int $activity_id)
- {
- $mall_id = $order['mall_id'];
- $order_id = $order['id'];
- $user_id = $order['user_id'];
- $activity_order = AddonsBusinessActivityOrderModel::find()
- ->where(['mall_id' => $mall_id])
- ->andWhere(['order_id' => $order_id])
- ->andWhere(['activity_id' => $activity_id])
- ->with(['activity'])
- ->one();
- if (empty($activity_order)) {
- Yii::error("活动订单不存在: activity_id: {$activity_id}, order_id: {$order_id}");
- return;
- }
- $activity = $activity_order->activity;
- // 取出可以订单商品ID?
- $activity_goods_ids = Json::decode($activity_order->goods_ids);
- // 取出下单时参与的商品,不管删除与否都参与进来
- $goods = AddonsBusinessActivityGoodsModel::find()->where(['activity_id' => $activity_id])
- ->andWhere(['id' => $activity_goods_ids])
- ->asArray()
- ->all();
- $goods = array_reduce($goods, function (&$goods, $val) {
- $goods[$val['goods_id']] = $val;
- return $goods;
- });
- $goods_ids = array_column($goods, 'goods_id'); // 获取商品ID
- $params['where'] = [['order_id' => $order_id], ['user_id' => $user_id], ['mall_id' => $mall_id], ['order_status' => $order->order_status],
- ['goods_id' => $goods_ids]];
- $order_detail_list = OrderDetail::lists($params);
- if (empty($order_detail_list)) {
- Yii::error("订单详情不存在: {$order_id}");
- return;
- }
- $insert_wallet = [];
- $insert_plugin = [];
- $config = (new SettingService())->get($order->mall_id);
- foreach ($order_detail_list as $item) {
- $merchants_commission = 0; // 招商
- $merchants_commission_parent = 0; // 招商上级
- $venue_commission = 0; // 场地
- $venue_commission_parent = 0; // 场地上级
- $g_item = $goods[$item['goods_id']] ?? null;
- if (!empty($g_item)) { // 存在
- if ($g_item['is_alone_commission'] == StatusEnum::ENABLED) { // 这里是独立设置
- $merchants_commission = bcmul($g_item['merchants_commission'], $item['num'], 2);
- $merchants_commission_parent = bcmul($g_item['merchants_parent_commission'], $item['num'], 2);
- $venue_commission = bcmul($g_item['venue_commission'], $item['num'], 2);
- $venue_commission_parent = bcmul($g_item['venue_parent_commission'], $item['num'], 2);
- if ($g_item['commission_type'] == StatusEnum::ENABLED) { // 1百分比, 2固定值
- $base_amount = 0;
- switch ($config['payment_type']) {
- case ConfigEnum::CALCULATE_TYPE_PAY_AMOUNT: // 实际支付金额
- $base_amount = $item['goods_price']; // 已经包含数量
- break;
- case ConfigEnum::CALCULATE_TYPE_GOODS_PRICE: // 商品售价
- // 计算商品售价
- $base_amount = bcmul($item['price'], $item['num'], 2);
- break;
- case ConfigEnum::CALCULATE_TYPE_GOODS_PROFIT: // 商品利润
- $base_amount = bcmul(bcsub($item['price'], $item['cost_price'], 2), $item['num'], 2);
- break;
- }
- $merchants_commission = bcmul($base_amount, bcmul($g_item['merchants_commission'], 0.01, 2), 2);
- $merchants_commission_parent = bcmul($base_amount, bcmul($g_item['merchants_parent_commission'], 0.01, 2), 2);
- $venue_commission = bcmul($base_amount, bcmul($g_item['venue_commission'], 0.01, 2), 2);
- $venue_commission_parent = bcmul($base_amount, bcmul($g_item['venue_parent_commission'], 0.01, 2), 2);
- }
- } else { // 走公共提成设置
- if ($config['is_commission'] != StatusEnum::ENABLED) {
- Yii::error("Business Activity reward 未开启奖励");
- continue;
- }
- switch ($config['commission_type']) {
- case ConfigEnum::BUSINESS_ACTIVITY_COMMISSION_TYPE_FIXED: // 固定金额
- $merchants_commission = bcmul($config['investment_scale'], $item['num'], 2);
- $venue_commission = bcmul($config['site_scale'], $item['num'], 2);
- break;
- case ConfigEnum::BUSINESS_ACTIVITY_COMMISSION_TYPE_RATE: // 百分比
- $base_amount = 0;
- switch ($config['payment_type']) {
- case ConfigEnum::CALCULATE_TYPE_PAY_AMOUNT: // 实际支付金额
- $base_amount = $item['goods_price']; // 已经包含数量
- break;
- case ConfigEnum::CALCULATE_TYPE_GOODS_PRICE: // 商品售价
- // 计算商品售价
- $base_amount = bcmul($item['price'], $item['num'], 2);
- break;
- case ConfigEnum::CALCULATE_TYPE_GOODS_PROFIT: // 商品利润
- $base_amount = bcmul(bcsub($item['price'], $item['cost_price'], 2), $item['num'], 2);
- break;
- }
- $merchants_commission = bcmul($base_amount, bcmul($config['investment_scale'], 0.01, 2), 2);
- $merchants_commission_parent = bcmul($base_amount, bcmul($config['investment_scale_parent'], 0.01, 2), 2);
- $venue_commission = bcmul($base_amount, bcmul($config['site_scale'], 0.01, 2), 2);
- $venue_commission_parent = bcmul($base_amount, bcmul($config['site_scale_parent'], 0.01, 2), 2);
- break;
- }
- }
- }
- if (!empty($merchants_commission)) { // 如果奖励给招商人不为空
- $insert_wallet[] = $this->genInsertWallet($activity, $order, $item, $activity->merchants_user_id, $merchants_commission,
- "用户 ({$activity->merchants_user_id}) ,[招商负责人]获得招商活动订单 ({$order['id']}) 奖励, 奖励类型:(佣金), 共奖励 ({$merchants_commission}) 元佣金");
- $insert_plugin[] = $this->genInsertPlugin($activity, $order, $item, $activity->merchants_user_id, $merchants_commission,
- "用户[{$order->user->nickname}]通过招商活动[{$activity->name}]下单, 单号为[{$order['order_no']}]共支付[{$order->pay_money}],奖励[招商负责人]佣金[{$merchants_commission}]");
- }
- // 招商负责人上级
- $merchants_commission_parent_user_id = User::find()
- ->where(['id' => $activity->merchants_user_id])->select('parent_id')->scalar();
- if (!empty($merchants_commission_parent) && !empty($merchants_commission_parent_user_id)) { // 如果奖励给招商人上级不为空
- $insert_wallet[] = $this->genInsertWallet($activity, $order, $item, $merchants_commission_parent_user_id, $merchants_commission_parent,
- "用户 ({$merchants_commission_parent_user_id}) ,[招商负责人上级]获得招商活动订单 ({$order['id']}) 奖励, 奖励类型:(佣金), 共奖励 ({$merchants_commission_parent}) 元佣金");
- $insert_plugin[] = $this->genInsertPlugin($activity, $order, $item, $merchants_commission_parent_user_id, $merchants_commission_parent,
- "用户[{$order->user->nickname}]通过招商活动[{$activity->name}]下单, 单号为[{$order['order_no']}]共支付[{$order->pay_money}],奖励[招商负责人上级]佣金[{$merchants_commission_parent}]");
- }
- // 场地负责人
- if (!empty($venue_commission)) { // 如果奖励给场地负则人不为空
- $insert_wallet[] = $this->genInsertWallet($activity, $order, $item, $activity->venue_user_id, $venue_commission,
- "用户 ({$activity->venue_user_id}) ,[场地负责人]获得招商活动订单 ({$order['id']}) 奖励, 奖励类型:(佣金), 共奖励 ({$venue_commission}) 元佣金");
- // 用户[xxx]通过招商活动[xxx]下单,单号为[xxx]共支付[xxx],获得佣金[xxx]
- $insert_plugin[] = $this->genInsertPlugin($activity, $order, $item, $activity->venue_user_id, $venue_commission,
- "用户[{$order->user->nickname}]通过招商活动[{$activity->name}]下单, 单号为[{$order['order_no']}]共支付[{$order->pay_money}],奖励[场地负责人]佣金[{$venue_commission}]");
- }
- // 场地负责人上级
- $venue_commission_parent_user_id = User::find()
- ->where(['id' => $activity->venue_user_id])->select('parent_id')->scalar();
- if (!empty($venue_commission_parent) && !empty($venue_commission_parent_user_id)) { // 如果奖励给场地负则人上级不为空
- $insert_wallet[] = $this->genInsertWallet($activity, $order, $item, $venue_commission_parent_user_id, $venue_commission_parent,
- "用户 ({$venue_commission_parent_user_id}) ,[场地负责人上级]获得招商活动订单 ({$order['id']}) 奖励, 奖励类型:(佣金), 共奖励 ({$venue_commission_parent}) 元佣金");
- // 用户[xxx]通过招商活动[xxx]下单,单号为[xxx]共支付[xxx],获得佣金[xxx]
- $insert_plugin[] = $this->genInsertPlugin($activity, $order, $item, $venue_commission_parent_user_id, $venue_commission_parent,
- "用户[{$order->user->nickname}]通过招商活动[{$activity->name}]下单, 单号为[{$order['order_no']}]共支付[{$order->pay_money}],奖励[场地负责人上级]佣金[{$venue_commission_parent}]");
- }
- }
- if (!empty($insert_wallet)) { // 不为空的情况下
- $res = UserWalletService::batchHandleByQueue($insert_wallet);
- if (empty($res)) throw new \Exception(UserWalletService::getStaticError());
- Yii::$app->db->createCommand()->batchInsert(AddonsBusinessActivityCommissionModel::tableName(),
- array_keys($insert_plugin[0]), $insert_plugin)->execute();
- }
- }
- /**
- * @param AddonsBusinessActivityModel $activity
- * @param Order $order
- * @param array $item
- * @param int $user_id
- * @param $merchants_commission
- * @param $desc
- * @return array
- */
- protected function genInsertWallet(AddonsBusinessActivityModel $activity, Order $order, array $item, int $user_id, $merchants_commission, $desc): array
- {
- return [
- 'mall_id' => $activity->mall_id,
- 'user_id' => $user_id,
- 'is_frozen' => false,
- 'source_table' => OrderDetail::tableName(),
- 'source_table_id' => $item['id'], // 取出订单ID?
- 'from_type' => BusinessActivityEnum::ADDONS_NAME,
- 'capital_type' => BusinessActivityEnum::BUSINESS_ACTIVITY_PRIZE,
- 'contributor_name' => '',
- 'order_no' => $order['order_no'], // 这里需要订单号
- 'wallet_type' => UserWalletService::WALLET_TYPE_COMMISSION,
- 'money' => $merchants_commission,
- 'desc' => $desc,
- ];
- }
- /**
- * @param AddonsBusinessActivityModel $activity
- * @param Order $order
- * @param array $item
- * @param int $user_id
- * @param $merchants_commission
- * @param $desc
- * @return array
- */
- protected function genInsertPlugin(AddonsBusinessActivityModel $activity, Order $order, array $item, int $user_id, $merchants_commission, $desc): array
- {
- return [
- 'mall_id' => $activity->mall_id,
- 'user_id' => $user_id,
- 'commission' => bcmul($merchants_commission, 100),
- 'intro' => $desc,
- 'order_id' => $order->id,
- 'order_detail_id' => $item['id'],
- 'activity_id' => $activity->id,
- 'order_no' => $order->order_no,
- 'created_at' => time(),
- 'updated_at' => time(),
- ];
- }
- /**
- * 佣金退回
- * @param array $commission_list
- * @param array $score_list
- * @return void
- */
- public function refund(array $commission_list, array $score_list)
- {
- /*
- $t = Yii::$app->db->beginTransaction();
- try {
- $order_no = !empty($commission_list) ? $commission_list[0]['order_no'] : $score_list[0]['order_no'];
- if (empty($order_no)) throw new \Exception('没有订单编号');
- $order = Order::find()->where(['order_no' => $order_no])->one();
- if (empty($order)) throw new \Exception('订单不存在');
- // 获取团长信息
- if ($order->shipping_type == OrderStatusEnum::SHIPMENTS && !empty($order->extra_info)) { // 如果是自提订单
- $ext = Json::decode($order->extra_info);
- if (empty($ext['head_id'])) {
- throw new \Exception("OrderPaidRewardListener 非站点自提订单: {$order->id}");
- }
- }
- $insert_wallet = [];
- $insert_plugin = [];
- $wallet_main = [
- 'mall_id' => $order->mall_id,
- 'user_id' => $user_id,
- 'is_frozen' => false,
- 'source_table' => OrderDetail::tableName(),
- 'source_table_id' => $item['id'], // 取出订单ID?
- 'from_type' => CommunityEnum::ADDONS_NAME,
- 'capital_type' => CommunityEnum::COMMUNITY_PICKUP_PRIZE,
- 'contributor_name' => '',
- 'order_no' => $order['order_no'], // 这里需要订单号
- ];
- $plugin_main = [
- 'mall_id' => $mall_id,
- 'user_id' => $head_user_id, // 获奖用户 - 团长用户ID
- 'head_id' => $ext['head_id'],
- 'order_id' => $order['id'],
- 'buyer_user_id' => $user_id,
- 'is_inflow' => StatusEnum::DISABLED, // 非流入
- ];
- // order_no
- if (!empty($commission_list)) {
- foreach ($commission_list as $item) {
- }
- }
- if (!empty($score_list)) {
- foreach ($score_list as $item) {
- }
- }
- $t->commit();
- } catch (\Exception $e) {
- $t->rollBack();
- $exception = FormatHelper::exception($e, "社区团购退回佣金失败");
- \Yii::error($exception);
- }
- */
- }
- }
|