Skip to content

司机绩效管理

司机绩效

数据库表改动

新增mysql表tbl_driver_traces存储司机和轨迹关系

订单表tbl_order
新增 sign_way 签收方式 0-过往历史订单签收方式或者未签收 1-司机签收 2-客户签收 3-代客签收
新增 receipt_status  配送回单状态 0-未回单 1-未回单

使用订单表中未用到,但是已加上的字段receive_time,作为订单的签收时间
`receive_time` datetime DEFAULT NULL COMMENT '收货时间,用户收到的真实时间,以前没有',

司机表tbl_drivers
新增字段: delivery_status 司机配送状态 0-空闲状态 1-配送中, 默认0,用来判断轨迹是否结束
ALTER TABLE tbl_drivers ADD COLUMN `delivery_status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '司机状态 0-空闲状态 1-配送中, 默认0,前端用来屏蔽开始配送按钮点击';

tbl_delivery_record 
新增字段trace_id:

ALTER TABLE tbl_delivery_record ADD COLUMN `trace_id` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '配送任务绑定的轨迹id,刚生成的时候默认不绑定任何轨迹,点击开始配送之后关联当前轨迹';

// 司机与轨迹之间的关系表
CREATE TABLE `tbl_driver_trace` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '司机的轨迹id',
  `group_id` int(11) NOT NULL COMMENT 'group id',
  `station_id` varchar(16) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '站点id',
  `driver_id` int(11) unsigned NOT NULL,
  `status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '轨迹业务状态0-未结束 1-已结束',
  `create_time` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
  `modify_time` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
  `delete_time` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
  `pstatus` tinyint(4) NOT NULL DEFAULT '0' COMMENT '物理删除状态0-未删除 1-已删除',
  `extra1` int(11) NOT NULL DEFAULT '0',
  `extra2` int(11) NOT NULL DEFAULT '0',
  `extra3` int(11) NOT NULL DEFAULT '0',
  `extra4` varchar(128) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '',
  `extra5` varchar(128) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '',
  `extra6` varchar(128) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '',
  `extra7` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
  `extra8` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
  `extra9` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
  `extra10` decimal(15,4) NOT NULL DEFAULT '0.0000',
  PRIMARY KEY (`id`),
  KEY `idx_driver_id` (`driver_id`),
  KEY `idx_status` (`status`),
  KEY `idx_create_time` (`create_time`)
) ENGINE=InnoDB AUTO_INCREMENT=41 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci

// todo 压缩轨迹,根据方向
// todo 删除老数据的脚本
// 轨迹与轨迹点之间的关系表
CREATE TABLE `tbl_trace_point` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `trace_id` int(11) unsigned NOT NULL COMMENT '司机的轨迹id',
  `lat` decimal(15,6) NOT NULL COMMENT '轨迹点纬度',
  `lng` decimal(15,6) NOT NULL COMMENT '轨迹点经度',
  `direction` decimal(15,4) NOT NULL COMMENT '取值范围:[0,359],0代表正北方,采用顺时针方向取值',
  `speed` decimal(15,4) NOT NULL COMMENT '速度,单位:km/h',
  `locatetime` bigint(20) NOT NULL COMMENT '轨迹点定位时间,单位ms',
  `point_type` tinyint(4) NOT NULL DEFAULT '0' COMMENT '轨迹点类型1-开始点 2-普通点 3-滞留点 4-结束点',
  `stop_seconds` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '滞留时间,单位s',
  `create_time` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
  `modify_time` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
  `delete_time` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
  `pstatus` tinyint(4) NOT NULL DEFAULT '0' COMMENT '物理删除状态0-未删除 1-已删除',
  `extra1` int(11) NOT NULL DEFAULT '0',
  `extra2` int(11) NOT NULL DEFAULT '0',
  `extra3` int(11) NOT NULL DEFAULT '0',
  `extra4` varchar(128) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '',
  `extra5` varchar(128) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '',
  `extra6` varchar(128) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '',
  `extra7` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
  `extra8` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
  `extra9` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
  `extra10` decimal(15,4) NOT NULL DEFAULT '0.0000',
  PRIMARY KEY (`id`),
  KEY `idx_trace_id` (`trace_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;


新增消息订阅:
INSERT INTO mq.subscription_new
(`id`, `trigger`, topic, endpoint, check_url, `method`, name, create_time, modify_time, status)
VALUES(42, 'order_delivering', 'third_party', 'http://mq.station.cluster.gm/driver_performance/delivery_status/sync_by_order', 'http://www.baidu.com', 'POST', 'sync_driver_status', '2019-10-25 16:00:00.000', '2019-10-25 16:00:00.000', 2);
INSERT INTO mq.subscription_new
(`id`, `trigger`, topic, endpoint, check_url, `method`, name, create_time, modify_time, status)
VALUES(42, 'order_sorting', 'third_party', 'http://mq.station.cluster.gm/driver_performance/delivery_status/sync_by_order', 'http://www.baidu.com', 'POST', 'sync_driver_status', '2019-10-25 16:00:00.000', '2019-10-25 16:00:00.000', 2);


INSERT INTO mq.subscription_new
(`trigger`, topic, endpoint, check_url, `method`, name, create_time, modify_time, status)
VALUES('edit_driver', 'driver', 'http://mq.station.cluster.gm/driver_performance/trace/add_delivery_task', 'http://www.baidu.com', 'POST', 'add_trace_task', '2019-10-25 16:00:00.000', '2019-10-25 16:00:00.000', 2);

监听订单签收消息,收到订单签收之后的消息,判断是否需要把司机状态更改为空闲状态
逻辑:根据订单找出司机,司机当前所有任务是签收状态,则把司机状态为空闲状态,空闲状态不可上传轨迹 

监听编辑司机的消息,分配司机,如果是配送中的订单,那么绑定到当前轨迹上,
如果是取消分配司机,那么解除当前配送任务和司机轨迹的绑定关系

定时脚本:每天00:00:00执行一次进行轨迹结束

订单详情接口【修改老接口】

接口名
    https://station.guanmai.cn/station/order/edit
请求
    id                          M   str  不变
响应
    code                        M    int    错误码 0为成功、其他为错误
    msg                         M    str    错误信息。成功时候返回OK、错误时返回错误信息。
    data {                      M    map
        ...
        sign_way                M    int    新增: 签收方式,0-过往历史订单签收方式(或者未签收) 1-司机签收 2-客户签收 3-代客签收 
        receive_time            M    str    新增:签收时间,如果没有返回""
        receive_img_url         M    str    新增: 签收的图片返回,如果没有图片,返回""
    }

配送任务--订单任务列表 【修改老接口】

接口名
    https://station.guanmai.cn/station/task/distribute/orders/get
Method
    GET
请求
    ...                        之前的请求参数保持不变
    salemenu_id   O    str     新增:报价单id刷选条件,不传代表全部报价单

响应
    code                        M    int    错误码 0为成功、其他为错误
    msg                         M    str    错误信息。成功时候返回OK、错误时返回错误信息。
    data {                      M    map
        address                 M    list   不变
        in_query                M    bool   不变
        distribute_order        M    map    不变
        order [                 M    list   配送任务列表
            {                   M    map    具体的某个配送任务
                ...
                salemenus       M    list   新增:订单所有报价单名称列表返回 
                receive_img_url M    str    新增: 签收的图片返回,如果没有图片,返回"" 
            }
        ]
    }
    pagination                 M     分页信息 不变

station系统设置更新接口【修改老接口】

接口名
    https://station.guanmai.cn/station/profile/update
Method
    POST
请求
    ...                                     之前的请求参数保持不变
    en_driver_performance       O     int   0-关闭 1-开启  
    en_driver_pic_received      O     int   0-关闭 1-开启     

响应
    code                        M     int    错误码 0为成功、其他为错误
    msg                         M     str    错误信息。成功时候返回OK、错误时返回错误信息。
    data                        M     null

station获取登录用户的信息(系统设置)接口【修改老接口】

接口名
    http://station.stock.devhost.guanmai.cn/station/user
Method
    GET
请求
    无
响应
    code                               M    int    错误码 0为成功、其他为错误
    msg                                M    str    错误信息。成功时候返回OK、错误时返回错误信息。
    data {                             M    map    user信息
        profile {                      M    map    profile
            ...                        M           之前的不变
            en_driver_performance      M    int    新增:司机到达考核开关0-关闭,1开启
            en_driver_pic_received     M    int    新增:司机拍照签收开关0-关闭,1开启
        }
    }

MA编辑配送回单【新增接口】

接口名
    https://manage.guanmai.cn/finance/receipt/update
Method
    POST
请求
    order_ids                          O    list 订单列表,批量传order_ids
    // 新增:全选传搜索条件参数过来
    参数同https://manage.guanmai.cn/finance/order/search接口
    begin_time                         M    str  开始时间
    end_time                           M    str  结束时间
    pay_status                         O    int  支付状态
    search_text                        O    str  搜索
    city                               O    str  城市
    station                            O    str  站点id
    settle_way                         O    int  1-先货后款 2-先款后货
    pay_method                         O    
    route_id                           O    int  路线id
    sale_employee_id                   O    int  经理id
    carrier_id                         O    int  承运商id
    driver_id                          O    int  司机id
    unassigned                         O    int  1-未分配司机
    freeze_status                      O    int  注意这个跟搜索接口名字不一样,稍微改了一下,区分下面的锁定状态,订单锁定状态0-未锁定 1-锁定
    receipt_status                     O    int  订单回单状态过滤条件-1 全部 0 未回单 1-已回单
    search_type                        O    int  搜索类型 1下单时间 2 收货时间 3 运营时间
    service_time_id                    O    str  运营时间id
    service_date                       O    str  运营时间
    // 需要设置的回单状态
    receipt                            M    int  订单回单状态0-未回单 1-已回单
响应
    code                               M    int    错误码 0为成功、其他为错误
    msg                                M    str    错误信息。成功时候返回OK、错误时返回错误信息。
    data                               M    null

MA商户结算编辑订单锁定状态【修改老接口】

接口名
    https://manage.guanmai.cn/finance/order/update/lock
Method
    POST
请求
    order_ids                          O    list 订单列表,批量传order_ids
    // 新增:全选传搜索条件参数过来
    参数同https://manage.guanmai.cn/finance/order/search接口
    begin_time                         M    str  开始时间
    end_time                           M    str  结束时间
    pay_status                         O    int  支付状态
    search_text                        O    str  搜索
    city                               O    str  城市
    station                            O    str  站点id
    settle_way                         O    int  1-先货后款 2-先款后货
    pay_method                         O    
    route_id                           O    int  路线id
    sale_employee_id                   O    int  经理id
    carrier_id                         O    int  承运商id
    driver_id                          O    int  司机id
    unassigned                         O    int  1-未分配司机
    freeze_status                      O    int  注意这个跟搜索接口名字稍微改了一下,区分下面的锁定状态,订单锁定状态0-未锁定 1-锁定
    receipt_status                     O    int  订单回单状态过滤条件-1 全部 0 未回单 1-已回单
    search_type                        O    int  搜索类型 1下单时间 2 收货时间 3 运营时间
    service_time_id                    O    str  运营时间id
    service_date                       O    str  运营时间

    // 要设置成的状态
    freeze                             M    int  订单锁定状态0-未锁定 1-锁定
响应
    code                               M    int    错误码 0为成功、其他为错误
    msg                                M    str    错误信息。成功时候返回OK、错误时返回错误信息。
    data                               M    null

MA新增编辑配送回单的权限【新增权限】

权限codename: edit_order_receipt

INSERT INTO `management`.`tbl_permission`(`name`, `name_en`, `content_type_id`, `codename`, `pm_can_see`, `level2_id`) VALUES ('编辑配送回单', 'Edit Order Receipt', 29, 'edit_order_receipt', NULL, 30);

获取司机配送状态【新接口】

接口
    https://station.guanmai.cn/driver_performance/delivery/status
Method
    GET
请求
    无
响应
    code                         M    int    错误码 0为成功、其他为错误
    msg                          M    str    错误信息。成功时候返回OK、错误时返回错误信息。
    data {                       M    map
        delivery_status          M    int    司机配送状态 0-空闲状态 1-配送中
    }
响应示例:
{
    "code": 0,
    "msg": "ok",
    "data": {
        "delivery_status": 1
    }
}

开始配送接口【新接口】

接口
    https://station.guanmai.cn/driver_performance/delivery/start
Method
    POST
请求
    无
响应
    code                         M    int    错误码 0为成功、其他为错误
    ms                           M    str    错误信息。成功时候返回OK、错误时返回错误信息。
    data                         M    null
逻辑:
1. 新增一条轨迹
2. 标记司机工作状态为配送状态

调度中心司机配送任务列表【新接口】

接口名
    https://station.guanmai.cn/driver_performance/delivery_task/list
Method
    GET
请求
    ### 参数参考司机配送任务接口
    start_time                      O    date     下单或收货开始时间, 格式2019-09-02
    end_time                        O    date     下单或收货结束时间, 格式2019-09-02
    date_type                       O    int       时间类型 0-下单时间 1- 收货时间
    time_config_id                  O    str      运营时间id
    cycle_start_time                O    datetime 运营周期开始时间,格式2019-09-02 12:30
    cycle_end_time                  O    datetime 运营周期结束时间,格式2019-09-02 12:30
    search                          O    str      订单号筛选
    carrier_id                      O    int      承运商id
    driver_id                       O    int      司机id

响应
    code                                    M    int    错误码 0为成功、其他为错误
    msg                                     M    str    错误信息。成功时候返回OK、错误时返回错误信息。
    data {                                  M    map    商户和司机订单统计信息
            driver_count [                  M    list   司机轨迹统计列表
                {                           M    map    具体每个司机的轨迹配送任务信息
                    distribute_time         M    str    配送日期
                    carrier_name            M    str    承运商名称
                    driver_id               M    int    司机id
                    driver_name             M    str    司机名称
                    trace_id                M    int    司机轨迹id
                    distributing_orders [   M    list   配送中的订单列表
                        {                   M    map    订单详情
                            order_id        M    str    订单id
                            address_id      M    str    商户id
                            address_name    M    str    商户名
                        }
                    ]
                    received_orders [       M    list   已收货的订单列表
                        {
                            order_id        M    str    订单id
                            address_id      M    str    商户id
                            address_name    M    str    商户名
                        }
                    ]
                }
           ],
           address_count: [{
              total                         M    int   该商户总订单数量
              received                      M    int   该商户已签收数量
              drivers [                     M    list  商户分配的司机
                {
                    driver_id               M    int   司机id
                    driver_name             M    str   司机名
                }
              ]
              address_id                    M    str   商户id
              address_name                  M    str   商户名
              latitude                      M    float 商户地址纬度
              longitude                     M    float 商户地址经度
           }]
    }

上传路线轨迹点【新接口】

接口名
    https://station.guanmai.cn/driver_performance/trace_point/create
Method
    POST
请求     
                driver_id        M    int     司机id
                token            M    str     司机token,登录后能拿到
                latitude         M    float   纬度
                longitude        M    float   经度
                locatetime       M    int     定位时间,单位ms
                direction        M    float   取值范围:[0,359],0代表正北方,采用顺时针方向取值
                speed            M    float   速度 单位km/h
                locate_type      M    int     定位类型 0-网络定位 1-GPS定位
响应
                code             M    int    错误码 0为成功、其他为错误
                msg              M    str    错误信息。成功时候返回OK、错误时返回错误信息。
                data             M    null

逻辑:
1. 判断司机状态是否是配送中的状态,如果不是说明轨迹已经结束了。
2. 司机轨迹按照创建时间倒序排序取最新的轨迹id,保存轨迹和轨迹点的关联数据信息 
示例:
响应:
{
    "code": -100,                 // 约定-100为轨迹end
    "msg": "轨迹end",
    "data": null
}

查询司机时间段内所有轨迹点【新接口】

接口名
    https://station.guanmai.cn/driver_performance/trace/list
Method
    GET
请求
    trace_ids                    M    list     轨迹id列表

响应
    code                         M    int    错误码 0为成功、其他为错误
    msg                          M    str    错误信息。成功时候返回OK、错误时返回错误信息。
    data  [                      M    list   司机当天所有轨迹信息列表
        {                        M    map    单条轨迹信息
            trace_id             M    int    轨迹id、
            trace_status         M    int    轨迹状态,0-未结束 1-已经结束
            points [             M    list   轨迹点信息列表
            {                    M    map    具体的轨迹点信息
                latitude         M    float  轨迹点纬度
                longitude        M    float  轨迹点经度
                delay_time       M    int    滞留点时间,单位s
                locatetime       M    int    定位时间,单位ms
                direction        M    float  取值范围:[0,359],0代表正北方,采用顺时针方向取值
                speed            M    float  速度,单位:km/h
            }
            last_location        M    str    轨迹最后一次位置的经纬度定位的地址
            distribute_end_time  M    str    配送结束时间,拉取时间段内轨迹结束时间最晚的时间作为配送结束时间
            distribute_cost_time M    str    配送用时格式'5h39min',拿到轨迹创建时间最早最晚的,进行计算
            stop_time            M    int    滞留时间, 单位秒s (司机当日所有路线的滞留点滞留时长之和)
        ]
    ]
逻辑:
1. 根据司机id和时间区间筛选出轨迹
2. 查出司机的轨迹
轨迹点数最大值估计24*60*60/(5s/1点)=17280点,,获取一天的轨迹不分页应该还好

当天最新位置获取接口

接口名
    https://station.guanmai.cn/driver_performance/latest_point/list
Method
    GET
请求
    driver_id                    M    int   司机id
    last_locatetime              M    int   上一次response返回的最后一个坐标点的定位时间
响应
    code                         M    int    错误码 0为成功、其他为错误
    msg                          M    str    错误信息。成功时候返回OK、错误时返回错误信息。
    data {                       M    map
        points [                 M    list   查到的locatetime大于请求的locatetime的轨迹point,可能有多个
            {                    M    map    一个轨迹点的信息
                latitude         M    float  轨迹点纬度
                longitude        M    float  轨迹点经度
                delay_time       M    int    滞留点时间,单位s
                locatetime       M    int    定位时间,单位ms
                direction        M    float  取值范围:[0,359],0代表正北方,采用顺时针方向取值
                speed            M    float  速度,单位:km/h
            }
        ]
        last_locatetime          M   int    实际上points数组的最后一个元素的locatetime
    }
滞留点后台判断
#  根据速度判断 10, 5个点