| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346 |
- <?php
- namespace addons\Community\common\logic;
- use addons\Community\common\enums\CommunityEnum;
- use addons\Community\common\enums\ConfigEnum;
- use addons\Community\common\models\CommunityGoodsModeSetting;
- use addons\Community\common\models\CommunityHead;
- use addons\Community\common\models\CommunityHeadCommission;
- use common\enums\AddonsEnum;
- use common\enums\OrderStatusEnum;
- use common\enums\StatusEnum;
- use common\helpers\FormatHelper;
- use common\models\mall\MallAddons;
- use common\models\order\Order;
- use common\models\order\OrderDetail;
- use services\common\UserWalletService;
- use Yii;
- use yii\db\Exception;
- 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, array $ext)
- {
- $mall_id = $order['mall_id'];
- $order_id = $order['id'];
- $user_id = $order['user_id'];
- $head_user_id = CommunityHead::find()
- ->where(['mall_id' => $mall_id])
- ->andWhere(['id' => $ext['head_id']])
- // ->andWhere(['status' => StatusEnum::ENABLED]) // 有可能中途被删除
- ->andWhere(['check_status' => StatusEnum::ENABLED])
- ->select('user_id')->scalar();
- if (empty($head_user_id)) {
- Yii::error("团长不存在: {$ext['head_id']}");
- return false;
- }
- $params['where'] = [['order_id' => $order_id], ['user_id' => $user_id], ['mall_id' => $mall_id], ['order_status' => $order->order_status]];
- $order_detail_list = OrderDetail::lists($params);
- if (empty($order_detail_list)) {
- Yii::error("订单详情不存在: {$order_id}");
- return false;
- }
- $insert_wallet = [];
- $insert_plugin = [];
- foreach ($order_detail_list as $item) {
- $modes = CommunityGoodsModeSetting::lists([
- 'where' => [
- ['item_id' => $item['goods_id']],
- ['enable' => StatusEnum::ENABLED],
- ['status' => StatusEnum::ENABLED],
- ]
- ]);
- $calc_commission = 0;
- $commission = 0;
- $score = 0;
- $hi_bei = 0;
- $hi_value = 0;
- if (!empty($modes)) {
- foreach ($modes as $mode) {
- if ($mode['is_alone'] == StatusEnum::ENABLED) { // 单独设置
- if ($mode['give_num'] <= 0) continue; // 奖励为0的则不赠送
- switch ($mode['commission_type']) {
- case 'commission': // 佣金
- $commission = bcmul($mode['give_num'], $item['num'], 2);
- if ($mode['is_percent'] == StatusEnum::DISABLED) { // 这里是百分比
- $commission = bcmul($item['goods_price'], bcmul($mode['give_num'], 0.01, 2), 2);
- }
- Yii::error("{$order['order_no']} commission {$commission} - {$mode['is_percent']} - {$item['goods_price']}");
- break;
- case 'score': // 积分
- $score = bcmul($mode['give_num'], $item['num'], 2);
- if ($mode['is_percent'] == StatusEnum::DISABLED) { // 这里是百分比
- $score = bcmul($item['goods_price'], bcmul($mode['give_num'], 0.01, 2), 2);
- }
- break;
- case 'hi_bei': // 嗨呗
- // 判断有没有安装这个插件
- if (MallAddons::isInstall($order['mall_id'], AddonsEnum::ADDONS_NAME_HI_GO)) {
- $hi_bei = bcmul($mode['give_num'], $item['num'], 2);
- if ($mode['is_percent'] == StatusEnum::DISABLED) { // 这里是百分比
- $hi_bei = bcmul($item['goods_price'], bcmul($mode['give_num'], 0.01, 2), 2);
- }
- }
- break;
- case 'hi_value': // 嗨值
- // 判断有没有安装过这个插件
- if (MallAddons::isInstall($order['mall_id'], AddonsEnum::ADDONS_NAME_HI_GO)) {
- $hi_value = bcmul($mode['give_num'], $item['num'], 2);
- if ($mode['is_percent'] == StatusEnum::DISABLED) { // 这里是百分比
- $hi_value = bcmul($item['goods_price'], bcmul($mode['give_num'], 0.01, 2), 2);
- }
- }
- break;
- }
- switch ($mode['commission_type']) {
- case 'commission': // 默认就是这个
- $commission = $commission;
- break;
- case 'score':
- $score = $score;
- break;
- case 'hi_bei':
- $hi_bei = $hi_bei;
- break;
- case 'hi_value':
- $hi_value = $hi_value;
- break;
- }
- Yii::$app->custom->logs("{$order['order_no']} {$mode['item_id']} - {$mode['commission_type']} - {$mode['is_alone']} - {$mode['give_num']} - {$item['goods_price']} - {$commission}");
- } else {
- // 这边只有余额?
- if ($config['is_enable_reward'] == StatusEnum::DISABLED) {
- Yii::error("Community reward 未开启奖励");
- continue;
- } // 未开启团长奖励
- switch ($config['head_commission_type']) {
- case ConfigEnum::HEAD_COMMISSION_TYPE_FIXED: // 固定金额
- $calc_commission = bcmul($config['commission'], $item['num'], 2);
- break;
- case ConfigEnum::HEAD_COMMISSION_TYPE_RATE: // 百分比
- $base_amount = 0;
- switch ($config['calculate_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;
- }
- $calc_commission = bcmul($base_amount, bcmul($config['commission'], 0.01, 2), 2);
- break;
- }
- // 默认就是这个
- $commission = $calc_commission;
- Yii::$app->custom->logs("{$order['order_no']} - {$commission}");
- }
- }
- } else {
- // 这边只有余额?
- if ($config['is_enable_reward'] == StatusEnum::DISABLED) {
- Yii::error("Community reward 未开启奖励");
- continue;
- } // 未开启团长奖励
- switch ($config['head_commission_type']) {
- case ConfigEnum::HEAD_COMMISSION_TYPE_FIXED: // 固定金额
- $calc_commission = bcmul($config['commission'], $item['num'], 2);
- break;
- case ConfigEnum::HEAD_COMMISSION_TYPE_RATE: // 百分比
- $base_amount = 0;
- switch ($config['calculate_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;
- }
- $calc_commission = bcmul($base_amount, bcmul($config['commission'], 0.01, 2), 2);
- break;
- }
- // 默认就是这个
- $commission = $calc_commission;
- Yii::$app->custom->logs("{$order['order_no']} - {$commission}");
- }
- $wallet_main = [
- 'mall_id' => $mall_id,
- 'user_id' => $head_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,
- 'created_at'=> time(),
- 'updated_at'=> time(),
- ];
- // 添加到冻结金额
- if (!empty($commission) && $commission > 0) {
- Yii::error("{$order['order_no']} {$item['goods_id']} -- {$commission}");
- $wallet_main['wallet_type'] = UserWalletService::WALLET_TYPE_COMMISSION;
- $wallet_main['money'] = $commission;
- $wallet_main['desc'] = "用户 ({$user_id}) ,获得自提订单 ({$order['id']}) 奖励, 奖励类型:(佣金), 共奖励 ({$commission}) 元佣金";
- $insert_wallet[] = $wallet_main;
- $plugin_main['intro'] = "用户ID为[{$user_id}]的自提人完成订单编号为[{$order['order_no']}]的订单获得提成";
- $plugin_main['commission'] = bcmul($commission, 100);
- $plugin_main['reward_type'] = ConfigEnum::COMMUNITY_REWARD_TYPE_COMMISSION;
- $insert_plugin[] = $plugin_main;
- }
- if (!empty($score) && $score > 0) {
- Yii::error("{$order['order_no']} {$item['goods_id']} -- {$score}");
- $wallet_main['wallet_type'] = UserWalletService::WALLET_TYPE_SCORE;
- $wallet_main['money'] = $score;
- $wallet_main['desc'] = "用户 ({$user_id}) ,获得自提订单 ({$order['id']}) 奖励, 奖励类型:(积分), 共奖励 ({$score}) 积分";
- $insert_wallet[] = $wallet_main;
- $plugin_main['intro'] = "用户ID为[{$user_id}]的自提人完成订单编号为[{$order['order_no']}]的订单获得提成";
- $plugin_main['commission'] = bcmul($score, 100);
- $plugin_main['reward_type'] = ConfigEnum::COMMUNITY_REWARD_TYPE_SCORE;
- $insert_plugin[] = $plugin_main;
- }
- // 嗨呗/嗨值暂时不写
- if (!empty($hi_bei) && $hi_bei > 0) {
- // $plugin_main['intro'] = "用户ID为[{$user_id}]的自提人完成订单编号为[{$order['order_no']}]的订单获得提成";
- // $plugin_main['commission'] = $hi_bei;
- // $plugin_main['reward_type'] = ConfigEnum::COMMUNITY_REWARD_TYPE_HI_BEI;
- // $insert_plugin[] = $plugin_main;
- }
- if (!empty($hi_value) && $hi_value > 0) {
- // $plugin_main['intro'] = "用户ID为[{$user_id}]的自提人完成订单编号为[{$order['order_no']}]的订单获得提成";
- // $plugin_main['commission'] = $hi_value;
- // $plugin_main['reward_type'] = ConfigEnum::COMMUNITY_REWARD_TYPE_HI_VALUE;
- // $insert_plugin[] = $plugin_main;
- }
- }
- if (!empty($insert_wallet)) { // 不为空的情况下
- $res = UserWalletService::batchHandleByQueue($insert_wallet);
- if (empty($res)) throw new \Exception(UserWalletService::getStaticError());
- }
- if (!empty($higo_wallet_insert)) { // higo新增数据
- }
- if (!empty($insert_plugin)) {
- Yii::error("insert_plugin: " . Json::encode($insert_plugin));
- // 写入记录
- Yii::$app->db->createCommand()->batchInsert(CommunityHeadCommission::tableName(), array_keys($insert_plugin[0]), $insert_plugin)->execute();
- }
- return true;
- }
-
- /**
- * 佣金退回
- * @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);
- }
- */
- }
- }
|