司机绩效管理
司机绩效
数据库表改动
新增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个点