PintuanOrder.php 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318
  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\member\Member as MemberModel;
  13. use app\model\order\OrderCommon;
  14. use app\model\order\VirtualOrder;
  15. /**
  16. * 拼团订单
  17. */
  18. class PintuanOrder extends BaseModel
  19. {
  20. /**
  21. * 开团/参团
  22. * @param $order
  23. * @param int $group_id
  24. * @param $pintuan_id
  25. * @return array|\multitype
  26. */
  27. public function addPintuanOrder($order, $group_id, $pintuan_id)
  28. {
  29. $site_id = $order[ 'site_id' ];
  30. $order_id = $order[ 'order_id' ];
  31. $order_no = $order[ 'order_no' ];
  32. $order_type = $order[ 'order_type' ];
  33. $member_id = $order[ 'member_id' ];
  34. //获取用户头像
  35. $member_model = new MemberModel();
  36. $member_info = $member_model->getMemberInfo([ [ 'member_id', '=', $order[ 'member_id' ] ] ], 'headimg,nickname');
  37. //获取拼团信息
  38. $pintuan_model = new Pintuan();
  39. $pintuan = $pintuan_model->getPintuanInfo([ [ 'pintuan_id', '=', $pintuan_id ] ], 'status');
  40. $pintuan_info = $pintuan[ 'data' ];
  41. //判断拼团活动状态
  42. if ($pintuan_info[ 'status' ] != 1) {
  43. return $this->error('', '该拼团活动已结束');//该拼团活动已结束
  44. }
  45. $order_extend = $order[ 'extend' ] ?? '';
  46. if (!empty($order_extend)) {
  47. $order_extend = json_decode($order_extend, true);
  48. $pintuan_num = $order_extend[ 'pintuan_num' ];
  49. }
  50. //判断是开团还是拼团
  51. $pintuan_order_data = array (
  52. 'pintuan_id' => $pintuan_id,
  53. 'order_id' => $order_id,
  54. 'order_no' => $order_no,
  55. 'order_type' => $order_type,
  56. 'pintuan_status' => 0,
  57. 'site_id' => $site_id,
  58. 'member_id' => $member_id,
  59. 'member_img' => $member_info[ 'data' ][ 'headimg' ],
  60. 'nickname' => $member_info[ 'data' ][ 'nickname' ],
  61. 'pintuan_num' => $pintuan_num ?? 0//阶梯规格
  62. );
  63. if ($group_id) {//拼团
  64. //拼团组信息
  65. $pintuan_group_model = new PintuanGroup();
  66. $pintuan_group_info = $pintuan_group_model->getPintuanGroupInfo(
  67. [ [ 'group_id', '=', $group_id ] ], 'group_id,head_id,pintuan_num,pintuan_count,status'
  68. )[ 'data' ] ?? [];
  69. $result = $this->isCanJoinGroup($group_id, $order[ 'member_id' ]);
  70. if ($result[ 'code' ] < 0) {
  71. return $result;
  72. }
  73. $pintuan_order_data[ 'group_id' ] = $group_id;
  74. $pintuan_order_data[ 'head_id' ] = $pintuan_group_info[ 'head_id' ];
  75. } else {//开团
  76. $pintuan_order_data[ 'group_id' ] = 0;
  77. $pintuan_order_data[ 'head_id' ] = $member_id;
  78. }
  79. $res = model('promotion_pintuan_order')->add($pintuan_order_data);
  80. return $this->success($res);
  81. }
  82. /**
  83. * 判断是否可以参团
  84. * @param $group_id
  85. * @param $member_id
  86. * @return array
  87. */
  88. public function isCanJoinGroup($group_id, $member_id)
  89. {
  90. if ($group_id > 0) {
  91. $pintuan_group_model = new PintuanGroup();
  92. $pintuan_group = $pintuan_group_model->getPintuanGroupInfo(
  93. [ [ 'group_id', '=', $group_id ] ], 'group_id,head_id,pintuan_num,pintuan_count,status'
  94. );
  95. $pintuan_group_info = $pintuan_group[ 'data' ];
  96. if ($pintuan_group_info[ 'head_id' ] == $member_id) {
  97. return $this->error('', '抱歉,您不能参与自己的团');
  98. }
  99. if ($pintuan_group_info[ 'status' ] != 2) {
  100. return $this->error('', '该拼团组已失效');
  101. }
  102. if ($pintuan_group_info[ 'pintuan_num' ] == $pintuan_group_info[ 'pintuan_count' ]) {
  103. return $this->error('', '该拼团组已满员,请参加别的拼团或自己开团');
  104. }
  105. //判断是否已参团
  106. $count = model('promotion_pintuan_order')->getCount(
  107. [
  108. [ 'po.group_id', '=', $group_id ],
  109. [ 'po.pintuan_status', 'in', '0,2' ],
  110. [ 'po.member_id', '=', $member_id ],
  111. [ ' o.order_status', '<>', OrderCommon::ORDER_CLOSE ],
  112. ],
  113. 'po.pintuan_id', 'po',
  114. [
  115. [ 'order o', 'o.order_id = po.order_id', 'left' ]
  116. ]
  117. );
  118. if ($count > 0) {
  119. return $this->error('', '请不要重复参团');
  120. }
  121. }
  122. return $this->success();
  123. }
  124. /**
  125. * @param unknown $data
  126. */
  127. public function orderPay($order)
  128. {
  129. model('promotion_pintuan_order')->startTrans();
  130. try {
  131. //禁止拼团订单在未成团中申请退款
  132. model('order')->update([ 'is_enable_refund' => 0 ], [ [ 'order_id', '=', $order[ 'order_id' ] ] ]);
  133. //支付操作查询拼团订单,如果group_id=0,创建组,else,检测成团
  134. //获取拼团订单信息
  135. $pintuan_order = $this->getPintuanOrderInfo([ [ 'order_id', '=', $order[ 'order_id' ] ] ]);
  136. $pintuan_order_info = $pintuan_order[ 'data' ];
  137. $order_common_model = new OrderCommon();
  138. $local_result = $order_common_model->orderLock($order[ 'order_id' ]);
  139. if (!$local_result) return $this->error();
  140. $pintuan_group_model = new PintuanGroup();
  141. if ($pintuan_order_info[ 'group_id' ] == 0) {
  142. //开团
  143. //创建组
  144. $group_id = $pintuan_group_model->addPintuanGroup($pintuan_order_info);
  145. //更新拼团订单组信息
  146. $pintuan_order_data[ 'group_id' ] = $group_id[ 'data' ];
  147. $pintuan_order_data[ 'pintuan_status' ] = 2;
  148. $res = model('promotion_pintuan_order')->update($pintuan_order_data, [ [ 'order_id', '=', $order[ 'order_id' ] ] ]);
  149. //更新订单营销状态名称
  150. model('order')->update([ 'promotion_status_name' => '拼团中' ], [ [ 'order_id', '=', $order[ 'order_id' ] ] ]);
  151. } else {//参团
  152. //更新拼团订单信息
  153. $pintuan_order_data[ 'pintuan_status' ] = 2;
  154. $res = model('promotion_pintuan_order')->update($pintuan_order_data, [ [ 'order_id', '=', $order[ 'order_id' ] ] ]);
  155. //更新订单营销状态名称
  156. model('order')->update([ 'promotion_status_name' => '拼团中' ], [ [ 'order_id', '=', $order[ 'order_id' ] ] ]);
  157. //加入组
  158. $pintuan_group_model->joinPintuanGroup($pintuan_order_info);
  159. }
  160. model('promotion_pintuan_order')->commit();
  161. return $this->success($res);
  162. } catch (\Exception $e) {
  163. model('promotion_pintuan_order')->rollback();
  164. return $this->error('', $e->getMessage());
  165. }
  166. }
  167. /**
  168. * 获取拼团订单信息
  169. * @param array $condition
  170. * @param string $field
  171. * @return array
  172. */
  173. public function getPintuanOrderInfo($condition = [], $field = '*', $alias = '', $join = '')
  174. {
  175. $order_info = model('promotion_pintuan_order')->getInfo($condition, $field, $alias, $join);
  176. return $this->success($order_info);
  177. }
  178. /**
  179. * 获取订单信息
  180. * @param array $condition
  181. * @param string $field
  182. * @param string $order
  183. * @param null $limit
  184. * @return array
  185. */
  186. public function getPintuanOrderList($condition = [], $field = '*', $order = '', $limit = null, $group_by = '')
  187. {
  188. $list = model('promotion_pintuan_order')->getList($condition, $field, $order, '', '', $group_by, $limit);
  189. return $this->success($list);
  190. }
  191. /**
  192. * 获取订单分页列表
  193. * @param array $condition
  194. * @param int $page
  195. * @param int $page_size
  196. * @param string $order
  197. * @return array
  198. */
  199. public function getPintuanOrderPageList($condition = [], $page = 1, $page_size = PAGE_LIST_ROWS, $order = '')
  200. {
  201. $field = 'ppo.*,ppgs.id as pintuan_goods_id,
  202. ppg.pintuan_num,ppg.pintuan_count,ppg.is_promotion,ppg.end_time as group_end_time,
  203. o.site_name,o.pay_time,o.pay_money,o.order_status_name,o.name,o.order_money,o.mobile,o.address,o.full_address,o.order_from_name,o.pay_type_name,
  204. og.sku_name,og.sku_image';
  205. $alias = 'ppo';
  206. $join = [
  207. [ 'order o', 'o.order_id = ppo.order_id', 'left' ],
  208. [ 'order_goods og', 'og.order_id = ppo.order_id', 'left' ],
  209. [ 'promotion_pintuan_group ppg', 'ppo.group_id = ppg.group_id', 'left' ],
  210. [ 'promotion_pintuan_goods ppgs', 'og.sku_id = ppgs.sku_id and ppgs.pintuan_id=ppo.pintuan_id', 'inner' ]
  211. ];
  212. $list = model('promotion_pintuan_order')->pageList($condition, $field, $order, $page, $page_size, $alias, $join);
  213. return $this->success($list);
  214. }
  215. /**
  216. * 拼团订单详情
  217. * @param $order_id
  218. * @param $member_id
  219. */
  220. public function getPintuanOrderDetail($id, $member_id, $site_id)
  221. {
  222. $field = 'ppo.*,ppgs.id as pintuan_goods_id,
  223. ppg.pintuan_num,ppg.pintuan_count,ppg.is_promotion,ppg.end_time as group_end_time,ppgs.pintuan_price,
  224. pp.group_num,pp.order_num,pp.status,
  225. gs.discount_price,
  226. o.site_name,o.pay_time,o.pay_money,o.order_status_name,o.name,o.mobile,o.address,o.full_address,o.order_from_name,o.pay_type_name,o.order_type,o.order_money,
  227. og.sku_name,og.sku_image';
  228. $alias = 'ppo';
  229. $join = [
  230. [ 'order o', 'o.order_id = ppo.order_id', 'left' ],
  231. [ 'order_goods og', 'og.order_id = ppo.order_id', 'left' ],
  232. [ 'promotion_pintuan_group ppg', 'ppo.group_id = ppg.group_id', 'left' ],
  233. [ 'promotion_pintuan pp', 'pp.pintuan_id = ppo.pintuan_id', 'left' ],
  234. [ 'goods_sku gs', 'gs.sku_id = og.sku_id', 'left' ],
  235. [ 'promotion_pintuan_goods ppgs', 'og.sku_id = ppgs.sku_id and ppgs.pintuan_id=ppo.pintuan_id', 'left' ]
  236. ];
  237. $condition = array (
  238. [ "ppo.id", "=", $id ],
  239. [ "ppo.member_id", "=", $member_id ],
  240. [ "ppo.site_id", "=", $site_id ],
  241. );
  242. $info = model('promotion_pintuan_order')->getInfo($condition, $field, $alias, $join);
  243. //查询参与拼单的会员
  244. if (!empty($info)) {
  245. $member_list = model('promotion_pintuan_order')->getList([ [ "group_id", "=", $info[ "group_id" ] ], [ 'pintuan_status', 'in', '2,3' ] ], "member_img,nickname,member_id");
  246. $info[ "member_list" ] = $member_list;
  247. }
  248. return $this->success($info);
  249. }
  250. /**
  251. * 获取拼团订单数量
  252. * @param array $condition
  253. * @param string $field
  254. * @return array
  255. */
  256. public function getPintuanOrderCount($condition = [], $field = '*', $alias = '', $join = '', $group = '')
  257. {
  258. $order_info = model('promotion_pintuan_order')->getCount($condition, $field, $alias, $join, $group);
  259. return $this->success($order_info);
  260. }
  261. /**
  262. * 拼团成功
  263. * @param $params
  264. */
  265. public function pintuanOrderSuccess($params)
  266. {
  267. }
  268. /**
  269. * 拼团订单关闭
  270. * @param $condition
  271. * @return array
  272. */
  273. public function pintuanOrderClose($condition)
  274. {
  275. //将未支付的修改为失败
  276. model('promotion_pintuan_order')->update([ 'pintuan_status' => 1 ], $condition);
  277. return $this->success();
  278. }
  279. /**
  280. * 虚拟商品成功后操作
  281. * @param $order_id
  282. */
  283. public function virtualSuccessAction($order_id)
  284. {
  285. $order_info = model('order')->getInfo([ [ 'order_id', '=', $order_id ] ]);
  286. $order_type = $order_info[ 'order_type' ];
  287. if ($order_type == 4) {//虚拟订单
  288. $virtual_order_model = new VirtualOrder();
  289. $virtual_order_model->toSend([ 'order_id' => $order_id ]);
  290. }
  291. }
  292. }