分拣进度迭代+分拣投屏
分拣进度迭代+分拣投屏技术方案
分拣概念储备:
real_is_weight: 是否是称重商品, true, false,
is_weight: 是否已称重,0, 1
real_quantity: 实际称重数量
out_of_stock: 是否缺货
origin里的has_weighted 是否已称重,0, 1
单个订单里的sku分拣进度(或者说单个订单的分拣进度表)(已有)
class SortingCollectModel(BaseModel):
class Meta:
db_table = "tbl_sorting_collect"
app_label = "sorting"
id = models.CharField(max_length=20, help_text='订单号', unique=True, primary_key=True) # 使用订单id作为主键
station_id = models.CharField(max_length=20, help_text='站点id')
address_id = models.CharField(max_length=20, help_text='商户id')
time_config_id = models.CharField(max_length=20, help_text='运营周期id')
total = models.IntegerField(default=0, help_text='总任务数')
finished = models.IntegerField(default=0, help_text='完成任务数')
unfinished = models.IntegerField(default=0, help_text='未完成任务数')
out_of_stock = models.IntegerField(default=0, help_text='缺货任务数')
weight_count = models.IntegerField(default=0, help_text='记重任务数')
unweight_count = models.IntegerField(default=0, help_text='不记重任务数')
removed = models.SmallIntegerField(help_text='0未删除,1删除', default=0)
create_time = models.DateTimeField(auto_now_add=True)
update_time = models.DateTimeField(auto_now=True)
delete_time = models.DateTimeField()
sku_ids = JSONField(help_text='sku_id')
单个订单里每个一级分类的sku分拣进度表(已有)
class SortingCategoryCollectModel(BaseModel):
class Meta:
db_table = "tbl_sorting_category_collect"
app_label = "sorting"
id = models.CharField(max_length=32, unique=True, primary_key=True) # 使用'订单id_一级分类id'作为主键
order_id = models.CharField(max_length=20, help_text='订单号')
station_id = models.CharField(max_length=20, help_text='站点id')
category_id = models.CharField(max_length=20, help_text='一级分类id')
time_config_id = models.CharField(max_length=20, help_text='运营周期id')
total = models.IntegerField(default=0, help_text='总任务数')
finished = models.IntegerField(default=0, help_text='完成任务数')
unfinished = models.IntegerField(default=0, help_text='未完成任务数')
out_of_stock = models.IntegerField(default=0, help_text='缺货任务数')
removed = models.SmallIntegerField(help_text='0未删除,1删除', default=0)
create_time = models.DateTimeField(auto_now_add=True)
update_time = models.DateTimeField(auto_now=True)
delete_time = models.DateTimeField()
接口改动
https://station.guanmai.cn/weight/weight_collect/order/list [新增接口]订单分拣进度明细
说明: 进度页面不需要sku信息,传参数的时候need_details=0
请求方法:GET
请求参数:
| 参数名 | 必选M/可选O | 类型 | 说明 |
| -------------- | ----------- | ---- | ------------ |
| time_config_id | M | str | 运营配置id |
| start_date | M | str | 开始时间 |
| end_date | M | str | 结束时间 |
| search | O | str | 搜索 |
| route_id | O | int | 线路id |
| status | O | int | 订单状态 |
| carrier_id | O | int | 承运商id |
| driver_id | O | int | 司机id |
| need_details | O | bool | 是否需要商品details信息,1需要,0 不需要 |
| random_num | O | int | 随机返回的条目数|
| page_obj | O | str | 新分页规范 |
| reverse | O | bool | 新分页规范 |
| limit | O | int | 新分页规范 |
| offset | O | int | 新分页规范 |
| peek | O | int | 新分页规范 |
| count | O | bool | 新分页规范 |
响应:
code M int 返回码,0表示成功,其他表示错误
msg M string 错误信息
data M string 返回json数据
pagination M string 新分页规范
例子:
分页请求:
time_config_id: 'ST2076',
start_date: '2019-03-20 06:00',
end_date: '2019-03-22 12:00',
search:
route_id: 1368,
status: 5,
carrier_id: 3682,
driver_id: 4349,
need_details: 1,
random: 0,
随机请求:
time_config_id: 'ST2076',
start_date: '2019-03-20 06:00',
end_date: '2019-03-22 12:00',
need_details: 0, // 不需要sku详情,可以减少数据库的的查询,性能有优化
random_num: 20, // 随机条目数
响应:
"code": 0,
"msg": "ok",
"pagination": { // 随机请求没有返回,其他保持一致
"more": false,
"page_obj": null,
"peek": 0,
"reverse": 0
},
"data": {
"total": 100, // 全部订单数
"finished": 20, // 完成订单数
“orders”:[ // 订单分页列表数据
{
"id": "PL233444", // 订单id
"address_name": "开心花甲南山店",
"route": "这是线路名",
"sort_id": "这是分拣序号",
"order_status": 1, // -1-订单已删除, 1-等待出库, 5-正在分拣, 10-正在配送, 15-已签收, 100-已支付
"driver_name": "司机",
"finished":6, // 订单中完成的sku分拣任务数量
"total": 10, // 订单中全部的sku分拣任务数量
"service_time_period": "03月21日19:00~03月22日11:00收货" // 运营周期
"details":[ // need_details=1时返回订单里全部详尽的sku信息
{
"sku_id": "D7552672", // sku id
"source_order_id": "PL233444", // 不一定有这个字段
"name": "西红柿", // sku名
"salemenu_name": "报价单名称",
"std_unit_name": "包", // 基本单位 (出库数用的是基本单位)
"sale_unit_name": "件", // 销售单位
"quantity": 20, // 下单数(销售单位)
"std_quantity":10, // 下单数 (基本单位
"real_quantity": 1, // 出库数
"std_real_quantity": 1, // 出库数(基本单位)
"weighting_quantity": 0 // 已称重数
"is_weight": 0, // 是否已称重
"real_is_weight": 1, // 是否是称重商品,1是,0不是
"category1_id": "A12359",
"category1_name": "调料干货",
"category2_id": "B52170",
"category2_name": "调料类",
"pinlei_id": "P411425",
"pinlei_name": "调料类",
"is_exc": false, // 是否异常
"is_print": false, // 是否已打印
"out_of_stock": 0, // 是否缺货
"sort_remark": "分拣备注", // 分拣备注
}
]
}
]
}
https://station.guanmai.cn/weight/weight_collect/sku/list [新增接口] 获取sku分拣信息
说明:
这个接口实际上每次最大拉取最多1000条订单的数据,
sku分拣进度在这个接口返回
请求方法:GET
请求参数:
| 参数名 | 必选M/可选O | 类型 | 说明 |
| -------------- | ----------- | ---- | ---------- |
| time_config_id | M | str | 运营配置id |
| search | O | str | 搜索 |
| category_id_1 | O | list | 一级分类 |
| category_id_2 | O | list | 二级分类 |
| pinlei_id | O | list | 品类id |
| random_num | O | int | 随机返回的条目数 |
| start_date | O | str | 开始时间(新增) |
| end_date | O | str | 结束时间 (新增)|
| salemenu_id | O | str | 报价单id(新增) |
| page_obj | O | str | 新分页规范(新增)|
| reverse | O | bool | 新分页规范(新增)|
| limit | O | int | 新分页规范(新增)|
| offset | O | int | 新分页规范(新增)|
| peek | O | int | 新分页规范(新增)|
| count | O | bool | 新分页规范(新增)|
响应:
code M int 返回码,0表示成功,其他表示错误
msg M string 错误信息
data M string 返回json数据
例子:
分页request:
time_config_id: "ST2076"
start_date: "2019-03-21 06:00",
end_date: "2019-03-22 12:00",
salemenu_id: "S12731",
category_id_2: ["B37097"],
reverse:0, // 1向上翻页, 0向下翻页,默认0
limit: 20, // 默认一页20
page_obj: "{ // 上一次response的page_obj,第一页不用传
"tail": "D9151482",
"head": "D5557789"
}"
随机request:
time_config_id: "ST2076"
start_date: "2019-03-21 06:00",
end_date: "2019-03-22 12:00",
random_num: 10, // 随机条目数
response:
{
"code": 0,
"pagination": { // 随机请求没有返回,其他保持一致
"page_obj": {
"tail": "D9151482",
"head": "D5557789"
},
"more": false // 上一页(向上翻页)或者下一页(向下翻页)是否还有更多数据
},
"data": {
"total": 132, // 总数量
"finished": 100, // 完成的总数量
"skus": [
{
"category_id_1": "A7661", // 一级分类id
"category1_name": "畜类", // 一级分类名
"category_id_2": "B37093", // 二级分类id
"category2_name": "牛", // 二级分类名
"pinlei_name": "牛", // 品类名
"pinlei_id": "P385923", // 品类id
"sku_id": "D7552606", // sku_id
"name": "牛展(大展)", // 商品名
"salemenu_id": "S10314", // 报价单id
"salemenu_name": "报价单名", // 报价单名
"sort_schedule": 0.8 // 商品分拣进度
"orders": [
{
"address_id": "S039123", // 商户id
"resname": "这是商户名", // 商户名
"route": "这是路线名", // 路线名
"sort_id": "123", // 分拣序号
"order_id": "PL234555", // 订单号
"source_order_id": "PL234556", // 不一定有这个字段返回,带有source_order_id的请求修改缺货和出库数时原样返回.
"status": 5, // 订单状态
"std_unit_name": "包", // 基本单位 (出库数用的是基本单位)
"sale_unit_name": "件", // 销售单位
"quantity": 10, // 下单数(销售单位)
"std_quantity": 10, // 下单数(基本单位)
"real_quantity": 10, // 出库数(销售单位)
"std_real_quantity": 10, // 出库数(基本单位)
"weighting_quantity": 0, // 已称重数
"is_weight": 1, // 是够已称重,1已称,0未称重
"real_is_weight": 1, // 是否计重, 0不计重,1计重
"sort_remark": "这是分拣备注", // 分拣备注
"out_of_stock": 0, // 是否缺货
"is_exec": false, // 是否异常
"is_print": false, // 是否打印
}
]
}
],
},
"msg": "ok"
}
https://station.guanmai.cn/weight/batch_out_of_stock/update [修改老接口]批量缺货
请求方法:POST
请求:
有以下字段为部分修改(不变)
| skus | O | list 缺货sku信息
[{
'order_id': '', M
'sku_id': '' , M
'source_order_id': '' O 返回的数据中有source_order_id字段时原样返回
}]
有以下字段为全部修改
| time_config_id | M | str | 运营配置id
| start_date | M | str | 周期起始时间
| end_date | M | str | 周期结束时间
| search | O | str | 搜索
| category_id_1 | O | list | 一级分类
| category_id_2 | O | list | 二级分类
| pinlei_id | O | list | 品类id
| remark | O | str | 分拣备注
| is_weigh | O | bool | 是否称重商品
| weighed | O | bool | 是否已称重
| printed | O | bool | 是否已打印
| status | O | int | 订单转态
| salemenu_id | O | str | 销售单
| route_id | O | str | 路线
| carrier_id | O | int | 承运商id(新增)
| driver_id | O | int | 司机id (新增)
响应(不变):
{
"msg": "ok",
"code": 0
}
https://station.guanmai.cn/weight/weight_collect/weight_info/get [修改老接口]分拣进度获取展示数据
说明: 去掉原来的target_date, 新增start_date, end_date
请求方法:GET
请求:
time_config_id M str 运营周期id
start_date M str 开始日期(新增)
end_date M str 结束日期(新增)
响应(不变):
{
"code": 0,
"msg": "ok"
"data": {
'total_schedule': {
'total_count' 总任务数
'finished_count' 已完成任务数
'unfinished_count' 未完成任务数
'out_of_stock_count' 缺货任务数
},
'category_schedule': [{
'name' 一级分类名
'finished_count' 已完成任务数
'unfinished_count' 未完成任务数
'out_of_stock_count' 缺货任务数
}],
'sort_data': {
'weight_count' 计重任务数
'unweight_count' 不计重任务数
'sku_count' 商品种类数
'address_count' 商户数
}
}
}
用到的老接口
https://station.guanmai.cn/weight/weight_collect/weight_info/get 任务概况信息接口
请求方法:GET
请求参数:
不变
响应:
不变
订单汇总分拣进度可以直接用响应中的 finished_count/total_count * 100%
新增权限
INSERT INTO auth_permission(
`name`, `name_en`, `content_type_id`, `codename`, `level2_id`) VALUES(
'查看分拣进度', 'Get Sorting Schedule', 12, 'get_sorting_schedule', 23
);
INSERT INTO auth_permission(
`name`, `name_en`, `content_type_id`, `codename`, `level2_id`) VALUES(
'查看分拣明细', 'Get Sorting Detail', 12, 'get_sorting_detail', 23
);
投屏刷新redis缓存方案
http://station.guanmai.cn/weight/weight_collect/randomsku/list [新增: sku随机返回接口]
请求方法:GET
请求:
time_config_id M str 运营周期id
start_date M str 开始日期(新增)
end_date M str 结束日期(新增)
random_num O int 随机条目数量
响应(不变):
code: 0,
msg: 'ok',
data: {
'skus': [{'sku_id': 'D123', 'name': '胡萝卜', 'sort_schedule': 40% }]
}
新增 http://station.guanmai.cn/weight/weight_collect/randomorder/list [新增: order随机返回接口]
请求方法:GET
请求:
time_config_id M str 运营周期id
start_date M str 开始日期(新增)
end_date M str 结束日期(新增)
random_num O int 随机条目数量
响应(不变):
code: 0,
msg: 'ok',
data: {
"total": 100, // 全部订单数
"finished": 20, // 完成订单数
“orders”:[ // 随机返回的订单列表数据
{
"id": "PL233444", // 订单id
"address_name": "开心花甲南山店",
"finished":6, // 订单中完成的sku分拣任务数量
"total": 10, // 订单中全部的sku分拣任务数量
}
]
}
缓存逻辑:
首先去取redis,redis有直接返回
redis没有,则统计存入redis,并设置key 8秒超时时间
1. sku随机返回的接口:
key: prefix+station_id+time_config_id+搜索时间范围
value: [{'sku_id': 'D123', 'name': '胡萝卜', 'sort_schedule': 40% }] // 缓存统计结果(15个sku)
// 例子key: "SKU_T7936_ST2076_2019-03-21 06:00_2019-03-22 12:00"
// 例子value: [{'sku_id': 'D123', 'name': '胡萝卜', 'sort_schedule': 40% }]
2. order随机返回接口:
key: prefix+station_id+time_config_id+搜索时间范围
value: 订单统计数据(7条)
// 例子key: "ORDER_T7936_ST2076_2019-03-21 06:00_2019-03-22 12:00"
// 例子value: {
"total": 100, // 全部订单数
"finished": 20, // 完成订单数
“orders”:[ // 随机返回的订单列表数据
{
"id": "PL233444", // 订单id
"address_name": "开心花甲南山店",
"finished":6, // 订单中完成的sku分拣任务数量
"total": 10, // 订单中全部的sku分拣任务数量
} // 缓存统计结果(7个order)
]
}
开发计划
2019-3-21完成 订单分拣进度明细新接口开发
2019-3-22完成拉取包含某个sku的订单的新接口开发
2019-3-25 修改好sku分拣任务老接口,并添加权限
2019-3-26/27 联调两天