| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468 |
- <?php
- namespace app\modules\admin\models\storeDividends;
- use app\models\Option;
- use app\models\Order;
- use app\models\SaasCategory;
- use app\models\SaasUser;
- use app\models\Store;
- use app\models\StoreDividendsCycle;
- use app\models\StoreDividendsCycleSub;
- use app\models\StoreDividendsCycleUserSub;
- use app\models\StoreDividendsUser;
- use app\models\StoreDividendsUserIntegralLog;
- use app\models\StoreDividendsUserLeagueLog;
- use app\models\User;
- use yii\base\Model;
- class IndexForm extends Model
- {
- public $user_name;
- public $store_name;
- public $order_no;
- public $start_time;
- public $end_time;
- public $integral_start;
- public $integral_end;
- public $price_start;
- public $price_end;
- public $mobile;
- public $status;
- public $sort_key;
- public $id;
- public function rules()
- {
- return [
- [['status', 'id'], 'integer'],
- [['integral_start', 'integral_end', 'price_start', 'price_end', 'sort_key'], 'number'],
- [['user_name', 'store_name', 'order_no', 'start_time', 'end_time', 'mobile'], 'string'],
- [['user_name', 'store_name', 'order_no'], 'trim']
- ];
- }
- public function attributeLabels()
- {
- return [
- 'user_name' => '用户名称',
- '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,
- ];
- }
- }
|