当前FMR入库流程,入库更新库存后会创建库存变更记录,然后会触发过账。根据库存变更记录生成过账记录。但是,入库更新库存那一时刻,库存变更记录的目标仓位desBinCode还是空的,后续不会更新这个字段,过账记录也拿不到真实的目标仓位,如何解决呢?
FMR返程任务到达后,会上报iWMS到达仓位reachBin
,里面会携带到达的目标库区和目标仓位,可以考虑此时反向更新对应库存变更记录
需要修改过账的触发时机,在过账时,如果这个库存变更记录没有目标仓位,则需要过滤掉。
package robot.wms.groovy
import robot.glory.framework.core.context.SpringContext
import robot.wms.base.change.model.StockChangeRecord
import robot.wms.base.change.param.StockChangeRecordParam
import robot.wms.base.change.service.StockChangeRecordService
import robot.wms.base.constant.WmsBaseConstant
import robot.wms.base.task.model.MoveTask
import robot.wms.framework.util.CollectionUtil
/**
* 根据移动任务号,查询库存变更记录,并更新库存变更记录的desBinCode为上报的目标仓位号。目标库区为上报的库区号
*/
def reportTaskDto = context.get('reportTaskDto')
MoveTask moveTask = context.get('moveTask')
String binCode = reportTaskDto.getBinCode();
String zoneCode = reportTaskDto.extra.values.zoneCode;
if (robot.glory.framework.util.StringUtil.isNotBlank(binCode) && moveTask != null) {
StockChangeRecordService stockChangeRecordService = SpringContext.getBean(StockChangeRecordService.class)
//根据移动任务号,查找对应的库存变更记录
String moveTaskCode = moveTask.getMoveTaskCode();
if (moveTaskCode.endsWith("RETURN")) {
moveTaskCode = moveTaskCode.substring(0, moveTaskCode.length() - 6); // 删除尾部 "RETURN"
}
List<StockChangeRecord> stockChangeRecords = stockChangeRecordService.findByParam(StockChangeRecordParam.build().setMoveTaskCode(moveTaskCode))
if(CollectionUtil.isEmpty(stockChangeRecords)){
log.debug('为空的任务' + moveTaskCode)
return
}
//更新库存变更记录的目标仓位
stockChangeRecords.forEach { o -> o.setDesBinCode(binCode) }
//更新库存变更记录的目标库区
stockChangeRecords.forEach { o -> o.setDesAreaCode(zoneCode) }
stockChangeRecordService.updateCondition(stockChangeRecords, StockChangeRecordParam.build().setDesBinCode(WmsBaseConstant.MARKER_STRING).setDesAreaCode(WmsBaseConstant.MARKER_STRING))
}
package robot.wms.groovy
import robot.glory.framework.util.StringUtil
import robot.wms.core.common.context.WmsSysContext
import robot.wms.third.account.param.AccountDto
import robot.wms.third.account.param.data.AccountData
/**
* 一个任务下的库存变更记录目标仓位必须全部存在,否则此任务不过账。
*/
AccountDto account = context.get('account')
List<AccountData> accountDataList = account.getData();
//获取 目标仓位为空的 且是入库任务类型的 移动任务单号
Set<String> moveTaskCodes = new HashSet<>()
for (AccountData data : accountDataList) {
if (StringUtil.isBlank(data.getDesBinCode()) && WmsSysContext.getIntoTaskTypeMap().containsKey(data.getTaskType())) {
moveTaskCodes.add(data.getMoveTaskCode())
}
}
//过滤没有目标仓位的 库存变更记录
accountDataList.removeIf(accountData -> moveTaskCodes.contains(accountData.getMoveTaskCode()));
context.put('account',account)
适配 4.1.2,4.1.3