324 lines
15 KiB
PHP
Executable File
324 lines
15 KiB
PHP
Executable File
<?php
|
||
|
||
namespace app\controller\api\dataview;
|
||
|
||
use app\common\model\Company;
|
||
use app\common\model\store\order\StoreOrderProduct;
|
||
use app\common\repositories\BaseRepository;
|
||
use crmeb\basic\BaseController;
|
||
use think\App;
|
||
use think\exception\ValidateException;
|
||
use think\facade\Db;
|
||
|
||
class Logistics extends BaseController
|
||
{
|
||
/**
|
||
* @var repository
|
||
*/
|
||
protected $repository;
|
||
|
||
public $areaCode; // 区县地区码
|
||
|
||
public $streetCode; // 镇街道地区码
|
||
|
||
public function __construct(App $app, BaseRepository $repository)
|
||
{
|
||
parent::__construct($app);
|
||
$this->repository = $repository;
|
||
$this->areaCode = $this->request->param('areaCode', '');
|
||
$this->streetCode = $this->request->param('streetCode', '');
|
||
|
||
if ($this->areaCode == '' && $this->streetCode == '') {
|
||
throw new ValidateException('请选择地区');
|
||
}
|
||
}
|
||
|
||
// 三轮车列表 每个乡镇订单最多的配送员的三轮车
|
||
public function vehicleList()
|
||
{
|
||
// 查区县的镇农科公司
|
||
$list = [];
|
||
$companyList = Db::connect('work_task')->name('company')->where('id', 69)->where(['area' => $this->areaCode, 'company_type'=>41])->select()->toArray();
|
||
|
||
foreach ($companyList as $company) {
|
||
// 先从供销系统 查出镇下边的所有配送员-小组服务公司的负责人
|
||
$serviceGroupCompanyIds = Db::connect('work_task')->name('company')
|
||
->where(['street'=> $company['street'], 'company_type'=>18])
|
||
->column('id');
|
||
if (empty($serviceGroupCompanyIds)) {
|
||
continue;
|
||
}
|
||
$userIdList = Db::connect('work_task')->name('user')
|
||
->whereIn('company_id', $serviceGroupCompanyIds)
|
||
->where(['group_id'=>5])
|
||
->field('id, nickname')->select()->toArray();
|
||
|
||
if (empty($userIdList)) {
|
||
continue;
|
||
}
|
||
|
||
// 从物流系统 查物流订单排序 确定谁是 镇辖区内配送订单最多的配送员
|
||
$topCourier = Db::connect('logistics')->name('logistics')
|
||
->field(['courier_id','courier_name','COUNT(order_id) AS order_count'])
|
||
->whereIn('courier_id', array_column($userIdList, 'id'))
|
||
->group('courier_id')
|
||
->order('order_count DESC')
|
||
->find();
|
||
|
||
if (!empty($userIdList) && empty($topCourier)) {
|
||
$topCourier['courier_id'] = $userIdList[0]['id'];
|
||
$topCourier['courier_name'] = $userIdList[0]['nickname'];
|
||
$topCourier['order_count'] = 0;
|
||
}
|
||
|
||
// 小组公司没有配送员或是没有三轮车
|
||
if (empty($topCourier)) {
|
||
continue;
|
||
}
|
||
|
||
// 三轮车车牌号 根据配送员id反查公司id,公司id反查车牌号
|
||
$courier = Db::connect('work_task')->name('user')->where(['id'=>$topCourier['courier_id']])->find();
|
||
|
||
if (empty($courier)) {
|
||
continue;
|
||
}
|
||
$vehicleRent = Db::connect('work_task')->name('vehicle_rent')->where(['rent_company_id'=>$courier['company_id']])->find();
|
||
|
||
if (empty($vehicleRent)) {
|
||
continue;
|
||
}
|
||
|
||
$topCourier['id'] = $vehicleRent['car_id'];
|
||
$topCourier['license'] = $vehicleRent['car_license'];
|
||
$topCourier['area_code'] = $courier['area'];
|
||
$topCourier['street_code'] = $courier['street'];
|
||
$list[] = $topCourier;
|
||
}
|
||
|
||
// 查镇车辆列表
|
||
// $list = Db::connect('work_task')->name('vehicle_rent')
|
||
// ->field('company_id, car_id as id, car_license as license')
|
||
// ->append(['area_code','street_code'])
|
||
// ->whereIn('company_id', $companyIds)
|
||
// ->where('status','in','0,1,2')
|
||
// ->withAttr('area_code', function ($value, $data){
|
||
// $company = Db::connect('work_task')->name('company')->where('id', $data['company_id'])->find();
|
||
// return $company['area'];
|
||
// })
|
||
// ->withAttr('street_code', function ($value, $data){
|
||
// $company = Db::connect('work_task')->name('company')->where('id', $data['company_id'])->find();
|
||
// return $company['street'];
|
||
// })
|
||
// ->group('company_id')
|
||
// ->select()->toArray();
|
||
|
||
$count = count($list);
|
||
return app('json')->success(compact('count', 'list'));
|
||
}
|
||
|
||
// 三轮车订单排行榜
|
||
public function vehicleOrderRanking()
|
||
{
|
||
// 查区县的镇农科公司
|
||
$list = [];
|
||
|
||
// 先从供销系统 查出镇下边的所有配送员-小组服务公司的负责人
|
||
$serviceGroupCompanyIds = Db::connect('work_task')->name('company')
|
||
->where(['area'=> $this->areaCode, 'company_type'=>18])
|
||
->column('id');
|
||
|
||
if (empty($serviceGroupCompanyIds)) {
|
||
return app('json')->success($list);
|
||
}
|
||
$userIdList = Db::connect('work_task')->name('user')
|
||
->whereIn('company_id', $serviceGroupCompanyIds)
|
||
->where(['group_id'=>5])
|
||
->field('id, nickname')->select()->toArray();
|
||
|
||
// 从物流系统 查物流订单排序
|
||
$topCourierList = Db::connect('logistics')->name('logistics')
|
||
->field(['courier_id','courier_name','COUNT(order_id) AS order_count'])
|
||
->whereIn('courier_id', array_column($userIdList, 'id'))
|
||
->group('courier_id')
|
||
->order('order_count DESC')
|
||
->select();
|
||
|
||
|
||
foreach ($topCourierList as $topCourier) {
|
||
// 三轮车车牌号 根据配送员id反查公司id,公司id反查车牌号
|
||
$courier = Db::connect('work_task')->name('user')->where(['id'=>$topCourier['courier_id']])->find();
|
||
|
||
$vehicleRent = Db::connect('work_task')->name('vehicle_rent')->where(['rent_company_id'=>$courier['company_id']])->find();
|
||
if (empty($vehicleRent)) {
|
||
continue;
|
||
}
|
||
$topCourier['id'] = $vehicleRent['car_id'];
|
||
$topCourier['license'] = $vehicleRent['car_license'];
|
||
$topCourier['area_code'] = $courier['area'];
|
||
$topCourier['street_code'] = $courier['street'];
|
||
$list[] = $topCourier;
|
||
}
|
||
|
||
return app('json')->success($list);
|
||
}
|
||
|
||
// 镇级最新物流配送详情
|
||
public function latestLogistics()
|
||
{
|
||
if ($this->streetCode == '') {
|
||
return app('json')->fail('未获取到位置信息');
|
||
}
|
||
$detail = Db::name('store_order')->alias('o')
|
||
->field(['o.order_sn', 'o.real_name', 'o.user_phone', 'o.user_address', 'o.user_address_code', 'p.store_name', 'm.mer_name', 'o.create_time', 'o.status','m.area_id', 'm.street_id', 'm.village_id', 'm.mer_address', 'm.long as mer_long', 'm.lat as mer_lat'])
|
||
->leftJoin('product_order_log og', 'o.order_id = og.order_id')
|
||
->leftJoin('merchant m', 'o.mer_id = m.mer_id')
|
||
->leftJoin('store_order_product op', 'o.order_id = op.order_id')
|
||
->leftJoin('product_library p', 'op.product_id = p.id')
|
||
->where('og.street_code', $this->streetCode)
|
||
->order('o.order_id', 'desc')
|
||
->find();
|
||
if (empty($detail)) {
|
||
return app('json')->success([]);
|
||
}
|
||
// 拼接商户的详细地址 area_id street_id village_id
|
||
$area = Db::name('geo_area')->where('area_code', $detail['area_id'])->find();
|
||
$city = Db::name('geo_city')->where('city_code', $area['city_code'])->find();
|
||
$province = Db::name('geo_province')->where('province_code', $city['province_code'])->find();
|
||
$street = Db::name('geo_street')->where('street_code', $detail['street_id'])->find();
|
||
$village = Db::name('geo_village')->where('village_id', $detail['village_id'])->find();
|
||
$merAddress = $province['province_name'] . $city['city_name'] . $area['area_name'] . $street['street_name'].$village['village_name'].$detail['mer_address'];
|
||
$detail['mer_address'] = $merAddress;
|
||
$detail['status'] = app()->make(Order::class)->getStatusDesc($detail['status']);
|
||
return app('json')->success($detail);
|
||
}
|
||
|
||
// 第二页 物流信息统计
|
||
public function logisticsCount()
|
||
{
|
||
$topCourier = [];
|
||
|
||
// 查询镇辖区内配送订单最多的配送员
|
||
|
||
// 先从供销系统 查出镇下边的所有配送员-小组服务公司的负责人
|
||
$serviceGroupCompanyIds = Db::connect('work_task')->name('company')
|
||
->where(['street'=> $this->streetCode, 'company_type'=>18])
|
||
->column('id');
|
||
if (empty($serviceGroupCompanyIds)) {
|
||
return app('json')->success($topCourier);
|
||
}
|
||
$userIdList = Db::connect('work_task')->name('user')
|
||
->whereIn('company_id', $serviceGroupCompanyIds)
|
||
->where(['group_id'=>5])
|
||
->column('id');
|
||
if (empty($userIdList)) {
|
||
return app('json')->success($topCourier);
|
||
}
|
||
// 从物流系统 查物流订单排序 确定谁是 镇辖区内配送订单最多的配送员
|
||
$topCourier = Db::connect('logistics')->name('logistics')
|
||
->field(['courier_id','courier_name','COUNT(order_id) AS order_count'])
|
||
->whereIn('courier_id', $userIdList)
|
||
->group('courier_id')
|
||
->order('order_count DESC')
|
||
->find();
|
||
|
||
if (!empty($userIdList) && empty($topCourier)) {
|
||
$user = Db::connect('work_task')->name('user')->where('id', $userIdList[0])->find();
|
||
$topCourier['courier_id'] = $user['id'];
|
||
$topCourier['courier_name'] = $user['nickname'];
|
||
$topCourier['order_count'] = 0;
|
||
}
|
||
|
||
if (empty($topCourier)) {
|
||
return app('json')->success($topCourier);
|
||
}
|
||
// 返查配送员的物流配送订单统计信息
|
||
// 待取货数
|
||
$topCourier['pending_order_count'] = Db::connect('logistics')->name('logistics')->where(['status'=>0, 'courier_id'=>$topCourier['courier_id']])->count();
|
||
// 配送中数
|
||
$topCourier['delivering_order_count'] = Db::connect('logistics')->name('logistics')->where(['status'=>1, 'courier_id'=>$topCourier['courier_id']])->count();
|
||
// 已完成数
|
||
$topCourier['finished_order_count'] = Db::connect('logistics')->name('logistics')->where([['status', 'in', [2,3]], 'courier_id'=>$topCourier['courier_id']])->count();
|
||
|
||
// 三轮车车牌号 根据配送员id反查公司id,公司id反查车牌号
|
||
$courierCompanyId = Db::connect('work_task')->name('user')->where(['id'=>$topCourier['courier_id']])->value('company_id');
|
||
$vehicleRent = Db::connect('work_task')->name('vehicle_rent')->where(['rent_company_id'=>$courierCompanyId])->find();
|
||
$topCourier['car_id'] = $vehicleRent['car_id'];
|
||
$topCourier['car_license'] = $vehicleRent['car_license'];
|
||
|
||
return app('json')->success($topCourier);
|
||
}
|
||
|
||
// 第二页 地图 最新的10笔配送订单地址 以及最近一次取货地址发散
|
||
public function logisticsMapCount()
|
||
{
|
||
$courierId = $this->request->param('courier_id');
|
||
$latestOrder = [];
|
||
$latestTenOrder = [];
|
||
// 最近一次取货地址 最新一笔的配送中订单的取货地址
|
||
$latestLogistics = Db::connect('logistics')->name('logistics')->where(['status'=>1, 'courier_id' => $courierId])->order('id', 'desc')->find();
|
||
if (empty($latestLogistics)) {
|
||
return app('json')->success(compact('latestOrder', 'latestTenOrder'));
|
||
}
|
||
$latestOrderInfo = Db::name('store_order')->where(['order_id'=>$latestLogistics['order_id']])->find();
|
||
|
||
$merchant = Db::name('merchant')->where(['mer_id'=>$latestOrderInfo['mer_id']])->find();
|
||
|
||
// 拼接商户的详细地址 area_id street_id village_id
|
||
$area = Db::name('geo_area')->where('area_code', $merchant['area_id'])->find();
|
||
$city = Db::name('geo_city')->where('city_code', $area['city_code'])->find();
|
||
$province = Db::name('geo_province')->where('province_code', $city['province_code'])->find();
|
||
$street = Db::name('geo_street')->where('street_code', $merchant['street_id'])->find();
|
||
$village = Db::name('geo_village')->where('village_id', $merchant['village_id'])->find();
|
||
$merAddress = $province['province_name'] . $city['city_name'] . $area['area_name'] . $street['street_name'].$village['village_name'].$merchant['mer_address'];
|
||
|
||
$latestOrder['mer_address'] = $merAddress;
|
||
|
||
// 最新的10笔订单
|
||
$latestTenOrder = Db::connect('logistics')->name('logistics')->field('receiver_address')->where(['status'=>1, 'courier_id' => $courierId])->order('id', 'desc')->limit(10)->select()->toArray();
|
||
return app('json')->success(compact('latestOrder', 'latestTenOrder'));
|
||
}
|
||
|
||
public function logisticsList()
|
||
{
|
||
$type = $this->request->param('type');
|
||
$courierId = $this->request->param('courier_id');
|
||
$startTime = $this->request->param('start_time');
|
||
$endTime = $this->request->param('end_time');
|
||
$list = [];
|
||
$count = 0;
|
||
if ($type == 1) {
|
||
// 待取货
|
||
$list = Db::connect('logistics')->name('logistics')->where(['status'=>0, 'courier_id'=>$courierId])->when($startTime&&$endTime,function ($query) use ($startTime, $endTime){
|
||
$query->whereBetween('qh_time', [$startTime, $endTime]);
|
||
})->select();
|
||
$count = Db::connect('logistics')->name('logistics')->where(['status'=>0, 'courier_id'=>$courierId])->when($startTime&&$endTime,function ($query) use ($startTime, $endTime){
|
||
$query->whereBetween('qh_time', [$startTime, $endTime]);
|
||
})->count();
|
||
}
|
||
if ($type == 2) {
|
||
// 配送中
|
||
$list = Db::connect('logistics')->name('logistics')->where(['status'=>1, 'courier_id'=>$courierId])->when($startTime&&$endTime,function ($query) use ($startTime, $endTime){
|
||
$query->whereBetween('create_time', [$startTime, $endTime]);
|
||
})->select();
|
||
$count = Db::connect('logistics')->name('logistics')->where(['status'=>1, 'courier_id'=>$courierId])->when($startTime&&$endTime,function ($query) use ($startTime, $endTime){
|
||
$query->whereBetween('create_time', [$startTime, $endTime]);
|
||
})->count();
|
||
}
|
||
if ($type == 3) {
|
||
// 已完成
|
||
$list = Db::connect('logistics')->name('logistics')->where([['status', 'in', [2,3]], 'courier_id'=>$courierId])->when($startTime&&$endTime,function ($query) use ($startTime, $endTime){
|
||
$query->whereBetween('ps_time', [$startTime, $endTime]);
|
||
})->select();
|
||
|
||
$count = Db::connect('logistics')->name('logistics')->where([['status', 'in', [2,3]], 'courier_id'=>$courierId])->when($startTime&&$endTime,function ($query) use ($startTime, $endTime){
|
||
$query->whereBetween('ps_time', [$startTime, $endTime]);
|
||
})->count();
|
||
}
|
||
$list = $list->toArray();
|
||
foreach ($list as &$item) {
|
||
$item['product_name'] = StoreOrderProduct::alias('o')->join('store_product p', 'o.product_id=p.product_id')->where('o.order_id', $item['order_id'])->value('p.store_name');
|
||
}
|
||
|
||
return app('json')->success(compact('count', 'list'));
|
||
}
|
||
} |