setName('group_order') ->setDescription('拼团结束,发放权益卡或批量退款'); } protected function execute(Input $input, Output $output) { //更新拼团结束的订单状态 $this->updateGroupOrder(); } /** * 更新拼团结束的订单状态 */ protected function updateGroupOrder() { $last_id = 0; while($last_id >= 0) { $list = GroupOrderModel::alias('a') ->leftJoin('group_activity b','a.group_activity_id=b.id') ->where('a.status',0) ->where('a.end_time','<',time()) ->where('a.id','>',$last_id) ->field('a.id,a.num,a.goods_id,b.participant_num,b.is_simulate_form,b.simulate_num') ->order('a.id','asc') ->limit(30) ->select()->toArray(); if (!$list) { $last_id = -1; break; } foreach($list as $item) { $last_id = $item['id']; $list = GroupUserOrder::where([ 'group_order_id' => $item['id'], 'pay_status' => 1, 'status' => 1, 'refund_status' => 0, ]) ->field('id,user_id,sn,remark,order_amount,pay_way,transaction_id,order_terminal')->order('id','asc')->select()->toArray(); $num = count($list); if (($item['is_simulate_form'] == 1 && $num >= $item['simulate_num']) || ($item['is_simulate_form'] == 0 && $num >= $item['participant_num'])) { //模拟成团 $this->gruopSuccess($item,$list); } else { //拼团失败 $this->groupFail($item,$list); } } } } /** * 拼团成功(给已支付的用户发放权益卡) * @param $item */ protected function gruopSuccess($order,$list) { $max_id = UserEquity::max('id'); try { Db::startTrans(); $equityConfig = EquityConfig::where('id',$order['goods_id'])->findOrEmpty(); foreach($list as $item) { //用户发放权益卡 $max_id++; //创建用户权益卡 $userEquity = UserEquity::create([ 'user_id' => $item['user_id'], 'equity_id' => $order['goods_id'], 'goods_id' => $equityConfig['goods_id'], 'number' => $equityConfig['number'], 'create_time' => time(), 'end_time' => time() + $equityConfig['day_num'] * 86400, 'remark' => '拼团单id:'.$item['id'], 'code' => generateRandomString((8-strlen($max_id)),2).$max_id, ]); //更新用户拼团订单 GroupUserOrder::where('id',$item['id'])->update(['user_equity_id' => $userEquity->id]); } //更新拼团订单 GroupOrderModel::where('id',$order['id'])->update([ 'status' => 1, 'num' => count($list) ]); Db::commit(); } catch (\Exception $e) { Db::rollback(); Log::error('拼团失败,批量退款失败:'.$e->getMessage()); } } /* * 批量退款,关闭订单 * @param $item */ protected function groupFail($order,$list) { try { Db::startTrans(); foreach($list as $item) { $remark = $item['remark'] ?? ''; // 生成退款记录 $recordSn = generate_sn(RefundRecord::class, 'sn'); $record = RefundRecord::create([ 'sn' => $recordSn, 'user_id' => $item['user_id'], 'order_id' => $item['id'], 'order_sn' => $item['sn'], 'order_type' => RefundEnum::ORDER_TYPE_GROUP, 'order_amount' => $item['order_amount'], 'refund_amount' => $item['order_amount'], 'refund_type' => RefundEnum::TYPE_ADMIN, 'transaction_id' => $item['transaction_id'] ?? '', 'refund_way' => RefundEnum::getRefundWayByPayWay($item['pay_way']), ]); // 退款 $result = RefundLogic::refund($item, $record['id'], $item['order_amount'], 1); if ($result !== true) { //退款失败 $remark .= RefundLogic::getError(); GroupUserOrder::where('id',$item['id'])->update(['remark' => $remark]); } else { //退款成功 GroupUserOrder::where('id',$item['id'])->update(['status' => 3,'refund_status' => 1]); } } //更新拼团订单 GroupOrderModel::where('id',$order['id'])->update([ 'status' => 2, 'num' => count($list) ]); Db::commit(); } catch (\Exception $e) { Db::rollback(); Log::error('拼团失败,批量退款失败:'.$e->getMessage()); } } }