@Wahson
2018-06-18T14:53:28.000000Z
字数 3402
阅读 1028
工作
门店收货逻辑调整: 门店多次收货,原2个接口合并为一个接口,
CreateStoreInStockOrderNotTourAction、ResetStoreInStockOrderNotTourAction
=> StoreReceiptAction // 门店收货
前置检查:
1. 配送单号校验
2. (配送单状态 == 配送中) || (配送单状态 == 配送完成 && 入库单创建时间为当天)
3. 配送单仓库实发 = 门店实收 + 拒收 + 缺货
代码逻辑:
1. 根据配送单id, 查询门店入库单
2. 如果没有门店入库单(第一次收货),则新建入库单和入库子单,保存sku入库数
3. 如果存在入库单(非第一次收货),更新入库单子单数量、金额,更新入库主单数量、金额,fire库存事件,更新门店实时库存
4. 更新配送单实收数、拒收数、缺货数、拒收原因
接口定义:void wmsDeliveryRejectionOrAbsenceSync()
定时配置: @ScheduledTaskCron(cron = "0 0 2 * * ?")
逻辑:
1. 查询 deliveryOrders =
select d.* from delivery_order d
join stock_order so on d.id = so.delivery_order_id
where d.from_type = 仓库 and d.to_type = 门店
and so.created_at >= date_sub(current_date, interval 1 day) and so.created_at < current_date
// 找出有拒收数量或缺货数量的配送单
val list = deliveryOrders.map { delivery =>
val deliveryOrderItems = queryDeliveryOrderItems(delivery.id)
val doisWithRejection = deliveryOrderItems.filter(_.rejectionNum > 0)
val doisWithAbsence = deliveryOrderItems.filter(_.absenceNum > 0)
(delivery, doisWithRejection, doisWithAbsence)
}
// 生成缺货/拒收修正单
// 构造拒收推送实体
val rejections = list.map { item =>
constructPostWmsRequest(item._1, item._2)
}
// 构造缺货推送实体
val absences = list.map { item =>
constructPostWmsRequest(item._1, item._3)
}
// 推送wms
// PostWmsRequest 增加字段relatedDeliveryOrderId 关联的配送单id
new PostDeliveryOrderToWmsAction(rejections ++ absences).execute
接口定义:void autoConfirm()
定时配置:@ScheduledTaskCron(cron = "0 30 0 * * ?")
处理逻辑:
// 1. 找待确认且离创建时间超过31天的修正单
val correctOrders = select * from correct_order where status = 待确认 and delivery_from_type = 仓库 and delivery_to_type = 门店 and created_at < date_sub(current_date, interval 31 day)
correctOrders.foreach { correctOrder =>
//3. 更新子单 仓库确认拒收数&拒收金额 或 确认缺货数&确认缺货金额
update correct_order_item set
confirm_reject_num = case when absence_num <> confirm_absence_num then reject_num else 0 end,
confirm_reject_amount = case when absence_num <> confirm_absence_num then reject_amount else 0 end,
confirm_absence_num = case when reject_num <> confirm_reject_num then absence_num else 0 end,
confirm_absence_amount = case when reject_num <> confirm_reject_num then absence_amount else 0 end
where correct_order_id = ${correctOrder.id};
// 逻辑说明: 如门店拒收数量和仓库确认拒收数量不相等,31天内依然没有收到wms回抛缺货数,则默认仓库接受门店缺货数,更新confirm_absence_num = absence_num
}
// 3. 更新主单状态
update correct_order set status = 待裁决 where id in (${ids}));
不变量规则:
1. 当且仅当门店拒收数量和仓库确认拒收数量 或 门店缺货数量和仓库确认缺货数量不相等,是存在修正单,且修正单状态为待确认。
接口定义:
处理逻辑:
val deliveryOrder = queryDeliveryOrderById(request.relatedDeliveryOrderId)
val deliveryOrderItems = queryDeliveryOrderItems(deliveryOrder.id)
val correctOrderOpt = queryCorrectOrderByDeliveryOrderId(deliveryOrder.id)
request.修正类型 match {
case 拒收 =>
// 比对找出有拒收差异的sku
if(correctOrderOpt.isDefined) {
if(有差异的skus.size > 0) {
更新子单确认拒收数量和金额()
更新主单相应数量和金额()
}
更新主单状态 = 待裁决
} else {
if(有差异的skus.size > 0) {
修正单状态 = if(deliveryOrderItems.exist(sku.absenceNum > 0)) 待确认 else 待裁决
新建修正单(修正单状态)
}
}
case 缺货 =>
// 比对找出有缺货差异的sku
if(correctOrderOpt.isDefined) {
if(有差异的skus.size > 0) {
更新子单确认缺货数量和金额()
更新主单相应数量和金额()
}
更新主单状态 = 待裁决
} else {
if(有差异的skus.size > 0) {
修正单状态 = if(deliveryOrderItems.exist(sku.rejectionNum > 0)) 待确认 else 待裁决
新建修正单(修正单状态)
}
}
}
接口定义: void makeLogisticsAdjudgement(request)
处理逻辑:
1. 更新修正子单裁决拒收数/金额和裁决缺货数/金额字段
2. 更新修正主单相应数量/金额, 状态 = 已裁决
3. 裁决拒收数和裁决缺货数推送wms, 接口待wms给出
接口定义:StoreRejectionReceiveAction
接口逻辑:
门店收货拒收,总部裁决后,对于仓库打回的拒收货物的收货操作
根据修正单总部裁决拒收数,更新收货数量,门店入库(入库数量=门店拒收数-总部裁决拒收数)
参照原型
配送单日结前可以多次收货,日结后不能收货
修正单裁决后,配送单可以收货,收货时只能修改拒收数量