GroupPurchaseForm.php 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523
  1. <?php
  2. namespace app\modules\client\models\v1\shareGroup;
  3. use app\models\Cash;
  4. use app\models\Cat;
  5. use app\models\Goods;
  6. use app\models\GoodsCat;
  7. use app\models\Option;
  8. use app\models\Order;
  9. use app\models\OrderDetail;
  10. use app\models\Qrcode;
  11. use app\models\SaasUser;
  12. use app\models\ShareGroupMoney;
  13. use app\models\ShareGroupMoneySub;
  14. use app\models\ShareGroupPurchaseParentLog;
  15. use app\models\ShareGroupPurchaseUser;
  16. use app\models\ShareGroupSupportLog;
  17. use app\models\User;
  18. use app\models\UserShareMoney;
  19. use app\modules\client\models\v1\ShareQrcodeForm;
  20. use yii\base\Model;
  21. class GroupPurchaseForm extends Model
  22. {
  23. public $store_id;
  24. public $user_id;
  25. public $saas_id;
  26. public $id;
  27. public $status;
  28. public function rules()
  29. {
  30. return [
  31. [['store_id', 'user_id', 'saas_id', 'id', 'status'], 'integer'],
  32. [['status'], 'in', 'range' => [-1, 0, 1]]
  33. ];
  34. }
  35. //拼团区中心
  36. public function groupPurchaseCenter() {
  37. try {
  38. $store_id = $this->store_id;
  39. $user_id = $this->user_id;
  40. $saas_id = $this->saas_id;
  41. $user = User::findOne($user_id);
  42. $saasUser = SaasUser::findOne($saas_id);
  43. $shareGroupPurchaseUser = ShareGroupPurchaseUser::findOne(['user_id' => $user_id]);
  44. //用户头像、昵称、上级名称
  45. $parent_user_info = User::find()->alias('u')
  46. ->leftJoin(['su' => SaasUser::tableName()], 'su.mobile = u.binding')
  47. ->where(['u.id' => $shareGroupPurchaseUser->parent_user_id ?? 0, 'u.is_delete' => 0, 'su.is_delete' => 0])
  48. ->select('su.name')->asArray()->one();
  49. $user_info = [
  50. 'name' => $saasUser->name,
  51. 'avatar' => $saasUser->avatar,
  52. 'parent_name' => $parent_user_info['name'] ?? '',
  53. 'share_code' => ''
  54. ];
  55. //用户分享码
  56. try {
  57. $form = new ShareQrcodeForm();
  58. $form->store_id = $store_id;
  59. $form->type = Qrcode::TYPE_GROUP_PURCHASE;
  60. $form->user_id = $this->user_id;
  61. $result = $form->search();
  62. if ($result['code']) {
  63. throw new \Exception($result['msg']);
  64. }
  65. $user_info['share_code'] = $result['data'];
  66. } catch (\Exception $e) {
  67. debug_log([
  68. 'code' => $e->getCode(),
  69. 'message' => $e->getMessage(),
  70. 'file' => $e->getFile(),
  71. 'line' => $e->getLine(),
  72. ], 'group_purchase_qrcode.log');
  73. }
  74. //用户佣金 可提现佣金
  75. $wait_cash_amount = $user->price >= $shareGroupPurchaseUser->price ? $shareGroupPurchaseUser->price : $user->price;
  76. //用户佣金 未到账佣金
  77. $no_send_amount = ShareGroupMoney::find()->where(['user_id' => $user_id, 'is_send' => 0])
  78. ->select('amount')->sum('amount') ?: '0.00';
  79. //用户佣金 已提现佣金
  80. $cash_amount = Cash::find()->where(['user_id' => $user_id, 'cash_type' => Cash::IS_CASH_TYPE_SHARE_GROUP_PURCHASE, 'status' => [
  81. Cash::STATUS_GIVEN,
  82. Cash::STATUS_HAND,
  83. Cash::STATUS_RECHARGE
  84. ]])
  85. ->select('price')->sum('price') ?: '0.00';
  86. //用户佣金 冻结佣金
  87. $freeze_amount = ShareGroupMoney::find()->where(['user_id' => $user_id, 'is_freeze' => 1, 'is_send_freeze' => 0])
  88. ->select('freeze_amount')->sum('freeze_amount') ?: '0.00';
  89. $no_freeze_amount = ShareGroupMoney::find()->where(['user_id' => $user_id, 'is_freeze' => 1, 'is_send_freeze' => 1])
  90. ->select('freeze_amount')->sum('freeze_amount') ?: '0.00';
  91. //用户佣金 累计佣金
  92. $total_amount = bcadd(
  93. $wait_cash_amount,
  94. bcadd($cash_amount,
  95. bcadd($no_send_amount,
  96. bcadd($freeze_amount, $no_freeze_amount, 2), 2)
  97. , 2)
  98. , 2);
  99. return [
  100. 'code' => 0,
  101. 'msg' => '',
  102. 'data' => [
  103. 'is_group_purchase_user' => !empty($shareGroupPurchaseUser),
  104. 'user_info' => $user_info,
  105. 'wait_cash_amount' => $wait_cash_amount,//可提现佣金
  106. 'no_send_amount' => $no_send_amount,//未到账佣金
  107. 'cash_amount' => $cash_amount,//已提现佣金
  108. 'freeze_amount' => $freeze_amount,//冻结佣金
  109. 'total_amount' => $user->total_price ?? 0//$total_amount,//累计佣金
  110. ]
  111. ];
  112. } catch (\Exception $e) {
  113. return [
  114. 'code' => 1,
  115. 'msg' => $e->getMessage()
  116. ];
  117. }
  118. }
  119. //拼购区商品
  120. public function goodsList() {
  121. try {
  122. $store_id = $this->store_id;
  123. $share_group_setting = Option::get('share_group_setting', $store_id, 'share_group')['value'];
  124. $share_group_setting = json_decode($share_group_setting ?? '', true);
  125. $goods_ids = explode(',', $share_group_setting['goods_ids'] ?? '');
  126. $query = Goods::find()->where(['id' => $goods_ids ?: [0], 'is_delete' => 0, 'store_id' => $store_id])
  127. ->select('id, name, cover_pic, price, virtual_sales')->orderBy('sort desc');
  128. $list = pagination_make($query);
  129. foreach ($list['list'] as &$item) {
  130. $goods_cat = GoodsCat::find()->alias('gc')
  131. ->leftJoin(['c' => Cat::tableName()], 'gc.cat_id=c.id')
  132. ->where([ 'gc.goods_id' => $item['id'], 'c.is_delete' => 0, 'gc.is_delete' => 0, 'c.store_id' => $store_id])
  133. ->select(['c.name'])
  134. ->column();
  135. $item['cat'] = implode(' ', $goods_cat);
  136. $goodsModel = new Goods();
  137. $goodsModel->id = $item['id'];
  138. $item['sales_num'] = $goodsModel->getSalesVolume() + $item['virtual_sales'];
  139. }
  140. return [
  141. 'code' => 0,
  142. 'msg' => '',
  143. 'data' => $list
  144. ];
  145. } catch (\Exception $e) {
  146. return [
  147. 'code' => 1,
  148. 'msg' => $e->getMessage()
  149. ];
  150. }
  151. }
  152. //我的拼购订单
  153. public function groupPurchaseOrder() {
  154. try {
  155. $user_id = $this->user_id;
  156. $query = ShareGroupPurchaseParentLog::find()->alias('s')
  157. ->leftJoin(['o' => Order::tableName()], 's.order_id = o.id')
  158. ->where(['s.user_id' => $user_id])->select('s.id, o.order_no, o.created_at, s.is_repeat, s.order_detail_id')
  159. ->orderBy('s.id ASC');
  160. $list = pagination_make($query);
  161. foreach ($list['list'] as &$item) {
  162. $item['created_at'] = date('Y-m-d H:i:s', $item['created_at']);
  163. //查询当前团下级订单数量
  164. $num = 0;
  165. $direct_child_group_purchase_id = ShareGroupPurchaseParentLog::find()->where(['parent_id' => $item['id']])
  166. ->select('id')->column();
  167. if ($direct_child_group_purchase_id) {
  168. $num += count($direct_child_group_purchase_id);
  169. $child_group_purchase_id = ShareGroupPurchaseParentLog::find()->where(['parent_id' => $direct_child_group_purchase_id])
  170. ->select('id')->column();
  171. $num += count($child_group_purchase_id);
  172. }
  173. $item['num'] = $num;
  174. //查询是否完成成团
  175. $is_has_group = ShareGroupMoney::findOne(['type' => ShareGroupMoney::TYPE_GROUP, 'type_id' => $item['id']]);
  176. $item['is_finish'] = !empty($is_has_group);
  177. //查询商品信息
  178. $order_detail_id = explode(',', $item['order_detail_id']);
  179. $item['goods_list'] = OrderDetail::find()->where(['id' => $order_detail_id, 'is_delete' => 0])
  180. ->select('goods_id, total_price, goods_name, num, pic, attr')->asArray()->all();
  181. foreach ($item['goods_list'] as &$goods_item) {
  182. $goods_item['attr'] = json_decode($goods_item['attr'], true);
  183. }
  184. }
  185. return [
  186. 'code' => 0,
  187. 'msg' => '',
  188. 'data' => $list
  189. ];
  190. } catch (\Exception $e) {
  191. return [
  192. 'code' => 1,
  193. 'msg' => $e->getMessage()
  194. ];
  195. }
  196. }
  197. //获取参团详情
  198. public function groupPurchaseDetail() {
  199. try {
  200. $id = $this->id;
  201. $direct_child_group_purchase_id = ShareGroupPurchaseParentLog::find()->where(['parent_id' => $id])
  202. ->select('id')->column();
  203. if ($direct_child_group_purchase_id) {
  204. $child_group_purchase_id = ShareGroupPurchaseParentLog::find()->where(['parent_id' => $direct_child_group_purchase_id])
  205. ->select('id')->column();
  206. if ($child_group_purchase_id) {
  207. $direct_child_group_purchase_id = array_merge($direct_child_group_purchase_id, $child_group_purchase_id);
  208. }
  209. }
  210. $query = ShareGroupPurchaseParentLog::find()->alias('s')
  211. ->leftJoin(['o' => Order::tableName()], 's.order_id = o.id')
  212. ->where(['s.id' => $direct_child_group_purchase_id])
  213. ->select('s.id, o.order_no, o.created_at, s.order_detail_id, o.trade_status, o.user_id');
  214. $list = pagination_make($query);
  215. foreach ($list['list'] as &$item) {
  216. $item['created_at'] = date('Y-m-d H:i:s', $item['created_at']);
  217. $item['trade_status'] = intval($item['trade_status']);
  218. $item['trade_status_text'] = Order::TRADE_STATUS_TEXT[$item['trade_status']];
  219. $item['user_info'] = User::find()->alias('u')
  220. ->leftJoin(['su' => SaasUser::tableName()], 'su.mobile = u.binding')
  221. ->where(['u.id' => $item['user_id'], 'u.is_delete' => 0, 'su.is_delete' => 0])
  222. ->select('su.name, su.avatar, su.mobile')->asArray()->one();
  223. //查询商品信息
  224. $order_detail_id = explode(',', $item['order_detail_id']);
  225. $item['goods_list'] = OrderDetail::find()->where(['id' => $order_detail_id, 'is_delete' => 0])
  226. ->select('goods_id, total_price, goods_name, num, pic, attr')->asArray()->all();
  227. foreach ($item['goods_list'] as &$goods_item) {
  228. $goods_item['attr'] = json_decode($goods_item['attr'], true);
  229. }
  230. }
  231. return [
  232. 'code' => 0,
  233. 'msg' => '',
  234. 'data' => $list
  235. ];
  236. } catch (\Exception $e) {
  237. return [
  238. 'code' => 1,
  239. 'msg' => $e->getMessage()
  240. ];
  241. }
  242. }
  243. //冻结金额
  244. public function freezeMoney() {
  245. try {
  246. $user_id = $this->user_id;
  247. //冻结金额
  248. $money = ShareGroupMoney::find()->where(['user_id' => $user_id, 'is_freeze' => 1, 'is_send_freeze' => 0])
  249. ->sum('freeze_amount') ?: '0.00';
  250. $group_purchase_parent = ShareGroupPurchaseParentLog::findOne(['user_id' => $user_id]);
  251. //直推会员
  252. $direct_child_group_purchase_id = ShareGroupPurchaseParentLog::find()->where([
  253. 'parent_user_id' => $user_id,
  254. 'batch_id' => $group_purchase_parent->batch_id ?: $group_purchase_parent->id
  255. ])->select('user_id, batch_id')->groupBy('user_id')->asArray()->all();
  256. $data = [];
  257. foreach ($direct_child_group_purchase_id as $index => $item) {
  258. $data[$index]['user_info'] = User::find()->alias('u')
  259. ->leftJoin(['su' => SaasUser::tableName()], 'su.mobile = u.binding')
  260. ->where(['u.id' => $item['user_id'], 'u.is_delete' => 0, 'su.is_delete' => 0])
  261. ->select('su.name, su.avatar, su.mobile')->asArray()->one();
  262. $child_group_purchase_count = ShareGroupPurchaseParentLog::find()->where([
  263. 'parent_user_id' => $item['user_id'],
  264. 'batch_id' => $item['batch_id']
  265. ])->groupBy('user_id')->select('user_id')->count() ?: 0;
  266. $data[$index]['is_qualify'] = false;
  267. if ($child_group_purchase_count >= 2) {
  268. $data[$index]['is_qualify'] = true;
  269. }
  270. }
  271. return [
  272. 'code' => 0,
  273. 'msg' => '',
  274. 'data' => [
  275. 'freeze_amount' => $money,
  276. 'user_info' => $data
  277. ]
  278. ];
  279. } catch (\Exception $e) {
  280. return [
  281. 'code' => 1,
  282. 'msg' => $e->getMessage()
  283. ];
  284. }
  285. }
  286. //佣金详情
  287. public function freezeMoneyList()
  288. {
  289. try {
  290. $status = $this->status;
  291. $query = ShareGroupMoney::find()->alias('sm')
  292. ->leftJoin(['s' => ShareGroupSupportLog::tableName()], 's.id = sm.type_id')
  293. ->leftJoin(['o' => Order::tableName()], 's.order_id = o.id')
  294. ->where([
  295. 'sm.is_freeze' => 1,
  296. 'sm.user_id' => $this->user_id
  297. ]);
  298. if (isset($status) && in_array($status, [0, 1])) {
  299. $query->andWhere(['sm.is_send_freeze' => $status]);
  300. }
  301. $query->select('sm.id, sm.freeze_amount, sm.is_send_freeze, sm.created_at, o.order_no, sm.type, s.user_id, sm.freeze_send_time')
  302. ->orderBy('sm.created_at desc');
  303. $list = pagination_make($query);
  304. foreach ($list['list'] as &$item) {
  305. $item['created_at'] = date('Y-m-d H:i:s', $item['created_at']);
  306. $item['freeze_send_time'] = $item['freeze_send_time'] ? date('Y-m-d H:i:s', $item['freeze_send_time']) : '';
  307. $user_info = User::find()->alias('u')
  308. ->leftJoin(['su' => SaasUser::tableName()], 'su.mobile = u.binding')
  309. ->where(['u.id' => $item['user_id'], 'u.is_delete' => 0, 'su.is_delete' => 0])
  310. ->select('su.name')->asArray()->one();
  311. $item['desc'] = $user_info['name'] . $item['order_no'] . '产生佣金';
  312. $item['type'] = intval($item['type']);
  313. $item['is_send_freeze'] = intval($item['is_send_freeze']);
  314. }
  315. return [
  316. 'code' => 0,
  317. 'msg' => '',
  318. 'data' => $list
  319. ];
  320. } catch (\Exception $e) {
  321. return [
  322. 'code' => 1,
  323. 'msg' => $e->getMessage()
  324. ];
  325. }
  326. }
  327. //佣金明细
  328. public function moneyList() {
  329. try {
  330. $status = $this->status;
  331. $user_id = $this->user_id;
  332. $query = ShareGroupMoney::find()->where(['user_id' => $user_id, 'profit_type' => ShareGroupMoney::PROFIT_TYPE_COMMON]);
  333. if (isset($status) && in_array($status, [0, 1])) {
  334. $query->andWhere(['is_send' => $status]);
  335. }
  336. $query->andWhere(['OR', ['>', 'amount', 0], ['AND', ['>', 'freeze_amount', 0], ['is_send_freeze' => 1]]]);
  337. $query->orderBy('id desc')
  338. ->select('id, type, type_id, created_at, amount, is_send, send_time, freeze_amount, is_send_freeze, is_freeze, order_id');
  339. $list = pagination_make($query);
  340. foreach ($list['list'] as $index => &$item) {
  341. $item['created_at'] = date('Y-m-d H:i:s', $item['created_at']);
  342. $item['send_time'] = $item['send_time'] ? date('Y-m-d H:i:s', $item['send_time']) : '';
  343. if (intval($item['type']) === ShareGroupMoney::TYPE_DIRECT) {
  344. $shareGroupPurchaseParentLog = ShareGroupPurchaseParentLog::findOne($item['type_id']);
  345. // if ($shareGroupPurchaseParentLog) {
  346. $order = Order::findOne($item['order_id']);
  347. $user_info = User::find()->alias('u')
  348. ->leftJoin(['su' => SaasUser::tableName()], 'su.mobile = u.binding')
  349. ->where(['u.id' => $shareGroupPurchaseParentLog->user_id, 'u.is_delete' => 0, 'su.is_delete' => 0])
  350. ->select('su.name')->asArray()->one();
  351. $item['desc'] = $user_info['name'] . $order->order_no . '产生佣金';
  352. // }
  353. } elseif (intval($item['type']) === ShareGroupMoney::TYPE_SUPPORT) {
  354. $shareGroupSupportLog = ShareGroupSupportLog::findOne($item['type_id']);
  355. // if ($shareGroupSupportLog) {
  356. $order = Order::findOne($item['order_id']);
  357. $user_info = User::find()->alias('u')
  358. ->leftJoin(['su' => SaasUser::tableName()], 'su.mobile = u.binding')
  359. ->where(['u.id' => $shareGroupSupportLog->user_id, 'u.is_delete' => 0, 'su.is_delete' => 0])
  360. ->select('su.name')->asArray()->one();
  361. $item['desc'] = $user_info['name'] . $order->order_no . '产生佣金';
  362. if ($item['is_freeze']) {
  363. if (intval($item['is_send_freeze'])) {
  364. $item['amount'] = bcadd($item['amount'], $item['freeze_amount'], 2);
  365. $item['desc'] .= "(包含冻结".$item['freeze_amount'].")";
  366. }
  367. }
  368. // }
  369. } else {
  370. $item['desc'] = '拼购区成团产生佣金';
  371. $shareGroupMoneySubAmount = ShareGroupMoneySub::find()->where(['share_money_id' => $item['id'], 'is_send' => 1])->sum('amount');
  372. if ($shareGroupMoneySubAmount > 0) {
  373. $item['desc'] .= "(已发放".$shareGroupMoneySubAmount.")";
  374. }
  375. }
  376. $item['type'] = intval($item['type']);
  377. $item['is_send'] = intval($item['is_send']);
  378. unset($list['list'][$index]['is_freeze'], $list['list'][$index]['is_send_freeze'], $list['list'][$index]['freeze_amount']);
  379. }
  380. return [
  381. 'code' => 0,
  382. 'msg' => '',
  383. 'data' => $list
  384. ];
  385. } catch (\Exception $e) {
  386. return [
  387. 'code' => 1,
  388. 'msg' => $e->getMessage()
  389. ];
  390. }
  391. }
  392. //帮扶区
  393. public function supportList() {
  394. try {
  395. $user_id = $this->user_id;
  396. $query = ShareGroupSupportLog::find()->alias('s')
  397. ->leftJoin(['u' => User::tableName()], 's.user_id = u.id')
  398. ->leftJoin(['su' => SaasUser::tableName()], 'su.mobile = u.binding')
  399. ->where(['s.parent_user_id' => $user_id])
  400. ->select('su.mobile, su.name, su.avatar, s.id, s.created_at, s.user_id')
  401. ->orderBy('s.id desc');
  402. $list = pagination_make($query);
  403. foreach ($list['list'] as &$item) {
  404. $item['created_at'] = date('Y-m-d H:i:s', $item['created_at']);
  405. $ShareGroupPurchaseUser = ShareGroupPurchaseUser::find()->where(['parent_user_id' => $item['user_id']])
  406. ->select('user_id')->column();
  407. $item['num'] = ShareGroupSupportLog::find()->where(['user_id' => $ShareGroupPurchaseUser])
  408. ->select('id')->count() ?: 0;
  409. }
  410. return [
  411. 'code' => 0,
  412. 'msg' => '',
  413. 'data' => $list
  414. ];
  415. } catch (\Exception $e) {
  416. return [
  417. 'code' => 1,
  418. 'msg' => $e->getMessage()
  419. ];
  420. }
  421. }
  422. }