where(['id'=>$id])->visible([ 'id','title','image','start_time','end_time','type','equity_id', 'participant_num','origin_price','price','form_time_limit','area' ])->findOrEmpty()->toArray(); if(!empty($detail)){ $detail['area'] = explode(",",$detail['area']); $detail['price'] = explode(",",$detail['price']); $detail['participant_num'] = explode(",",$detail['participant_num']); $detail['timestamp'] = time(); $goods = Goods::where('id',$detail['goods']['goods_id'])->field('service_image,goods_category_id')->findOrEmpty()->toArray(); $detail['goods'] = array_merge($detail['goods'],$goods); //查询用户是否已有付款订单 $detail['order'] = GroupUserOrder::with('group_order')->where(['user_id'=>$userId,'group_activity_id'=>$detail['id'],'pay_status'=>1,'refund_status' => 0])->field('id,status,pay_way,pay_time,pay_status,remark,create_time,group_order_id')->findOrEmpty()->toArray(); } return $detail; } /** * @notes 拼团订单详情 */ public static function orderDetail($order_id,$url){ $detail = GroupOrder::where(['id'=>$order_id])->findOrEmpty()->toArray(); if(!empty($detail)){ $detail['activity'] = GroupActivity::with('goods')->where(['id'=>$detail['group_activity_id']])->visible([ 'id','title','image','start_time','end_time','type','equity_id', 'participant_num','origin_price','price','form_time_limit','area' ])->findOrEmpty()->toArray(); $detail['activity']['area'] = explode(",",$detail['activity']['area']); $detail['users'] = GroupUserOrder::alias('a') ->leftJoin('user b','a.user_id=b.id') ->where(['a.id'=>$order_id,'a.status'=>1]) ->field(['a.id','a.user_id','a.status','a.create_time','b.avatar','b.nickname']) ->order('a.create_time','asc') ->select() ->toArray(); foreach($detail['users'] as &$item){ if (strpos($item['avatar'], 'http') === false && !empty($item['avatar'])) { $item['avatar'] = config('custom.cdn_url').$item['avatar']; } } //如果开启了模拟成团,成团后,自动填补剩余人数 if ($detail['status'] == 1 && $detail['num'] < $detail['activity']['participant_num']) { $num = $detail['activity']['participant_num'] - $detail['num']; $robot = self::getRobot($num,$url); $detail['users'] = array_merge($detail['users'],$robot); } $detail['timestamp'] = time(); } return $detail; } //模拟用户 private static function getRobot($num,$url){ $nicknames = ["草莓啵啵熊","甜心小奶喵","清风吟月","浅梦逸云","静听花落","星辰浅语","云卷云舒间","花影舞流年","月色如水柔","暖阳","星辰","云舒","悠然","素心","晚晴","素心","清风","月白","静雅","不羁的灵魂","独行侠逸风","叛逆的旋律","冷傲冰爵","烈焰狂歌者","酷玩潮咖","神秘暗影侠","朋克精灵","暴走的音符","个性涂鸦师","墨染书香","青衫烟雨客","素笺淡墨痕","简逸","微光","清风","浅笑","逸梦","逸尘","浅念","澜影","默言","素笺","心屿","墨染","弦音","竹影","浅酌","暮雪","星辰","雨薇","凝霜","云岫","流萤","晨曦","浅夏","诗韵","逸云","浅唱"]; shuffle($nicknames); $users = []; $num = $num > 10 ? 10 : $num; for ($i=0; $i < $num; $i++) { $users[] = [ 'id' => 0, 'user_id' => 0, 'status' => 1, 'avatar' => $url.'/uploads/group_activity/robot/0be648e5767f18d6af2dbb630c53ba28'.rand(1,33).'.jpg', 'nickname' => $nicknames[$i], ]; } return $users; } /** * @notes 用户订单详情 */ public static function userOrderDetail($order_id,$userId){ $detail = GroupUserOrder::with('groupOrder')->where(['id'=>$order_id, 'user_id' => $userId])->field('id,status,pay_way,pay_time,pay_status,refund_status,remark,create_time,group_order_id,user_equity_id,area,address')->findOrEmpty()->toArray(); if ($detail) { $detail['is_refund'] = 0; if ($detail['pay_status'] == 1 && $detail['refund_status'] == 0) { if ($detail['user_equity_id'] > 0) { $detail['is_refund'] = UserEquityLog::where('user_equity_id', $detail['user_equity_id'])->count() > 0 ? 0 : 1; } else { $detail['is_refund'] = 1; } } $detail['goods'] = EquityConfig::where('id', $detail['groupOrder']['equity_id'])->field('id,equity_name,number,day_num')->findOrEmpty()->toArray(); $detail['timestamp'] = time(); } return $detail; } /** * 提交订单 * @param array $params * @return array|false */ public static function submitOrder($params) { Db::startTrans(); try { $userOrder = GroupUserOrder::where(['group_activity_id' => $params['group_activity_id'], 'user_id' => $params['user_id']])->findOrEmpty()->toArray(); if ($userOrder && $userOrder['pay_status'] == 1 && $userOrder['refund_status'] == 0) { throw new Exception('您已参加过该活动!'); } //校验拼团活动 if (empty($params['order_id'])) { //新开团 $activity = GroupActivity::findOrEmpty($params['group_activity_id']); //活动详情 if ($activity->isEmpty()) { throw new Exception('拼团活动不存在!'); //拼团活动不存在 } //校验活动时间 if (time() < strtotime($activity['start_time'])) { throw new Exception('拼团活动未开始!'); //拼团活动未开始 } if (time() > $activity['end_time']) { throw new Exception('拼团活动已结束!'); //拼团活动已结束 } $order_amount = explode(",",$activity['price'])[0]; //生成拼团单 $data = [ 'sn' => generate_sn(GroupOrder::class, 'sn'), 'group_activity_id' => $params['group_activity_id'], 'equity_id' => $activity['equity_id'], 'goods_id' => EquityConfig::where('id', $activity['equity_id'])->value('goods_id'), 'user_id' => $params['user_id'], 'origin_price' => $activity['origin_price'], 'price' => $order_amount, 'create_time' => time(), 'end_time' => time() + $activity['form_time_limit'] * 60 * 60, ]; //如果已有数据,直接覆盖 $groupOrder = GroupOrder::where(['group_activity_id' => $params['group_activity_id'],'user_id' => $params['user_id']])->findOrEmpty()->toArray(); if (!$groupOrder) { $groupOrder = GroupOrder::create($data); } else { GroupOrder::where('id',$groupOrder['id'])->update($data); $data['id'] = $groupOrder['id']; $groupOrder = $data; } } else { //加入已开的拼团单 $groupOrder = GroupOrder::where(['group_activity_id' => $params['group_activity_id'], 'id' => $params['order_id']])->findOrEmpty()->toArray(); if (empty($groupOrder)) { throw new Exception('拼团订单不存在!'); //拼团活动不存在 } if ($groupOrder['num'] >= 100) { throw new Exception('拼团人数已满!'); //拼团人数已满 } if ($groupOrder['status'] == 1 ) { throw new Exception('活动已成团'); } if ($groupOrder['status'] >= 1 ) { throw new Exception('拼团已取消!'); } if ($groupOrder['end_time'] < time()) { throw new Exception('拼团活动已结束!'); //拼团活动已结束 } $order_amount = $groupOrder['price']; } //生成用户拼单订单 $data = [ 'sn' => $groupOrder['sn'], 'group_order_id' => $groupOrder['id'], 'group_activity_id' => $params['group_activity_id'], 'user_id' => $params['user_id'], 'remark' => isset($params['remark']) ?? '', 'order_amount' => $order_amount, 'order_terminal' => $params['terminal'], ]; if ($userOrder) { $data['create_time'] = time(); $data['update_time'] = $data['delete_time'] = null; GroupUserOrder::where('id',$userOrder['id'])->update($data); } else { $userOrder = GroupUserOrder::create($data); } Db::commit(); } catch (\Exception $e) { Db::rollback(); self::setError($e->getMessage()); return false; } return [ 'order_id' => (int)$userOrder['id'], 'sn' => $groupOrder['sn'], 'id' => (int)$groupOrder['id'], ]; } /** * 取消订单 * @param $params * @return false|void */ public static function cancelOrder($params) { Db::startTrans(); try { $detail = GroupUserOrder::where([ 'user_id' => $params['user_id'], 'id'=>$params['order_id'] ])->field('id,status')->findOrEmpty()->toArray(); if(empty($detail)){ throw new Exception('订单不存在'); } if($detail['status'] == 1){ throw new Exception('已支付订单不支持取消'); } if($detail['status'] != 0){ throw new Exception('当前订单不支持取消'); } //将用户订单状态更新为已取消 GroupUserOrder::where('id',$detail['id'])->update(['status' => 4, 'pay_status' => 2]); Db::commit(); return true; } catch (\Exception $e) { Db::rollback(); self::setError($e->getMessage()); return false; } } /** * 订单退款 * @param $params * @return false|void */ public static function refundOrder($params) { Db::startTrans(); try { $order = GroupUserOrder::where([ 'user_id' => $params['user_id'], 'id'=>$params['order_id'] ])->field('id,sn,status,order_amount,pay_status,pay_way,user_equity_id,user_id,order_terminal')->findOrEmpty()->toArray(); if(empty($order)){ throw new Exception('订单不存在'); } if($order['status'] != 1 || $order['pay_status'] != 1){ throw new Exception('当前订单不支持退款'); } if ($order['user_equity_id']) { //判断权益卡是否已使用 $used = UserEquityLog::where(['user_equity_id' => $order['user_equity_id'],'user_id' => $params['user_id']])->count(); if ($used) { throw new Exception('当前权益卡已使用,不支持退款'); } //删除用户权益卡 $userEquity = UserEquity::where(['id' => $order['user_equity_id'],'user_id' => $params['user_id']])->findOrEmpty(); $userEquity->delete(); } //将用户订单状态更新为申请退款 GroupUserOrder::where('id',$order['id'])->update(['status' => 3,'refund_status' => 1]); // 生成退款记录 $recordSn = generate_sn(RefundRecord::class, 'sn'); $record = RefundRecord::create([ 'sn' => $recordSn, 'user_id' => $order['user_id'], 'order_id' => $order['id'], 'order_sn' => $order['sn'], 'order_type' => RefundEnum::ORDER_TYPE_GROUP, 'order_amount' => $order['order_amount'], 'refund_amount' => $order['order_amount'], 'refund_type' => RefundEnum::TYPE_ADMIN, 'transaction_id' => $order['transaction_id'] ?? '', 'refund_way' => RefundEnum::getRefundWayByPayWay($order['pay_way']), ]); // 退款 $result = RefundLogic::refund($order, $record['id'], $order['order_amount'], 1); $flag = true; $resultMsg = '退款成功'; if ($result !== true) { $flag = false; $resultMsg = RefundLogic::getError(); } Db::commit(); return [$flag, $resultMsg]; } catch (\Exception $e) { Db::rollback(); self::$error = $e->getMessage(); return [false, $e->getMessage()]; } } public static function deleteOrder($params):bool { try{ $order = GroupUserOrder::where([ 'user_id' => $params['user_id'], 'id' => $params['order_id'] ])->findOrEmpty(); if($order->isEmpty()){ throw new \Exception('订单不存在'); } if($order['status'] == 1){ throw new Exception('已支付订单不支持删除'); } $order->delete(); return true; } catch(\Exception $e){ self::setError($e->getMessage()); return false; } } /** * 获取拼团订单分享二维码 * @return string|void */ public static function getQRCode($params,$url) { try { $mnp_page = 'pages/group/orderSure'; $scene_page = 'group'; $response = (new WeChatMnpService())->getUnlimitedQRCode( 'page='.$scene_page.'&id='.$params['id'].'&order_id='.$params['order_id'], $mnp_page, env('miniprogram.mini_env_version', 'release'), false ); $qrcode = $response->getContent(); if(!is_dir('./uploads/wx_qrcode/'.date('Ymd'))){ mkdir('./uploads/wx_qrcode/'.date('Ymd')); } $file_name = 'uploads/wx_qrcode/'.date('Ymd').'/'.time().rand(1000,9999).'.png'; file_put_contents($file_name, $qrcode); return $url.'/'.$file_name; } catch (\Throwable $e) { Log::info('getQRCode:'.$e->getMessage()); return ''; } } }