宋小菜树根项目计划方案

1、PRD+UI

PRD地址: https://星星.yuque.com/prod-tech/589913/iifqqm
UI: 待定

2、数据模型

2.1 数据结构

3、影响点

采购交互概述

3.1 采购装货单


3.1.1 装货单列表查询

现状 解决方案
检索调度单未关联的的装货单数据
透大致装卸数据[logistics_shipment+logistics_shipment_detail]
供应商承运的只能看到自己创建的采购单相关的装货单
承运的采购单能看到所有相关装货单

3.1.1.1 [API]采购-商品详情-装卸路线

根据需求子单source_sub_id查询多条装货单细节信息,并体现出实装、实卸请看

3.1.1.2 [API]物流-装货单列表


3.1.2 装货单-详情查询

现状 解决方案
透出装货单所有装卸货数据细节+采购员+供应商[logistics_shipment+logistics_shipment_detail]

3.1.2.1 [API]装货单简约信息提取

3.1.2.2 [API]装货单详细信息

3.1.2.3 [API]装货单-调度单编辑详细信息


3.1.3 装货单-装货详情查询

现状 解决方案
透出装货单数据细节
装货点及装货相关skuId,卸货点及卸货相关skuId,采购员&采购单&供应商,装货单制单时间

3.1.3.1 [API]装货单详细信息

_ _

3.1.3.2 [API]装货单编辑详情信息


3.1.4 装货单创建-同步

现状 解决方案
采购单与采购子单数据同步结构一致
新增采购装货单同步创建逻辑
数据结构如logistics_shipment,logistics_shipment_detail

3.1.5 装货单-发货

现状 解决方案
根据此次调度数量修改实发数量及附录发货单&车辆照片

3.1.5.1 [API]物流-发货操作-沈伟

星星.logisticsservice.delivery.shipment.update

http://gateway.星星.com/api_admin/api_doc/detail.htm?api_name=星星.logisticsservice.delivery.shipment.update


3.1.6 装货单-数量修改

现状 解决方案
装货单直接提供对外数量操作能力
需要遵循的:采购数量=装货总数量=卸货总数量

3.1.6.1 [API]采购-线路详情-数量修正

修改某个装货单的应装、应卸数量


3.2 调度单


3.2.1 调度单列表-待|已发货 查询

现状 解决方案
搜罗待发货状态
列表展示调度单号、调度单制单员姓名、调度车辆车牌号及车长、装货点以及计划装货量、卸货点以及计划卸货量

3.2.1.1 [API]物流-调度单-待发车列表


3.2.2 调度单详情查询

现状 解决方案
装货单大概信息、装货单卸货详细数据、调度单基本信息

3.2.2.1 [API]物流-调度单详情-沈伟

_ _

当前调度单详情

星星.logisticsservice.delivery.detail

http://gateway.星星.com/api_admin/api_doc/detail.htm?api_name=星星.logisticsservice.delivery.detail


3.2.3 调度单司机、车辆查询

现状 解决方案
根据姓名、手机号查询司机,并填充司机和车辆信息 复用原逻辑

3.2.3.1 [API]司机车辆各类API



3.2.4 调度单创建

现状 解决方案
发货单剩余发货量,划定此次调度单应承运量
填充司机车辆信息
1:本次调度sku件数小于等于sku采购装货单件数
2:本次剩余调度件数可后续派车生成新的调度单
3:装货单所有sku的本次调度件数都为0时,本装货单过滤不包含在所生成的调度单
4:只有一个装货单且调度件数为0,则调度单生成失败
数据MQ同步采购单状态

3.2.4.1 [API]调度单创建-沈伟

星星.logisticsservice.delivery.create

http://gateway.星星.com/api_admin/api_doc/detail.htm?api_name=星星.logisticsservice.delivery.create

3.2.4.2 [API]调度单保存-沈伟

星星.logisticsservice.delivery.update

http://gateway.星星.com/api_admin/api_doc/detail.htm?api_name=星星.logisticsservice.delivery.update


3.2.5 调度单提交-承运单创建

现状 解决方案
1、调度单所有装货单都发货后,调度单可通过点击“生成承运单”按钮创建承运单。承运单取最后一个发车的装货单实际发车时间;承运单创建时间是生成承运单的时间
2、如果调度单发货总量等于应卸总量,按装货单原有卸货分配原则分配各个卸货点的卸货量生成承运单;
3、如果调度单发货总量小于应卸总量,优先分配服务站类型卸货点,其次档口类型卸货点,最后中心仓类型卸货点,同种类型卸货点按卸货先后顺序分配,直到发货量分配完毕;
4、如果调度单发货总量大于应卸总量,剩余量分配到最后卸货点;
5、卸货分配量可修改;
6、确定卸货方案时,校验总发货量是否等于总卸货分配量;
7、调度单生成承运单后,推送调度单的发货信息(装货点以及装货量)到采购模块;
数据MQ同步采购服务装货单:实发数据、采购单状态跟进
8、老批次号逻辑情况原消息通知

3.2.5.1 [API]物流-承运单创建-沈伟

星星.logisticsservice.scheduling.delivery.create

http://gateway.星星.com/api_admin/api_doc/detail.htm?api_name=星星.logisticsservice.scheduling.delivery.create


3.2.6 调度单(待发货)取消

3.2.6.1 [API]物流-调度单取消


3.3 承运单


3.3.1 承运单详情-客户分配件数

图例 图例
现状 解决方案
发货过多、过少取不同文案发货不足件数销端需补单件数
透各个客户的下单、分配、签收量



3.3.2 承运单-直发匹配客户订单-沈伟

基地直发基于客户配送推行全国,区分两种订单
A:基于客户配送新流程的订单
B:基于消耗小仓库存老流程的订单
根据以上两类订单,区分两类签收提货操作,由物流承运时告知交易组订单类别
接下来只有A类订单;过渡期禁止业务分操作场内调线这类需要B类订单的调度

1
2
3
4
5
6
7
业务规则:
1、调度单生成承运单时,卸货点为服务站的发货量匹配客户订单,匹配规则如下:
A、有效订单: 匹配的订单全是基于客户配送新流程订单
B、订单范围:起始时间为上一个自然日凌晨后的订单;
C、匹配原则:按订单量由大到小分配消耗卸货点(服务站)发货量,直到发货量匹配消耗完成;
2、已经匹配的客户订单,在承运单生成后40小时触发签收、提货流程(线上原有流程),剩余量等待该服务站后续有新订单时再触发签收、提货流程;
3、所有卸货点分配量完成签收后,承运单状态变更为配送完成;
现状 解决方案
1、调度单生成承运单时,卸货点为服务站的发货量匹配[新流程]客户订单,匹配规则如下:
A、有效订单: 匹配的订单全是基于客户配送新流程订单
B、订单范围:起始时间为上一个自然日凌晨后的订单;
C、匹配原则:按订单量由大到小分配消耗卸货点(服务站)发货量,直到发货量匹配消耗完成;
2、匹配到的客户订单进行交易Mq通知
3、已经匹配的客户订单,在承运单生成后40小时触发签收、提货流程(线上原有流程),剩余量等待该服务站后续有新订单时再触发签收、提货流程;
4、所有卸货点分配量完成签收后,承运单状态变更为配送完成;

3.3.3 承运单-直发自动签收-沈伟

现状 解决方案
匹配[服务站]基于客户配送新订单后,进行签收动作
承运单数据状态更正
基于客户订单库存入库
当前发货子单[卸货点+sku]分配完应卸数量
通知采购同步装货单签收信息:装货单号,实签数量,实签人,实签时间点,装货子单状态跟进:已签收
通知交易触发订单提货:需求子单号,需求子单状态,实签数量情况

订单定时签收

订单客户主动签收


3.3.4 承运单-文案

现状 解决方案
原调度单文案 变更承运单文案

3.3.5 承运单-多发货点清洗

现状 解决方案
合并清洗硬编码限制单个装货点
站点顺序除类型排序外,实际到达时间点排序
解除合并清洗承运单上部分硬编码限制单个装货点
站点顺序除类型排序外,多装货单按货时间先后顺序排列

3.3.6 承运单-多发货点查询

现状 解决方案
查询条件:发车点,只支持首个发货地 变更支持多个发货地查询


3.4 批次号影响


3.4.1 基地直发批次号

现状 解决方案
原基地单批次号颗粒度到达需求子单采购子单 现基地单批次号颗粒度不变化

3.4.2 客户订单配送批次号入小仓

现状 解决方案
原先客户订单配送只支持成配 现客户订单配送支持基地,以客户订单号及基地直发批次号入库小仓,并后期签收提货


3.5 交易新老客户订单


3.5.1 中间态数据-基地直发单

基地直发基于客户配送推行全国,区分两种订单
A:基于客户配送新流程的订单
B:基于消耗小仓库存老流程的订单
根据以上两类订单,区分两类签收提货操作,由物流承运时告知交易组订单类别
接下来只有A类订单;过渡期禁止业务分操作场内调线这类需要B类订单的调度

现状 解决方案
只有苏锡常城配派送的订单才是A类订单
由于交易改造对基地单未处理,无法使用调整路线配送
树根推行上海,苏锡常,浙江三地
基地直发单将自动匹配A类订单并进行自动或主动签收、提货
中间态基地直发单允许使用调整路线,派送的订单是B类订单
所有城市的城配订单将使用A类订单


3.6 场内调线


3.6.1 场内调整路线

关闭调线功能
现状 解决方案
原先基于客户订单配送,由于签收和派送不确定性,试点城市的调整路线功能关闭 现如今交易改造#客户订单城配+树根#基地直发推行全国,场内调整路线关闭
其他调度流程(基地直发+客户订单城配)的订单走基于客户自动提货流程


3.7 采购单


3.7.1 采购单确认-沈伟

现状 解决方案
_ 对采购单所关联的所有未生效装货自动进行生效

星星.logisticsservice.requirement.valid

http://gateway.星星.com/api_admin/api_doc/detail.htm?api_name=星星.logisticsservice.requirement.valid


3.7.2 采购单取消-沈伟

现状 解决方案
_ 当前采购单如果有关联调度单,则不允许采购单取消操作

星星.logisticsservice.requirement.valid

http://gateway.星星.com/api_admin/api_doc/detail.htm?api_name=星星.logisticsservice.requirement.valid

4、交互内容确定

[采购交互点]-MQ-生成采购单

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
@Data
public class PurchaseRequirementSyncEvent implements Serializable {

private static final long serialVersionUID = 4530980811382387427L;

/**
* 需求主单号
*/
private Integer sourceId;

/**
* @see com..jotunheim.logistic.client.constant.requirement.SourceTypeEnum
*/
private Integer sourceType;

/**
* 承运方式(0:不区分 1:非自营 2:自营)
*/
private Integer logisticsType;

/**
* 派送发车点
*/
private Integer storeHouseId;

/**
* 派送发车地
*/
private String storeHouseName;

/**
* 提货日期
*/
private Long pickTime;

private List<PurchaseRequirementDetailSyncEvent> skuList;


@Data
public static class PurchaseRequirementDetailSyncEvent implements Serializable {


private static final long serialVersionUID = 7392533409927455042L;
/**
* 来源子单id(类型为0:订单号;1:基地采购子单号;2:场内采购子单号)
*/
private String sourceSubId;

/**
* skuId
*/
private Integer skuId;

/**
* 需求量
*/
private BigDecimal amount;

private List<PurchaseOrderSkuLoadUnload> loadUnloadList;

}

@Data
public static class PurchaseOrderSkuLoadUnload implements Serializable {


private static final long serialVersionUID = -4785882465921942883L;
private List<PurchaseOrderLoad> loadList;


private List<PurchaseOrderUnload> unloadList;
}

@Data
public static class PurchaseOrderLoad implements Serializable {


private static final long serialVersionUID = -6628860385227140111L;
private String loadProvince;

private String loadCity;

private String loadArea;

private Integer loadNum;

private Long loadTime;


}
@Data
public static class PurchaseOrderUnload implements Serializable {

private static final long serialVersionUID = -503341045385472615L;
private Integer unloadId;

private String unloadName;

private Integer unloadType;

private Integer unloadNum;
}
}

[采购交互点]-确认/取消采购单

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/**
* 采购单确认生效与失效
*
* @author shenwei
* @date 2020/2/22 上午10:51
*/
public class PurchaseRequirementValidDTO implements Serializable {

private static final long serialVersionUID = -7043483325389542517L;
/**
* 需求主单号
*/
private Integer sourceId;

/**
* @see com..jotunheim.logistic.client.constant.requirement.SourceTypeEnum
*/
private Integer sourceType;

}

[物流交互点]-生成调度单

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
/**
* 调度单创建通知-采购单状态MQ
*
* 起初用于树根项目-调度单创建MQ通知需求子单状态跟进
*
* @author shenwei
* @date 2020/2/22 上午10:59
*/
public class DeliveryCreateEvent implements Serializable {

private static final long serialVersionUID = -4096681865264014388L;

private Long deliveryId;

private Integer operatorId;

/**
* 需求子单维度-采购子单维度
*/
private List<RequirementDeliveryDetailInfo> detailInfoList;


@Data
public static class RequirementDeliveryDetailInfo implements Serializable {

private static final long serialVersionUID = 5070931901568450400L;

/**
* 子单状态
* @see com..jotunheim.logistic.client.constant.requirement.DetailStatusEnum
*/
private Integer detailStatus;

/**
* 子单状态
* @see com..jotunheim.logistic.client.constant.requirement.DetailStatusEnum
*/
private Integer shipmentStatus;

/**
* 来源子单id(类型为0:订单号;1:基地采购子单号;2:场内采购子单号)
*/
private String sourceSubId;

/**
* @see com..jotunheim.logistic.client.constant.requirement.SourceTypeEnum
*/
private Integer sourceType;

/**
* skuId
*/
private Integer skuId;

}
}

[物流交互点]-取消调度单

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
/**
* 调度单取消通知-采购单状态MQ
*
* 起初用于树根项目-调度单创建MQ通知需求子单状态跟进
*
* @author shenwei
* @date 2020/2/22 上午11:04
*/
@Data
public class DeliveryCancelEvent implements Serializable{

private static final long serialVersionUID = -860806214240471719L;
/**
* 需求子单维度-采购子单维度
*/
private List<RequirementCancelDeliveryDetailInfo> detailInfoList;

private Long deliveryId;

private Integer operatorId;

@Data
public static class RequirementCancelDeliveryDetailInfo implements Serializable {

private static final long serialVersionUID = 2632503231194481964L;
/**
* 子单状态
* @see com..jotunheim.logistic.client.constant.requirement.DetailStatusEnum
*/
private Integer detailStatus;

/**
* 来源子单id(类型为0:订单号;1:基地采购子单号;2:场内采购子单号)
*/
private String sourceSubId;

/**
* @see com..jotunheim.logistic.client.constant.requirement.SourceTypeEnum
*/
private Integer sourceType;

}
}

[物流交互点]-生成承运单

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
@Data
public class SchedulingCreateEvent implements Serializable {

private static final long serialVersionUID = -26532044446909589L;

/**
* 草稿物流单id
*/
Long schedulingId;

/**
* 操作用户id
*/
private Integer operatorId;


/**
* 订单提货信息
*/
private List<RequirementDetailInfo> orderBatchInfos;

@Data
public static class RequirementDetailInfo implements Serializable {

/**
* 需求单子单id
*/
private Integer detailId;

/**
* 子单状态
* @see com..jotunheim.logistic.client.constant.requirement.DetailStatusEnum
*/
private Integer detailStatus;

/**
* 来源子单id(类型为0:订单号;1:基地采购子单号;2:场内采购子单号)
*/
private String sourceSubId;

/**
* @see com..jotunheim.logistic.client.constant.requirement.SourceTypeEnum
*/
private Integer sourceType;

/**
* skuId
*/
private Integer skuId;

/**
* 批次号
*/
private String batchNo;

/**
* 本次承运数量
*/
private BigDecimal thisTimeAmount;

/**
* 承运数量
*/
private BigDecimal totalAmount;

}
}

[物流交互点]-签收

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
/**
* 物流单签收
* @auther: caotx
* @date: 2019/8/19 11:43
*/
@Data
public class DeliverySignEvent implements Serializable {
private static final long serialVersionUID = 5686211734579815422L;

/**
* 唯一key
*/
private String key;

private List<SignEventInfo> eventInfoList;

public static class SignEventInfo implements Serializable {

private static final long serialVersionUID = -6646638350640082703L;
/**
* 承运单ID
*/
private Long schedulingId;

/**
* @see com..jotunheim.logistic.client.constant.DeliveryStatusEnum
*/
private Integer deliveryStatus;

/**
* 需求子单ID
*/
private Integer requirementDetailId;

/**
* 签收数量
*/
private Integer signAmount;

/**
* 采购子单ID
*/
private String sourceSubId;

/**
* skuId
*/
private Integer skuId;

/**
* 主键ID
*/
private Integer deliverySourceId;
}
}

sql原表字段变更

1
logistics_delivery_source#shipment_detail_id

5、开发说明

分支

里程碑