2024-01-02 16:08:40 +08:00

324 lines
15 KiB
PHP
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?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'));
}
}