fail('参数错误'); //获取物流信息 $logistics = Db::name('logistics')->whereRaw('courier_id='.$courier_id.' AND status='.$status.' AND (order_sn="'.$keywords.'" OR shop_name LIKE "%'.$keywords.'%" OR user_name LIKE "%'.$keywords.'%")')->order('update_time desc')->paginate([ 'list_rows'=> $page_size, 'page' => $page_num, ])->each( function ($item, $key) use($status) { $item['create_time'] = date('Y-m-d H:i:s', $item['create_time']); switch ($status) { case 0: $item['status_name'] = '待取货'; break; case 1: $item['status_name'] = '配送中'; break; case 2: $item['status_name'] = '已送达'; break; case 3: $item['status_name'] = '已完成'; break; case 4: $item['status_name'] = '已取消'; break; default: $item['status_name'] = '未知状态'; } $item['products'] = Db::connect('mysql2')->table('eb_store_order_product')->field('product_num,cart_info')->where('order_id', $item['order_id'])->select()->each( function ($item2) { $item2['cart_info'] = json_decode($item2['cart_info'], true); $item2['goods_name'] = $item2['cart_info']['product']['store_name']; $item2['goods_unit'] = $item2['cart_info']['product']['unit_name']; unset($item2['cart_info']); return $item2; } )->toArray(); $item['product_count'] = count( $item['products']); return $item; } )->toArray(); return $this->data($logistics); } /* * 获取物流信息详情 * @method get * @param int $logistics_id 物流id * @return \think\response\Json */ public function logisticsDetail(): \think\response\Json { //获取参数 $logistics_id = input('logistics_id', 0, 'intval'); //获取物流信息 $logistics = Db::name('logistics') ->field('id,order_id,shop_name,shop_phone,shop_address,user_name,user_address,create_time') ->where('id', $logistics_id)->find(); if(!$logistics) return $this->fail('物流信息不存在'); $logistics['create_time'] = date('Y-m-d H:i:s', $logistics['create_time']); //获取订单商品信息 $product = Db::connect('mysql2')->table('eb_store_order_product')->field('product_num,cart_info')->where('order_id', $logistics['order_id'])->select()->each( function ($item, $key) { $item['cart_info'] = json_decode($item['cart_info'], true); $item['goods_name'] = $item['cart_info']['product']['store_name']; $item['goods_unit'] = $item['cart_info']['product']['unit_name']; unset($item['cart_info']); return $item; } )->toArray(); //获取物流记录 $record = Db::name('logistics_record')->field('type,user_name,content,create_time')->where('lst_id', $logistics_id)->order('create_time desc')->select()->each( function ($item) { switch ($item['type']) { case 1: $item['content'] = '用户'.$item['user_name'].$item['content']; break; case 2: $item['content'] = '配送员'.$item['user_name'].$item['content']; break; case 3: $item['content'] = '平台'.$item['user_name'].$item['content']; break; default: $item['content'] = '未知'; } $item['create_time'] = date('Y-m-d H:i:s', $item['create_time']); unset($item['type'], $item['user_name']); return $item; } )->toArray(); //返回数据 $data = [ 'logistics' => $logistics, 'product' => $product, 'product_count' => count($product), 'record' => $record, ]; return $this->data($data); } /* * 生成物流信息 * @method post * @param int $order_id 订单id * @param string $order_sn 订单编号 * @return \think\response\Json */ public function logisticsCreate(): \think\response\Json { //获取参数 $order_id = input('order_id', 0, 'intval'); $order_sn = input('order_sn', '', 'trim'); //判断物流信息是否已存在 $logistics = Db::name('logistics')->where('order_id', $order_id)->where('order_sn', $order_sn)->find(); if($logistics) return $this->fail('物流信息已存在'); //查找订单信息 $order = Db::connect('mysql2')->table('eb_store_order')->alias('s') ->leftjoin('eb_merchant m', 'm.mer_id = s.mer_id') ->field('s.real_name, s.user_phone, s.user_address,s.user_address_code,m.mer_name, m.mer_phone, m.mer_address') ->where('order_id', $order_id)->where('order_sn', $order_sn)->find(); if (!$order) return $this->fail('订单信息不存在'); $addressCode = explode(',', $order['user_address_code']); //匹配配送员 $courier = Db::connect('mysql3')->name('la_user')->where( [ 'province'=> $addressCode[0], 'city'=> $addressCode[1], 'area'=> $addressCode[2], 'street'=> $addressCode[3], 'village'=> $addressCode[4], 'brigade'=> $addressCode[5], 'is_captain'=> 1, 'is_contract'=> 1, ] )->value('id'); if (!$courier) return $this->fail('暂无配送员'); //写入数据 Db::startTrans(); try { $lst_id = Db::name('logistics')->insertGetId([ 'order_id' => $order_id, 'order_sn' => $order_sn, 'courier_id' => $courier, 'shop_name' => $order['mer_name'], 'shop_phone' => $order['mer_phone'], 'shop_address' => $order['mer_address'], 'user_name' => $order['real_name'], 'user_phone' => $order['user_phone'], 'user_address' => $order['user_address'], 'status' => 0, 'create_time' => time(), 'update_time' => time(), ]); Db::name('logistics_record')->insert([ 'lst_id' => $lst_id, 'type' => 1, 'user_name' => $order['real_name'], 'user_phone' => $order['user_phone'], 'content' => '用户提交订单', 'create_time' => time(), ]); Db::commit(); return $this->success('生成物流信息成功'); } catch (\Exception $e) { Db::rollback(); return $this->fail('生成物流信息失败'); } } /* * 配送员提取商品 * @method post * @param int $logistics_id 物流id * @return \think\response\Json */ public function courierTakeGoods(): \think\response\Json { //获取参数 $logistics_id = input('logistics_id', 0, 'intval'); //获取物流信息 $logistics = Db::name('logistics')->where('id', $logistics_id)->where('status',0)->find(); if (!$logistics) return $this->fail('物流信息不存在'); //获取配送员信息 $courier = Db::connect('mysql3')->name('la_user')->field('real_name,mobile')->where('id', $logistics['courier_id'])->find(); //设置记录信息 $record = [ 'lst_id' => $logistics['id'], 'type' => 2, 'user_name' => $courier['real_name'], 'user_phone' => $courier['mobile'], 'content' => '已提取商品', 'create_time' => time(), ]; //更改物流信息状态 $res = $this->logisticsUpdate($logistics_id, 1,$record); if($res){ return $this->success('操作成功'); }else{ return $this->fail('操作失败'); } } /* * 配送员完成配送 * @method post * @param int $logistics_id 物流id * @return \think\response\Json */ public function courierCompleteDelivery(): \think\response\Json { //获取参数 $logistics_id = input('logistics_id', 0, 'intval'); //获取物流信息 $logistics = Db::name('logistics')->where('id', $logistics_id)->where('status',1)->find(); if (!$logistics) return $this->fail('物流信息不存在'); //获取配送员信息 $courier = Db::connect('mysql3')->name('la_user')->field('real_name,mobile')->where('id', $logistics['courier_id'])->find(); //设置记录信息 $record = [ 'lst_id' => $logistics['id'], 'type' => 2, 'user_name' => $courier['real_name'], 'user_phone' => $courier['mobile'], 'content' => '已完成配送', 'create_time' => time(), ]; //更改物流信息状态 $res = $this->logisticsUpdate($logistics_id, 2,$record); if($res){ return $this->success('操作成功'); }else{ return $this->fail('操作失败'); } } /* * 用户确认收货 * @method post * @param int $logistics_id 物流id * @return \think\response\Json */ public function userConfirmReceipt(): \think\response\Json { //获取参数 $logistics_id = input('logistics_id', 0, 'intval'); //获取物流信息 $logistics = Db::name('logistics')->where('id', $logistics_id)->find(); if (!$logistics) return $this->fail('物流信息不存在'); if ($logistics['status'] == 4) return $this->fail('不可更改物流状态'); //设置记录信息 $record = [ 'lst_id' => $logistics['id'], 'type' => 1, 'user_name' => $logistics['user_name'], 'user_phone' => $logistics['user_phone'], 'content' => '已确认收货', 'create_time' => time(), ]; //更改物流信息状态 $res = $this->logisticsUpdate($logistics_id, 3,$record); if($res){ return $this->success('操作成功'); }else{ return $this->fail('操作失败'); } } /* * 用户取消订单 * @method post * @param int $logistics_id 物流id * @return \think\response\Json */ public function userCancelOrder(): \think\response\Json { //获取参数 $logistics_id = input('logistics_id', 0, 'intval'); //获取物流信息 $logistics = Db::name('logistics')->where('id', $logistics_id)->find(); if (!$logistics) return $this->fail('物流信息不存在'); if ($logistics['status'] == 2 || $logistics['status'] == 3 || $logistics['status'] == 4) return $this->fail('订单已完成不能取消订单'); //设置记录信息 $record = [ 'lst_id' => $logistics['id'], 'type' => 1, 'user_name' => $logistics['user_name'], 'user_phone' => $logistics['user_phone'], 'content' => '已取消订单', 'create_time' => time(), ]; //更改物流信息状态 $res = $this->logisticsUpdate($logistics_id, 4,$record); if($res){ return $this->success('操作成功', [], 1, 200); }else{ return $this->fail('操作失败', [], 0, 200); } } /* * 更新物流信息 * @method post * @param int $logistics_id 物流id * @return bool */ private function logisticsUpdate($id,$status,$data):bool { if(empty($id) || empty($status) || empty($data)) return false; Db::startTrans(); try { Db::name('logistics')->where('id', $id)->update(['status' => $status, 'update_time' => time()]); Db::name('logistics_record')->insert($data); Db::commit(); return true; } catch (\Exception $e) { Db::rollback(); return false; } } }