TimestampBehavior::class ] ]; } public function rules() { return [ [['id', 'store_id', 'user_id', 'status'], 'integer'], [['finish_time', 'created_at', 'updated_at'], 'string'] ]; } public function attributeLabels() { return [ 'id' => '', 'store_id' => '商城ID', 'user_id' => '用户ID', 'status' => '状态:0=未完结;1=已拼团完结', 'finish_time' => '完结时间', 'created_at' => '', 'updated_at' => '', ]; } /** * 满足以下两个条件就新增团 * 1.查询当前用户是否已经参加过团 如果没有就判断下一条 * 1.查询上级创建的未完结的团 如果没有就新增一个团并添加团员信息 如果满足7人就完结团 * 如果存在就不新增数据 如果不存在就新增一个团 */ public static function getNotFinishSales($userId, $orderId, $storeId) { try { //获取符合活动的产品 $order = Order::findOne(['id' => $orderId, 'user_id' => $userId]);// if (!$order) { throw new \Exception('订单不存在'); } $super_sales_setting = Option::get('super_sales_setting', $storeId, 'super_sales')['value']; $super_sales_setting = json_decode($super_sales_setting ?? '', true); //如果未开启下单后立即入团 if (empty($super_sales_setting) || ($super_sales_setting && !intval($super_sales_setting['upgrade_direct_profit']))) { if (!intval($order->is_sale)) { throw new \Exception('订单未过售后期'); } } $goods_ids = explode(',', $super_sales_setting['goods_ids'] ?? ''); $order_detail = OrderDetail::find()->where(['order_id' => $orderId, 'goods_id' => $goods_ids]) ->select('id, total_price')->asArray()->all(); if (!$order_detail) { throw new \Exception('未购买符合活动的产品'); } $order_detail_id = implode(',', array_column($order_detail, 'id')); $order_detail_sum = array_sum(array_column($order_detail, 'total_price')); //检测是否参与过 $isOrderSuperSalesSub = SuperSalesSub::findOne(['order_id' => $orderId]); if ($isOrderSuperSalesSub) { throw new \Exception('订单已经参与过'); } // 判断当前用户是否参与未完结的团 $userSuperSalesSub = SuperSalesSub::findOne(['user_id' => $userId, 'status' => SuperSalesSub::STATUS_NOT_FINISH]); if (!$userSuperSalesSub) { // $user = User::findOne(['id' => $userId, 'is_delete' => 0]); // 查询上级参与的未完结的团 $parent_user = User::findOne(['id' => $user->old_parent_id, 'is_delete' => 0]); if ($parent_user) { //未完结的 $parentSuperSalesSub = SuperSalesSub::findOne(['user_id' => $parent_user->id]); if ($parentSuperSalesSub) { $parentSuperSalesSub = SuperSalesSub::findOne(['user_id' => $parent_user->id, 'status' => SuperSalesSub::STATUS_NOT_FINISH]); //上级参与过团 if ($parentSuperSalesSub) { if ($parentSuperSalesSub->sales_id) { $parentSuperSales = self::findOne($parentSuperSalesSub->sales_id); if ($parentSuperSales->status === self::STATUS_NOT_FINISH) { $sales_id = $parentSuperSalesSub->sales_id; //查询最后一个点位 $lastSalesSub = SuperSalesSub::find()->where(['sales_id' => $sales_id])->orderBy('points DESC') ->asArray()->one(); $lastPoints = $lastSalesSub['points'] + 1; $weight_parent_id = $parentSuperSalesSub->id; //查询权重并分配权重 $oldParentWeight = $parentSuperSalesSub->weight; if ($oldParentWeight >= 2) { $weightSuperSalesSub = SuperSalesSub::find()->where(['sales_id' => $sales_id, 'parent_user_id' => $parent_user->id]) ->andWhere(['<', 'weight', 2])->orderBy('points ASC')->asArray()->one(); if ($weightSuperSalesSub) { $weight_parent_id = $weightSuperSalesSub['id']; } } //查询点位的上级 $newParentSuperSalesSub = SuperSalesSub::find()->where(['sales_id' => $sales_id]) ->andWhere(['>=', 'points', bcdiv($lastPoints, 2)]) ->orderBy('points ASC') ->asArray()->one(); $parent_id = $newParentSuperSalesSub['id']; $superSalesSub = new SuperSalesSub(); $superSalesSub->sales_id = $sales_id; $superSalesSub->user_id = $userId; $superSalesSub->order_id = $orderId; $superSalesSub->order_detail_id = $order_detail_id; $superSalesSub->points = $lastPoints; $superSalesSub->weight = 0; $superSalesSub->parent_id = $parent_id; $superSalesSub->parent_user_id = $parent_user->id; $superSalesSub->save(); $realParentSuperSalesSub = SuperSalesSub::findOne($weight_parent_id); $realParentSuperSalesSub->weight = $realParentSuperSalesSub->weight + 1; $realParentSuperSalesSub->save(); $moneyParentUserId = $parent_user->id; $superSalesRepeatOrder = SuperSalesRepeatOrder::findOne(['order_id' => $orderId, 'user_id' => $userId]); if ($superSalesRepeatOrder) { $superSalesRepeatOrder->sales_id = $sales_id; $superSalesRepeatOrder->save(); } //计算直推奖励 这里应该是只有参团时候走进来 也就是说满足参团返佣的逻辑 $direct_award = bcdiv(bcmul($order_detail_sum, $super_sales_setting['super_sales_direct_profit'], 2), 100, 2); SuperSalesMoney::addMoney($storeId, $orderId, $sales_id, $superSalesSub->id, $moneyParentUserId, $direct_award, SuperSalesMoney::TYPE_DIRECT_AWARD); if ($lastPoints >= 7) { $SuperSalesSubArray = SuperSalesSub::find()->where(['sales_id' => $sales_id]) ->asArray()->all(); foreach ($SuperSalesSubArray as $item) { $SuperSalesSubItem = SuperSalesSub::findOne($item['id']); $SuperSalesSubItem->status = SuperSalesSub::STATUS_FINISH; $SuperSalesSubItem->save(); } $SuperSales = self::findOne($sales_id); $SuperSales->status = self::STATUS_FINISH; $SuperSales->finish_time = (string)time(); $SuperSales->save(); //TODO 这里应该需要开团人重新生成新的订单 计算各类佣金 //计算成团奖励 $group_award = bcdiv(bcmul($order_detail_sum, $super_sales_setting['super_sales_group_profit'], 2), 100, 2); if (bcadd($order_detail_sum, $order->express_price, 2) <= $group_award) { $group_award = bcsub($group_award, bcadd($order_detail_sum, $order->express_price, 2), 2); self::autoBuy($sales_id, $SuperSales->user_id);//这里执行完毕后 过完售后期应该可以重新生成团或者参与上级的团 } //成团开团用户sub_id 添加开团佣金 $firstSuperSalesSub = SuperSalesSub::findOne(['sales_id' => $sales_id, 'points' => 1]); SuperSalesMoney::addMoney($storeId, $orderId, $sales_id, $firstSuperSalesSub->id, $SuperSales->user_id, $group_award, SuperSalesMoney::TYPE_GROUP_AWARD); //TODO 生成订单后需要重组其他人 形成新的团 self::reGroup($sales_id); } } } } else { //上级参与过团 但是未开始新的团 $superSales = new self(); $superSales->store_id = $storeId; $superSales->user_id = $userId; $superSales->status = self::STATUS_NOT_FINISH; $superSales->save(); $superSalesSub = new SuperSalesSub(); $superSalesSub->sales_id = $superSales->id; $superSalesSub->user_id = $userId; $superSalesSub->order_id = $orderId; $superSalesSub->order_detail_id = $order_detail_id; $superSalesSub->points = 1; $superSalesSub->weight = 0; $superSalesSub->parent_id = 0; $superSalesSub->parent_user_id = $parent_user->id; $superSalesSub->save(); //这里应该为上级参过团 但是已经复购 售后期还未结束进入到新的团 $superSalesRepeatOrder = SuperSalesRepeatOrder::findOne(['order_id' => $orderId, 'user_id' => $userId]); if ($superSalesRepeatOrder) { $superSalesRepeatOrder->sales_id = $superSales->id; $superSalesRepeatOrder->save(); } //计算直推奖励 这里应该是只有参团时候走进来 也就是说满足参团返佣的逻辑 $direct_award = bcdiv(bcmul($order_detail_sum, $super_sales_setting['super_sales_direct_profit'], 2), 100, 2); SuperSalesMoney::addMoney($storeId, $orderId, $superSales, $superSalesSub->id, $parent_user->id, $direct_award, SuperSalesMoney::TYPE_DIRECT_AWARD); } } else { //上级没有参与过团 $superSales = new self(); $superSales->store_id = $storeId; $superSales->user_id = $userId; $superSales->status = self::STATUS_NOT_FINISH; $superSales->save(); $superSalesSub = new SuperSalesSub(); $superSalesSub->sales_id = $superSales->id; $superSalesSub->user_id = $userId; $superSalesSub->order_id = $orderId; $superSalesSub->order_detail_id = $order_detail_id; $superSalesSub->points = 1; $superSalesSub->weight = 0; $superSalesSub->parent_id = 0; $superSalesSub->parent_user_id = $parent_user->id; $superSalesSub->save(); } } else { //没有上级 $superSales = new self(); $superSales->store_id = $storeId; $superSales->user_id = $userId; $superSales->status = self::STATUS_NOT_FINISH; $superSales->save(); $superSalesSub = new SuperSalesSub(); $superSalesSub->sales_id = $superSales->id; $superSalesSub->user_id = $userId; $superSalesSub->order_id = $orderId; $superSalesSub->order_detail_id = $order_detail_id; $superSalesSub->points = 1; $superSalesSub->weight = 0; $superSalesSub->parent_id = 0; $superSalesSub->parent_user_id = $parent_user->id; $superSalesSub->save(); } } return [ 'code' => 0, 'msg' => '用户有参与未完结的团' ]; } catch (\Exception $e) { return [ 'code' => 1, 'msg' => $e->getMessage() ]; } } //自动复购 public static function autoBuy($sales_id, $userId) { $t = \Yii::$app->db->beginTransaction(); try { $superSales = self::findOne($sales_id); $superSalesSub = SuperSalesSub::findOne(['user_id' => $userId, 'sales_id' => $sales_id]); $orderId = $superSalesSub->order_id; $oldOrderDetailId = explode(',', $superSalesSub->order_detail_id); $old_order = Order::findOne($orderId); $old_order = ArrayHelper::toArray($old_order); $orderNoHead = substr($old_order['order_no'], 0, 2); unset($old_order['id']); $order = new Order(); $order->attributes = $old_order; $order->order_no = OrderNo::getOrderNo($orderNoHead); $order->created_at = time(); $order->trade_status = 0; $order->is_sale = 0; $order->arrival_time = $old_order['arrival_time']; $order->integral_price = 0; $order->integral_difference_price = 0; $order->confirm_time = 0; $order->send_time = 0; $order->pay_time = time(); $order->is_price = 0; $order->coupon_sub_price = 0; $order->integral = json_encode(["forehead" => "0.00", "forehead_integral" => "0.00"]); $order->give_integral = 0; $order->share_price = 0; $order->future_sales_time = 0; $order->take_price = 0; $order->send_price = 0; $order->is_pay = 1; $order->is_combine_pay = 1; $result = $order->save(); if ($result) { debug_log(['error_order' => $order->getErrors()], 'share_group_money.log'); } $old_order_detail = OrderDetail::find()->where(['id' => $oldOrderDetailId]) ->asArray()->all(); $order_detail_sum = 0; foreach ($old_order_detail as $old_order_detail_item) { unset($old_order_detail_item['id']); $order_detail = new OrderDetail(); $order_detail->attributes = $old_order_detail_item; $order_detail->order_id = $order->id; $result = $order_detail->save(); if (!$result) { debug_log(['error_order' => $order_detail->getErrors()], 'share_group_money.log'); } $order_detail_sum = bcadd($order_detail_sum, $order_detail->total_price, 2); } // $user_price = bcsub($user_price, $order->pay_price, 2); $order->combine_money = $order->total_price = $order->pay_price = bcadd($order_detail_sum, $order->express_price, 2); $order->save(); $user = User::findOne($userId); if ($user->money < $order->pay_price) { throw new \Exception('余额不足'); } $result = AccountLog::saveLog($userId, $order->combine_money, AccountLog::TYPE_BALANCE, AccountLog::LOG_TYPE_EXPEND, AccountLog::TYPE_PLATFORM_ORDER, $order->id, "商城订单超级卖货系统成团自动复购扣减, 订单号:{$order->order_no}"); if (!$result) { throw new \Exception('用户账户打款失败'); } $form = new OrderComplete(); $form->order_id = $order->id; $form->order_type = 0; $form->store_id = $order->store_id; $form->notify(); $repeat_order = new SuperSalesRepeatOrder(); $repeat_order->store_id = $superSales->store_id; $repeat_order->old_sales_id = $superSales->id; $repeat_order->order_id = $order->id; $repeat_order->user_id = $userId; $repeat_order->save(); $t->commit(); } catch (\Exception $e) { $t->rollBack(); return [ 'code' => 1, 'msg' => $e->getMessage() ]; } } // 重组团 /** * 重组团 * 将开团用户剔除 然后将剩余用户以及他们的订单进行重组 * 重组的规则是先拿到前两个权重最高的用户 分别开两个团 然后将剩余四人拿到权重最高和最低的用户将他俩放置第一个团 剩余两个用户放入第二个团 */ public static function reGroup($sales_id) { $t = \Yii::$app->db->beginTransaction(); try { $superSales = self::findOne($sales_id); $childSuperSalesSub = SuperSalesSub::find()->where([ 'sales_id' => $sales_id, 'status' => SuperSalesSub::STATUS_FINISH, ])->andWhere(['>', 'points', 1])->select('id, user_id, order_id, order_detail_id, weight, points, parent_user_id') ->orderBy('points ASC') ->limit(2) ->asArray()->all(); $childSuperSalesSubId = array_column($childSuperSalesSub, 'id'); $superSalesSub = SuperSalesSub::find()->where(['sales_id' => $sales_id, 'status' => SuperSalesSub::STATUS_FINISH]) ->andWhere(['>', 'points', 1])->andWhere(['NOT IN', 'id', $childSuperSalesSubId])->select('user_id, order_id, order_detail_id, weight, points, parent_user_id') ->orderBy('weight desc, points ASC') ->asArray()->all(); //先拿到前两个权重最高的用户 分别开两个团 $max_user_weight = $childSuperSalesSub; $ids = []; foreach ($max_user_weight as $item) { $superSalesItem = new self(); $superSalesItem->store_id = $superSales->store_id; $superSalesItem->user_id = $item['user_id']; $superSalesItem->status = self::STATUS_NOT_FINISH; $superSalesItem->save(); $superSalesSubItem = new SuperSalesSub(); $superSalesSubItem->sales_id = $superSalesItem->id; $superSalesSubItem->user_id = $item['user_id']; $superSalesSubItem->order_id = $item['order_id']; $superSalesSubItem->order_detail_id = $item['order_detail_id']; $superSalesSubItem->points = 1; $superSalesSubItem->weight = 0; $superSalesSubItem->parent_id = 0; $superSalesSubItem->parent_user_id = $item['parent_user_id']; $superSalesSubItem->save(); $ids[] = $superSalesItem->id; } $new_group = [ [ $superSalesSub[0], $superSalesSub[3] ], [ $superSalesSub[1], $superSalesSub[2] ] ]; foreach ($new_group as $group_index => $group_item) { foreach ($group_item as $max_min_index => $max_min_item) { $parentSuperSalesSub = SuperSalesSub::findOne(['sales_id' => $ids[$group_index], 'points' => 1]); $superSalesSubItem = new SuperSalesSub(); $superSalesSubItem->sales_id = $ids[$group_index]; $superSalesSubItem->user_id = $max_min_item['user_id']; $superSalesSubItem->order_id = $max_min_item['order_id']; $superSalesSubItem->order_detail_id = $max_min_item['order_detail_id']; $superSalesSubItem->points = bcadd($max_min_index, 2); $superSalesSubItem->weight = 0; $superSalesSubItem->parent_id = $parentSuperSalesSub->id; $superSalesSubItem->parent_user_id = $max_min_item['parent_user_id']; $superSalesSubItem->save(); } } $t->commit(); return [ 'code' => 0 ]; } catch (\Exception $e) { $t->rollBack(); return [ 'code' => 1, 'msg' => $e->getMessage() ]; } } //判断是否可以开新团 public static function canSuperSalesOrder($user_id, $order_goods_id, $store_id, &$error_msg) { $super_sales_setting = Option::get('super_sales_setting', $store_id, 'super_sales')['value']; $super_sales_setting = json_decode($super_sales_setting ?? '', true); $goods_ids = explode(',', $super_sales_setting['goods_ids'] ?? ''); if (in_array($order_goods_id, $goods_ids)) { // 判断当前用户是否参与过团 $userSuperSalesSub = SuperSalesSub::findOne(['user_id' => $user_id]);//, 'status' => SuperSalesSub::STATUS_NOT_FINISH //如果没有参与过 那就可以参团 if ($userSuperSalesSub) { //如果有参与过 但是团未完结 那就不能参团 $userSuperSalesSub = SuperSalesSub::findOne(['user_id' => $user_id, 'status' => SuperSalesSub::STATUS_NOT_FINISH]);// // if ($userSuperSalesSub) { $order = Order::findOne($userSuperSalesSub->order_id); $error_msg = "当前超级卖货团未完成暂不能购买此商品参团:订单{$order->order_no}参与的团未完结"; return false; } //如果已经成团完结 但是团佣金未发放也不给复购 $userSuperSalesMoney = SuperSalesMoney::findOne([ 'user_id' => $user_id, 'type' => SuperSalesMoney::TYPE_GROUP_AWARD, 'status' => SuperSalesMoney::STATUS_NOT_SEND ]); if ($userSuperSalesMoney) { $order = Order::findOne($userSuperSalesMoney->order_id); $error_msg = "当前超级卖货团未完成暂不能购买此商品参团:订单{$order->order_no}参与的团未完成结算"; return false; } } $user = User::findOne(['id' => $user_id, 'is_delete' => 0]); // 查询上级参与的未完结的团 $parent_user = User::findOne(['id' => $user->old_parent_id, 'is_delete' => 0]); if ($parent_user) { //未完结的 $parentSuperSalesSub = SuperSalesSub::findOne(['user_id' => $parent_user->id]); //上级未参与过团 那就表示可以自己开团下单 if (!$parentSuperSalesSub) { return true; } //如果上级参与过 但是团未完结 那自己就可以参团 如果未找到 那就表明团还没过售后期 $parentSuperSalesSub = SuperSalesSub::findOne(['user_id' => $parent_user->id, 'status' => SuperSalesSub::STATUS_NOT_FINISH]); if (!$parentSuperSalesSub) { $order = Order::findOne($parentSuperSalesSub->order_id); $error_msg = "当前超级卖货团未完成暂不能购买此商品参团:上级订单{$order->order_no}参与的团未完成结算"; return false; } } } return true; } }