PintuanGroup.php 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513
  1. <?php
  2. /**
  3. * Niushop商城系统 - 团队十年电商经验汇集巨献!
  4. * =========================================================
  5. * Copy right 2019-2029 杭州牛之云科技有限公司, 保留所有权利。
  6. * ----------------------------------------------
  7. * 官方网址: https://www.niushop.com
  8. * =========================================================
  9. */
  10. namespace addon\pintuan\model;
  11. use app\model\BaseModel;
  12. use app\model\message\Message;
  13. use app\model\order\OrderCommon;
  14. use app\model\order\OrderRefund;
  15. use app\model\system\Cron;
  16. /**
  17. * 拼团组
  18. */
  19. class PintuanGroup extends BaseModel
  20. {
  21. /**
  22. * 创建拼团组
  23. * @param $pintuan_order_info
  24. * @return array|\multitype
  25. */
  26. public function addPintuanGroup($pintuan_order_info)
  27. {
  28. model('promotion_pintuan_group')->startTrans();
  29. //获取拼团信息
  30. $pintuan_model = new Pintuan();
  31. $pintuan_id = $pintuan_order_info[ 'pintuan_id' ];
  32. $pintuan_info = $pintuan_model->getPintuanInfo([ [ 'pintuan_id', '=', $pintuan_id ] ])[ 'data' ] ?? [];
  33. $pintuan_type = $pintuan_info[ 'pintuan_type' ];//类型
  34. switch ( $pintuan_type ) {
  35. case 'ordinary'://默认拼团方式
  36. $pintuan_num = $pintuan_info[ 'pintuan_num' ];
  37. break;
  38. case 'ladder'://阶梯拼团
  39. $pintuan_num = $pintuan_order_info[ 'pintuan_num' ];
  40. break;
  41. }
  42. try {
  43. $data = [
  44. 'site_id' => $pintuan_info[ 'site_id' ],
  45. 'goods_id' => $pintuan_info[ 'goods_id' ],
  46. 'is_virtual_goods' => $pintuan_info[ 'is_virtual_goods' ],
  47. 'pintuan_id' => $pintuan_order_info[ 'pintuan_id' ],
  48. 'head_id' => $pintuan_order_info[ 'head_id' ],
  49. 'pintuan_num' => $pintuan_num,
  50. 'pintuan_count' => 1,
  51. 'create_time' => time(),
  52. 'end_time' => time() + ( $pintuan_info[ 'pintuan_time' ] * 60 ),
  53. 'status' => 2,
  54. 'is_virtual_buy' => $pintuan_info[ 'is_virtual_buy' ],
  55. 'is_single_buy' => $pintuan_info[ 'is_single_buy' ],
  56. 'is_promotion' => $pintuan_info[ 'is_promotion' ],
  57. 'buy_num' => $pintuan_info[ 'buy_num' ],
  58. ];
  59. $res = model('promotion_pintuan_group')->add($data);
  60. //添加拼团组关闭事件
  61. $cron = new Cron();
  62. $cron->addCron(1, 0, "拼团组关闭", "ClosePintuanGroup", $data[ 'end_time' ], $res);
  63. //更新拼团开组人数及购买人数
  64. $pintua_data = [
  65. 'group_num' => $pintuan_info[ 'group_num' ] + 1,
  66. 'order_num' => $pintuan_info[ 'order_num' ] + 1,
  67. ];
  68. $pintuan_model->editPintuanNum($pintua_data, [ [ 'pintuan_id', '=', $pintuan_order_info[ 'pintuan_id' ] ] ]);
  69. model('promotion_pintuan_group')->commit();
  70. return $this->success($res);
  71. } catch (\Exception $e) {
  72. model('promotion_pintuan_group')->rollback();
  73. return $this->error('', $e->getMessage());
  74. }
  75. }
  76. /**
  77. * 编辑组信息
  78. * @param array $condition
  79. * @param array $data
  80. * @return array
  81. */
  82. public function editPintuanGroup($condition = [], $data = [])
  83. {
  84. $res = model('promotion_pintuan_group')->update($data, $condition);
  85. return $this->success($res);
  86. }
  87. /**
  88. * 加入拼团组
  89. * @param $pintuan_order_info
  90. * @return array|\multitype
  91. */
  92. public function joinPintuanGroup($pintuan_order_info)
  93. {
  94. model('promotion_pintuan_group')->startTrans();
  95. //获取拼团信息
  96. $pintuan_model = new Pintuan();
  97. $pintuan_id = $pintuan_order_info[ 'pintuan_id' ];
  98. $pintuan = $pintuan_model->getPintuanInfo([ [ 'pintuan_id', '=', $pintuan_id ] ]);
  99. $pintuan_info = $pintuan[ 'data' ];
  100. try {
  101. $order_num = $pintuan_info[ 'order_num' ] + 1;
  102. $success_group_num = $pintuan_info[ 'success_group_num' ];
  103. //获取拼团组信息
  104. $group_info = $this->getPintuanGroupInfo([ [ 'group_id', '=', $pintuan_order_info[ 'group_id' ] ] ])[ 'data' ] ?? [];
  105. //更新拼团组当前数量及状态
  106. $pintuan_count = $group_info[ 'pintuan_count' ] + 1;
  107. $res = $this->editPintuanGroup([ [ 'group_id', '=', $pintuan_order_info[ 'group_id' ] ] ], [ 'pintuan_count' => $pintuan_count ]);
  108. if ($pintuan_count == $group_info[ 'pintuan_num' ]) {//已成团
  109. $success_group_num += 1;
  110. //修改拼团组状态
  111. model('promotion_pintuan_group')->update([ 'status' => 3 ], [ [ 'group_id', '=', $pintuan_order_info[ 'group_id' ] ] ]);
  112. //查询该组所有订单
  113. $pintuan_order_model = new PintuanOrder();
  114. $pintuan_order = $pintuan_order_model->getPintuanOrderList([ [ 'group_id', '=', $pintuan_order_info[ 'group_id' ] ] ], 'order_id,pintuan_status');
  115. $pintuan_order_list = $pintuan_order[ 'data' ];
  116. $message_model = new Message();
  117. $order_model = new OrderCommon();
  118. if (!empty($pintuan_order_list)) {
  119. foreach ($pintuan_order_list as $v) {
  120. switch ( $v[ 'pintuan_status' ] ) {
  121. case 0:
  122. //将未支付的修改为失败
  123. model('promotion_pintuan_order')->update([ 'pintuan_status' => 1 ], [ [ 'order_id', '=', $v[ 'order_id' ] ] ]);
  124. //开放订单
  125. $order_model->orderUnlock($v[ 'order_id' ]);
  126. //关闭订单
  127. $result = $order_model->orderClose($v[ 'order_id' ], [], '当前拼团已成团,由于您未及时支付,该订单已关闭');
  128. if ($result[ "code" ] < 0) {
  129. model('promotion_pintuan_group')->rollback();
  130. return $result;
  131. }
  132. //更新订单营销状态名称
  133. model('order')->update([ 'promotion_status_name' => '拼团失败' ], [ [ 'order_id', '=', $v[ 'order_id' ] ] ]);
  134. // 发送消息
  135. $param = [ 'keywords' => 'PINTUAN_FAIL', 'time' => time(), 'order_id' => $v[ 'order_id' ], 'site_id' => $group_info[ 'site_id' ] ];
  136. $message_model->sendMessage($param);
  137. break;
  138. break;
  139. case 2://已支付
  140. //将已支付的修改为成功
  141. model('promotion_pintuan_order')->update([ 'pintuan_status' => 3 ], [ [ 'order_id', '=', $v[ 'order_id' ] ] ]);
  142. //开放订单
  143. $order_model->orderUnlock($v[ 'order_id' ]);
  144. //更新订单营销状态名称
  145. model('order')->update([ 'promotion_status_name' => '拼团成功', 'is_enable_refund' => 1 ], [ [ 'order_id', '=', $v[ 'order_id' ] ] ]);
  146. //针对虚拟订单执行收发货操作
  147. // if ($group_info['is_virtual_goods'] == 1) {
  148. // $order_model->orderCommonTakeDelivery($v['order_id']);
  149. // }
  150. $pintuan_order_model = new PintuanOrder();
  151. $pintuan_order_model->virtualSuccessAction($v[ 'order_id' ]);
  152. // 发送消息
  153. $param = [ 'keywords' => 'PINTUAN_COMPLETE', 'time' => time(), 'order_id' => $v[ 'order_id' ], 'site_id' => $group_info[ 'site_id' ] ];
  154. $message_model->sendMessage($param);
  155. break;
  156. }
  157. }
  158. }
  159. }
  160. //更新拼团 购买人数
  161. $pintuan_model->editPintuanNum([ 'order_num' => $order_num, 'success_group_num' => $success_group_num ], [ [ 'pintuan_id', '=', $pintuan_order_info[ 'pintuan_id' ] ] ]);
  162. model('promotion_pintuan_group')->commit();
  163. return $this->success($res);
  164. } catch (\Exception $e) {
  165. model('promotion_pintuan_group')->rollback();
  166. return $this->error('', $e->getMessage());
  167. }
  168. }
  169. /**
  170. * 查询拼团组信息
  171. * @param array $condition
  172. * @param string $field
  173. * @return array
  174. */
  175. public function getPintuanGroupInfo($condition = [], $field = '*')
  176. {
  177. $group_info = model('promotion_pintuan_group')->getInfo($condition, $field);
  178. return $this->success($group_info);
  179. }
  180. /**
  181. * 获取拼团组详情
  182. * @param $condition
  183. * @return array
  184. */
  185. public function getPintuanGroupDetail($condition)
  186. {
  187. $field = 'pg.*,m.nickname,m.headimg,og.sku_name,og.sku_image,pp.pintuan_price';
  188. $alias = 'pg';
  189. $join = [
  190. [ 'promotion_pintuan_order ppo', 'ppo.group_id = pg.group_id and ppo.member_id = pg.head_id', 'inner' ],
  191. [ 'promotion_pintuan pp', 'pp.pintuan_id = pg.pintuan_id', 'inner' ],
  192. [ 'order_goods og', 'og.order_id = ppo.order_id', 'inner' ],
  193. [ 'member m', 'm.member_id = pg.head_id', 'inner' ]
  194. ];
  195. $info = model('promotion_pintuan_group')->getInfo($condition, $field, $alias, $join);
  196. //查询参与拼单的会员
  197. if (!empty($info)) {
  198. $member_list = model('promotion_pintuan_order')->getList([ [ "group_id", "=", $info[ "group_id" ] ], [ 'pintuan_status', 'not in', '0,1' ] ], "pintuan_status,member_img,nickname,member_id");
  199. $info[ "member_list" ] = $member_list;
  200. }
  201. return $this->success($info);
  202. }
  203. /**
  204. * 获取组列表
  205. * @param array $condition
  206. * @param string $field
  207. * @return array
  208. */
  209. public function getPintuanGroupList($condition = [], $field = '*')
  210. {
  211. $list = model('promotion_pintuan_group')->getList($condition, $field);
  212. return $this->success($list);
  213. }
  214. /**
  215. * 获取拼团组商品列表
  216. * @param array $condition
  217. * @return array
  218. */
  219. public function getPintuanGoodsGroupList($condition = [])
  220. {
  221. $field = 'ppg.group_id,ppg.goods_id,ppg.pintuan_id,ppg.head_id,ppg.pintuan_num,ppg.pintuan_count,ppg.create_time,ppg.end_time,ppg.status,ppg.is_single_buy,ppg.is_promotion,ppg.buy_num,m.member_id,m.nickname,m.headimg';
  222. $alias = 'ppg';
  223. $join = [
  224. [
  225. 'member m',
  226. 'ppg.head_id = m.member_id',
  227. 'inner'
  228. ]
  229. ];
  230. $list = model('promotion_pintuan_group')->getList($condition, $field, 'ppg.create_time desc', $alias, $join);
  231. return $this->success($list);
  232. }
  233. /**
  234. * 获取拼团组分页列表
  235. * @param array $condition
  236. * @param number $page
  237. * @param string $page_size
  238. * @param string $order
  239. */
  240. public function getPintuanGroupPageList($condition = [], $page = 1, $page_size = PAGE_LIST_ROWS, $order = '')
  241. {
  242. $field = 'pg.*,g.goods_name,g.goods_image,m.nickname,m.headimg';
  243. $alias = 'pg';
  244. $join = [
  245. [
  246. 'goods g',
  247. 'pg.goods_id = g.goods_id',
  248. 'inner'
  249. ],
  250. [
  251. 'member m',
  252. 'm.member_id = pg.head_id',
  253. 'inner'
  254. ]
  255. ];
  256. $list = model('promotion_pintuan_group')->pageList($condition, $field, $order, $page, $page_size, $alias, $join);
  257. return $this->success($list);
  258. }
  259. /**
  260. * 关闭拼团组
  261. * @param $group_id
  262. * @return array|\multitype
  263. */
  264. public function cronClosePintuanGroup($group_id)
  265. {
  266. model('promotion_pintuan_group')->startTrans();
  267. try {
  268. //获取拼团组信息
  269. $pintuan_group = model('promotion_pintuan_group')->getInfo([ [ 'group_id', '=', $group_id ] ], 'status,is_virtual_buy,is_virtual_goods');
  270. if (!empty($pintuan_group)) {
  271. if ($pintuan_group[ 'status' ] == 2) {
  272. //关闭所有已支付的订单
  273. $res = $this->closePaidGroupOrder($group_id, $pintuan_group[ 'is_virtual_buy' ], $pintuan_group[ 'is_virtual_goods' ]);
  274. if ($res[ 'code' ] < 0) {
  275. model('promotion_pintuan_group')->rollback();
  276. return $res;
  277. }
  278. }
  279. }
  280. model('promotion_pintuan_group')->commit();
  281. return $this->success();
  282. } catch (\Exception $e) {
  283. model('promotion_pintuan_group')->rollback();
  284. return $this->error('', $e->getMessage());
  285. }
  286. }
  287. /**
  288. * 关闭拼团组未支付订单
  289. * @param $group_id
  290. * @return array|\multitype
  291. */
  292. public function closeUnpaidGroupOrder($group_id)
  293. {
  294. //获取所有改组未支付的订单
  295. $pintuan_order_model = new PintuanOrder();
  296. $unpaid_order = $pintuan_order_model->getPintuanOrderList([ [ 'group_id', '=', $group_id ], [ 'pintuan_status', '=', 0 ] ], 'order_id');
  297. $unpaid_order_list = $unpaid_order[ 'data' ];
  298. model('promotion_pintuan_order')->startTrans();
  299. $order_model = new OrderCommon();
  300. try {
  301. if (!empty($unpaid_order_list)) {
  302. foreach ($unpaid_order_list as $v) {
  303. //修改拼团订单状态
  304. model('promotion_pintuan_order')->update([ 'pintuan_status' => 1 ], [ [ 'order_id', '=', $v[ 'order_id' ] ] ]);
  305. //解除锁定
  306. $order_model->orderUnlock($v[ 'order_id' ]);
  307. //关闭订单
  308. $result = $order_model->orderClose($v[ 'order_id' ], [], '拼团祖关闭,订单自动关闭');
  309. if ($result[ "code" ] < 0) {
  310. model('promotion_pintuan_group')->rollback();
  311. return $result;
  312. }
  313. //更新订单营销状态名称
  314. model('order')->update([ 'promotion_status_name' => '拼团失败' ], [ [ 'order_id', '=', $v[ 'order_id' ] ] ]);
  315. }
  316. }
  317. model('promotion_pintuan_order')->commit();
  318. return $this->success();
  319. } catch (\Exception $e) {
  320. model('promotion_pintuan_order')->rollback();
  321. return $this->error('', $e->getMessage());
  322. }
  323. }
  324. /**
  325. * 关闭拼团组已支付订单
  326. * @param $group_id
  327. * @param $is_virtual_buy
  328. * @param $is_virtual_goods
  329. * @return array|\multitype
  330. */
  331. public function closePaidGroupOrder($group_id, $is_virtual_buy, $is_virtual_goods)
  332. {
  333. //获取所有该组的订单
  334. $pintuan_order_model = new PintuanOrder();
  335. $paid_order = $pintuan_order_model->getPintuanOrderList([ [ 'group_id', '=', $group_id ] ], 'order_id,pintuan_status,site_id');
  336. $paid_order_list = $paid_order[ 'data' ];
  337. $order_model = new OrderCommon();
  338. $message_model = new Message();
  339. model('promotion_pintuan_group')->startTrans();
  340. try {
  341. if ($is_virtual_buy == 1) {//虚拟成团
  342. //修改拼团组状态(成功)
  343. $res = model('promotion_pintuan_group')->update([ 'status' => 3 ], [ [ 'group_id', '=', $group_id ] ]);
  344. //获取拼团组信息
  345. $pintuan_id = model('promotion_pintuan_group')->getValue([ [ 'group_id', '=', $group_id ] ], 'pintuan_id');
  346. //更新拼团 成团组数
  347. model('promotion_pintuan')->setInc([ [ 'pintuan_id', '=', $pintuan_id ] ], 'success_group_num');
  348. if (!empty($paid_order_list)) {
  349. $order_id = 0;
  350. foreach ($paid_order_list as $v) {
  351. switch ( $v[ 'pintuan_status' ] ) {
  352. case 0:
  353. //将未支付的修改为失败
  354. model('promotion_pintuan_order')->update([ 'pintuan_status' => 1 ], [ [ 'order_id', '=', $v[ 'order_id' ] ] ]);
  355. //解除锁定
  356. $order_model->orderUnlock($v[ 'order_id' ]);
  357. //关闭订单
  358. $result = $order_model->orderClose($v[ 'order_id' ], [], '拼团祖关闭,订单自动关闭');
  359. if ($result[ "code" ] < 0) {
  360. model('promotion_pintuan_group')->rollback();
  361. return $result;
  362. }
  363. //更新订单营销状态名称
  364. model('order')->update([ 'promotion_status_name' => '拼团失败' ], [ [ 'order_id', '=', $v[ 'order_id' ] ] ]);
  365. // 发送消息
  366. $param = [ 'keywords' => 'PINTUAN_FAIL', 'time' => time(), 'order_id' => $v[ 'order_id' ], 'site_id' => $v[ 'site_id' ] ];
  367. $message_model->sendMessage($param);
  368. break;
  369. case 2://已支付
  370. $order_id = $v[ 'order_id' ];
  371. //解除锁定
  372. $order_model->orderUnlock($v[ 'order_id' ]);
  373. //将已支付的修改为成功
  374. model('promotion_pintuan_order')->update([ 'pintuan_status' => 3 ], [ [ 'order_id', '=', $v[ 'order_id' ] ] ]);
  375. //更新订单营销状态名称
  376. model('order')->update([ 'promotion_status_name' => '拼团成功', 'is_enable_refund' => 1 ], [ [ 'order_id', '=', $v[ 'order_id' ] ] ]);
  377. //针对虚拟订单执行收发货操作
  378. // if ($is_virtual_goods == 1) {
  379. // $Virtual_model = new VirtualOrder();
  380. // $Virtual_model->orderTakeDelivery($v['order_id']);
  381. // }
  382. $pintuan_order_model = new PintuanOrder();
  383. $pintuan_order_model->virtualSuccessAction($v[ 'order_id' ]);
  384. // 发送消息
  385. $param = [ 'keywords' => 'PINTUAN_COMPLETE', 'time' => time(), 'order_id' => $v[ 'order_id' ], 'site_id' => $v[ 'site_id' ] ];
  386. $message_model->sendMessage($param);
  387. break;
  388. }
  389. }
  390. }
  391. } else {//未开启虚拟成团
  392. //修改拼团组状态为失败
  393. $res = model('promotion_pintuan_group')->update([ 'status' => 1 ], [ [ 'group_id', '=', $group_id ] ]);
  394. if (!empty($paid_order_list)) {
  395. foreach ($paid_order_list as $v) {
  396. switch ( $v[ 'pintuan_status' ] ) {
  397. case 0:
  398. //将未支付的修改为失败
  399. model('promotion_pintuan_order')->update([ 'pintuan_status' => 1 ], [ [ 'order_id', '=', $v[ 'order_id' ] ] ]);
  400. //解除锁定
  401. $order_model->orderUnlock($v[ 'order_id' ]);
  402. //关闭订单
  403. $result = $order_model->orderClose($v[ 'order_id' ], [], '拼团失败,订单自动关闭');
  404. if ($result[ "code" ] < 0) {
  405. model('promotion_pintuan_group')->rollback();
  406. return $result;
  407. }
  408. //更新订单营销状态名称
  409. model('order')->update([ 'promotion_status_name' => '拼团失败' ], [ [ 'order_id', '=', $v[ 'order_id' ] ] ]);
  410. // 发送消息
  411. $param = [ 'keywords' => 'PINTUAN_FAIL', 'time' => time(), 'order_id' => $v[ 'order_id' ], 'site_id' => $v[ 'site_id' ] ];
  412. $message_model->sendMessage($param);
  413. break;
  414. case 2:
  415. //关闭拼团订单
  416. model('promotion_pintuan_order')->update([ 'pintuan_status' => 1 ], [ [ 'order_id', '=', $v[ 'order_id' ] ] ]);
  417. //解除锁定
  418. $order_model->orderUnlock($v[ 'order_id' ]);
  419. //主动退款
  420. $order_refund_model = new OrderRefund();
  421. $refund_result = $order_refund_model->activeRefund($v[ 'order_id' ], "拼团订单关闭", '拼团订单关闭');
  422. if ($refund_result[ "code" ] < 0) {
  423. model('promotion_pintuan_group')->rollback();
  424. return $refund_result;
  425. }
  426. //关闭订单
  427. // $result = $order_model->orderClose($v['order_id'], [], '拼团失败,订单自动关闭');
  428. // if ($result["code"] < 0) {
  429. // model('promotion_pintuan_group')->rollback();
  430. // return $result;
  431. // }
  432. //更新订单营销状态名称
  433. model('order')->update([ 'promotion_status_name' => '拼团失败' ], [ [ 'order_id', '=', $v[ 'order_id' ] ] ]);
  434. // 发送消息
  435. $param = [ 'keywords' => 'PINTUAN_FAIL', 'time' => time(), 'order_id' => $v[ 'order_id' ], 'site_id' => $v[ 'site_id' ] ];
  436. $message_model->sendMessage($param);
  437. break;
  438. }
  439. }
  440. }
  441. }
  442. model('promotion_pintuan_group')->commit();
  443. return $this->success($res);
  444. } catch (\Exception $e) {
  445. model('promotion_pintuan_group')->rollback();
  446. return $this->error('', $e->getMessage());
  447. }
  448. }
  449. }