'用户名称', 'store_name' => '商家名称', 'order_no' => '订单编号', 'start_time' => '开始时间', 'end_time' => '结束时间', 'integral_start' => '积分开始', 'integral_end' => '积分结束', 'price_start' => '金额开始', 'price_end' => '金额结束', 'sort_key' => '期数', 'mobile' => '手机号' ]; } /** * 平台分红池 */ public function storeDividendsPool() { $user_name = $this->user_name; $store_name = $this->store_name; $order_no = $this->order_no; $start_time = $this->start_time; $end_time = $this->end_time; $integral_start = $this->integral_start; $integral_end = $this->integral_end; $price_start = $this->price_start; $price_end = $this->price_end; $query = StoreDividendsUserIntegralLog::find()->alias('dui') ->leftJoin(['du' => StoreDividendsUser::tableName()], 'dui.dividends_user_id = du.id') ->leftJoin(['su' => SaasUser::tableName()], 'du.role_id = su.id AND du.role = ' . StoreDividendsUser::ROLE_USER) ->leftJoin(['s' => Store::tableName()], 'du.role_id = s.id AND du.role = ' . StoreDividendsUser::ROLE_STORE) ->leftJoin(['o' => Order::tableName()], 'dui.order_id = o.id AND dui.order_type <> ' . StoreDividendsCycleSub::ORDER_TYPE_FACE) ->leftJoin(['sco' => \app\plugins\scanCodePay\models\Order::tableName()], 'dui.order_id = sco.id AND dui.order_type = ' . StoreDividendsCycleSub::ORDER_TYPE_FACE) ->where(['>', 'dui.dividends_integral', 0]); if ($user_name) { $query->andWhere(['LIKE', 'su.name', $user_name]); } if ($store_name) { $query->andWhere(['LIKE', 's.name', $store_name]); } if ($order_no) { $query->andWhere(["OR", ['LIKE', 'o.order_no', $order_no], ['LIKE', 'sco.order_no', $order_no]]); } if ($start_time) { $start_time = strtotime($start_time); $query->andWhere(['>=', 'dui.created_at', $start_time]); } if ($end_time) { $end_time = strtotime($end_time); $query->andWhere(['<=', 'dui.created_at', $end_time]); } if ($integral_start) { $query->andWhere(['>=', 'dui.dividends_integral', $integral_start]); } if ($integral_end) { $query->andWhere(['<=', 'dui.dividends_integral', $integral_end]); } if ($price_start) { $query->andWhere(['>=', 'o.pay_price', $price_start]); } if ($price_end) { $query->andWhere(['<=', 'o.pay_price', $price_end]); } $query->select('dui.id, du.role, du.role_id, o.order_no, o.user_id, o.store_id, o.pay_price, , dui.order_type, sco.order_no as sc_order_no, sco.user_id as sc_user_id, sco.store_id as sc_store_id, sco.total_price as sc_total_price, sco.coupon_sub_price, dui.dividends_integral, dui.created_at')->orderBy('dui.id DESC')->groupBy('dui.id'); $sql = (clone $query)->createCommand()->getRawSql(); $list = pagination_make($query); foreach ($list['list'] as &$item) { //如果是当面付 if ($item['order_type'] == StoreDividendsCycleSub::ORDER_TYPE_FACE) { $item['order_no'] = $item['sc_order_no']; $item['user_id'] = $item['sc_user_id']; $item['store_id'] = $item['sc_store_id']; $item['pay_price'] = bcsub($item['sc_total_price'], $item['coupon_sub_price'], 2); } //积分受益人 $item['integral_user_name'] = ''; if (intval($item['role']) === StoreDividendsUser::ROLE_STORE) { $item['integral_user_name'] = Store::findOne($item['role_id'])->name; } else { $item['integral_user_name'] = SaasUser::findOne($item['role_id'])->name; } //下单用户 $item['user_name'] = ''; $user = User::findOne($item['user_id']); if ($user) { $item['user_name'] = SaasUser::findOne(['mobile' => $user->binding, 'is_delete' => 0])->name ?: ($user->nickname ?: ''); } //销售店铺 $item['store_name'] = Store::findOne($item['store_id'])->name; //获取时间 $item['created_at'] = date('Y-m-d H:i:s', $item['created_at']); } $totalIntegralLogMall = StoreDividendsUserIntegralLog::find()->where(['>', 'dividends_integral', 0]) ->andWhere(['<>', 'order_type', StoreDividendsCycleSub::ORDER_TYPE_FACE]) ->select('order_id, dividends_integral')->asArray()->all(); $total_price = Order::find()->where(['id' => array_column($totalIntegralLogMall, 'order_id')]) ->sum('pay_price') ?: 0; $total_integral = floor_num(array_sum(array_column($totalIntegralLogMall, 'dividends_integral')), 2); $totalIntegralLogFace = StoreDividendsUserIntegralLog::find()->where(['>', 'dividends_integral', 0]) ->andWhere(['order_type' => StoreDividendsCycleSub::ORDER_TYPE_FACE]) ->select('order_id, dividends_integral')->asArray()->all(); $face_total_price = \app\plugins\scanCodePay\models\Order::find()->where(['id' => array_column($totalIntegralLogFace, 'order_id')]) ->sum('pay_price') ?: 0; $total_integral_face = floor_num(array_sum(array_column($totalIntegralLogFace, 'dividends_integral')), 2); $list['total_info'] = [ 'total_integral' => bcadd($total_integral, $total_integral_face, 2), 'total_price' => bcadd($total_price, $face_total_price, 2), ]; return [ 'code' => 0, 'msg' => '', 'data' => $list, 'sql' => $sql ]; } /** * 让利明细 */ public function storeDividendsDetail() { $order_no = $this->order_no; $start_time = $this->start_time; $end_time = $this->end_time; $query = StoreDividendsCycleSub::find()->alias('dcs') ->leftJoin(['o' => Order::tableName()], 'dcs.order_id = o.id AND dcs.order_type <> ' . StoreDividendsCycleSub::ORDER_TYPE_FACE) ->leftJoin(['sco' => \app\plugins\scanCodePay\models\Order::tableName()], 'dcs.order_id = sco.id AND dcs.order_type = ' . StoreDividendsCycleSub::ORDER_TYPE_FACE) ->where(['>', 'dcs.order_id', 0]); if ($order_no) { $query->andWhere(['LIKE', 'dcs.order_no', $order_no]); } if ($start_time) { $start_time = strtotime($start_time); $query->andWhere(['>=', 'dcs.created_at', $start_time]); } if ($end_time) { $end_time = strtotime($end_time); $query->andWhere(['<=', 'dcs.created_at', $end_time]); } $query->select('dcs.id, dcs.order_no, SUM(dcs.money) as money, o.pay_price, dcs.order_type, dcs.created_at, sco.total_price as sc_total_price, sco.coupon_sub_price') ->orderBy('dcs.id DESC')->groupBy('dcs.order_id'); $list = pagination_make($query); foreach ($list['list'] as &$item) { $item['created_at'] = date('Y-m-d H:i:s', $item['created_at']); if ($item['order_type'] == StoreDividendsCycleSub::ORDER_TYPE_FACE) { $item['pay_price'] = bcsub($item['sc_total_price'], $item['coupon_sub_price'], 2); } } $totalIntegral = StoreDividendsCycleSub::find()->where(['>', 'order_id', 0]) ->select('order_id, money')->asArray()->all(); $total_price = Order::find()->where(['id' => array_column($totalIntegral, 'order_id')]) ->sum('pay_price') ?: 0; $total_money = floor_num(array_sum(array_column($totalIntegral, 'money')), 2); $list['total_info'] = [ 'total_money' => $total_money, 'total_price' => $total_price, ]; return [ 'code' => 0, 'msg' => '', 'data' => $list, ]; } /** * 分红记录 */ public function storeDividendsRecord() { $sort_key = $this->sort_key; $store_dividends_setting = Option::get('store_dividends_setting', 0, 'store_dividends')['value']; $store_dividends_setting = json_decode($store_dividends_setting, true); $single_integral_profit = $store_dividends_setting['store_dividends_single_integral_profit'] ?: 0; $query = StoreDividendsCycle::find()->alias('dc') ->leftJoin(['dcs' => StoreDividendsCycleSub::tableName()], 'dcs.dividends_cycle_id = dc.id') ->where(['>', 'dc.sort_key', 0]); if ($sort_key > 0) { $query->andWhere(['dc.sort_key' => $sort_key]); } $query->select('dc.id, dc.name, dc.integral_price dividends_integral, dc.dividends_user_num, dc.league_price, dc.is_send, dc.dividends_trigger_money, dc.dividends_money, dc.sort_key ') ->groupBy('dcs.dividends_cycle_id')->orderBy('dc.sort_key DESC'); $list = pagination_make($query); foreach ($list['list'] as $index => &$item) { $item['is_send'] = intval($item['is_send']); if (!$item['is_send']) { $item['dividends_integral'] = StoreDividendsCycleUserSub::find()->where(['dividends_cycle_id' => $item['id']]) ->sum('dividends_integral') ?: 0; } if (!$item['is_send']) {//未发放的话 获取不到发放的联盟券金额 // $user_total_dividends_integral = StoreDividendsCycleUserSub::find()->where(['>', 'dividends_integral', '0']) // ->andWhere(['dividends_cycle_id' => $item['id']]) $user_total_dividends_integral = StoreDividendsUser::find()->where(['>', 'dividends_integral', '0']) ->andWhere(['<=', 'join_cycle_key', $item['sort_key']]) ->sum('dividends_integral'); $item['league_price'] = bcdiv(bcmul($user_total_dividends_integral, $single_integral_profit, 2), 100, 2); } if ($item['dividends_trigger_money'] > $item['dividends_money']) { $item['is_send'] = 2; } if ($item['is_send'] !== 1) { // $item['dividends_user_num'] = StoreDividendsCycleUserSub::find()->where(['>', 'dividends_integral', '0']) // ->andWhere(['dividends_cycle_id' => $item['id']])->count() ?: 0; $item['dividends_user_num'] = StoreDividendsUser::find()->where(['>', 'dividends_integral', '0']) ->andWhere(['<=', 'join_cycle_key', $item['sort_key']])->count() ?: 0; } // unset($list['list'][$index]['user_integral'], $list['list'][$index]['store_integral'], // $list['list'][$index]['dividends_trigger_money'], $list['list'][$index]['dividends_money']); } $cycle_arr = StoreDividendsCycle::find()->where(['>', 'sort_key', 0])->select('sort_key, name') ->asArray()->all(); $list['cycle_sort'] = []; foreach ($cycle_arr as &$cycle_item) { $list['cycle_sort'][] = [ $cycle_item['sort_key'] => $cycle_item['name'], ]; } return [ 'code' => 0, 'msg' => '', 'data' => $list, ]; } //执行分红 public function storeDividendsSend() { try { $id = $this->id; $cycle = StoreDividendsCycle::findOne($id); if (!$cycle) { return [ 'code' => 1, 'msg' => '参数错误', ]; } if (intval($cycle->is_send)) { return [ 'code' => 1, 'msg' => '分红已执行发放', ]; } if ($cycle->dividends_trigger_money > $cycle->dividends_money) { throw new \Exception('未满足分红条件 暂不可发放'); } $num = 0; $total_league_price = 0; $order = (object)[ 'id' => 0 ]; $total_integral_price = 0; $result = StoreDividendsCycle::handleSendLeague($order, $cycle->id, $num, $total_league_price, $total_integral_price); if ($result['code']) { throw new \Exception($result['msg']); } $cycle->is_send = StoreDividendsCycle::IS_SEND_YES; $cycle->dividends_user_num = $num; $cycle->league_price = $total_league_price; $cycle->integral_price = $total_integral_price; if (!$cycle->save()) { throw new \Exception('发放失败【' . $cycle->getErrorSummary(true) . '】'); } return [ 'code' => 0, 'msg' => '发放成功', ]; } catch (\Exception $e) { return [ 'code' => 1, 'msg' => $e->getMessage(), ]; } } /** * 分红明细 */ public function storeDividendsDetailList() { $store_dividends_setting = Option::get('store_dividends_setting', 0, 'store_dividends')['value']; $store_dividends_setting = json_decode($store_dividends_setting, true); $single_integral_profit = $store_dividends_setting['store_dividends_single_integral_profit']; $store_name = $this->store_name; $user_name = $this->user_name; $mobile = $this->mobile; $id = $this->id; $cycle = StoreDividendsCycle::findOne($id); if (!$cycle) { return [ 'code' => 1, 'msg' => '参数错误', ]; } if (!intval($cycle->is_send)) { // $query = StoreDividendsCycleUserSub::find()->alias('dcus') // ->leftJoin(['du' => StoreDividendsUser::tableName()], 'dcus.dividends_user_id = du.id') // ->leftJoin(['su' => SaasUser::tableName()], 'du.role_id = su.id AND du.role = ' . StoreDividendsUser::ROLE_USER) // ->leftJoin(['s' => Store::tableName()], 'du.role_id = s.id AND du.role = ' . StoreDividendsUser::ROLE_STORE) // ->where(['>', 'dcus.dividends_integral', 0])->andWhere(['dcus.dividends_cycle_id' => $cycle->id]); $query = StoreDividendsUser::find()->alias('du') ->leftJoin(['su' => SaasUser::tableName()], 'du.role_id = su.id AND du.role = ' . StoreDividendsUser::ROLE_USER) ->leftJoin(['s' => Store::tableName()], 'du.role_id = s.id AND du.role = ' . StoreDividendsUser::ROLE_STORE) ->where(['>', 'du.dividends_integral', 0])->andWhere(['<=', 'du.join_cycle_key', $cycle->sort_key]); if ($store_name) { $query->andWhere(['like', 's.name', $store_name]); } if ($user_name) { $query->andWhere(['like', 'su.name', $user_name]); } if ($mobile) { $query->andWhere(['like', 'su.mobile', $mobile]); } $query->select('du.id, du.role, du.role_id, du.dividends_integral')//$query->select('du.id, du.role, du.role_id, dcus.dividends_integral') ->orderBy('du.id DESC'); } else { $query = StoreDividendsUserLeagueLog::find()->alias('dul') ->leftJoin(['du' => StoreDividendsUser::tableName()], 'dul.dividends_user_id = du.id') ->leftJoin(['su' => SaasUser::tableName()], 'du.role_id = su.id AND du.role = ' . StoreDividendsUser::ROLE_USER) ->leftJoin(['s' => Store::tableName()], 'du.role_id = s.id AND du.role = ' . StoreDividendsUser::ROLE_STORE) ->where(['>', 'dul.dividends_cycle_id', 0]); if ($store_name) { $query->andWhere(['like', 's.name', $store_name]); } if ($user_name) { $query->andWhere(['like', 'su.name', $user_name]); } if ($mobile) { $query->andWhere(['like', 'su.mobile', $mobile]); } if ($id) { $query->andWhere(['dul.dividends_cycle_id' => $id]); } $query->select('dul.id, du.role, du.role_id, dul.dividends_integral, dul.league_price, dul.created_at') ->orderBy('dul.id DESC'); } $list = pagination_make($query); foreach ($list['list'] as &$item) { if ($item['role'] == StoreDividendsUser::ROLE_USER) { $saasInfo = SaasUser::findOne($item['role_id']); $item['user_info'] = [ 'name' => $saasInfo->name, 'sub_name' => $saasInfo->mobile, 'avatar' => $saasInfo->avatar, ]; } else { $store = Store::findOne($item['role_id']); $saasCategory = SaasCategory::findOne($store->category_id); $item['user_info'] = [ 'name' => $store->name, 'sub_name' => $saasCategory->name ?: '', 'avatar' => $store->logo, ]; } $item['sort_name'] = $cycle->name; $item['sort_id'] = $cycle->id; if (!intval($cycle->is_send)) { $item['league_price'] = bcdiv(bcmul($item['dividends_integral'], $single_integral_profit, 2), 100, 2); } $item['created_at'] = $item['created_at'] ? date('Y-m-d H:i:s', $item['created_at']) : ''; } return [ 'code' => 0, 'msg' => '', 'data' => $list, ]; } }