Skip to content

分拣进度迭代+分拣投屏

分拣进度迭代+分拣投屏技术方案

分拣概念储备:

    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 联调两天