PDA自动下发任务领取

This commit is contained in:
秦鸿展
2026-05-27 16:06:16 +08:00
parent 784ad7929d
commit 1280bdd67d
6 changed files with 92 additions and 11 deletions
@@ -1,6 +1,8 @@
package com.mhd.wms.application.service.deliveTask;
import com.mhd.common.security.utils.SecurityUtils;
import com.mhd.system.api.domain.cache.AssociationWarehouseCacheDO;
import com.mhd.system.api.domain.cache.SystemServiceCacheUtil;
import com.mhd.system.api.model.LoginUser;
import com.mhd.wms.domain.deliveTask.repository.po.DeliveTaskPO;
import com.mhd.wms.domain.deliveTask.repository.po.DeliveTaskSumPO;
@@ -47,8 +49,17 @@ public class DeliveTaskApplicationService {
if (topOrganizationId != null && topOrganizationId != 1){
deliveTaskDO.setTopOrganizationId(loginUser.getUserPo().getTopOrganizationId());
}
// 只查询下发给当前登录用户的任务(对应 task_distribution_id = 当前用户)
deliveTaskDO.setTaskDistributionId(loginUser.getUserid());
applyPdaWarehouseScope(deliveTaskDO, loginUser);
Long tabType = deliveTaskDO.getTabType();
if (tabType != null && tabType == 1L) {
// 指派给我的:已接收(operators_by = 当前用户)
deliveTaskDO.setOperatorsBy(loginUser.getUserid());
} else if (tabType == null || tabType == 2L) {
// 任务大厅:未领取任务池(含入库审核收货、出库生成拣货单等自动下发的任务),不按下发人过滤
if (tabType == null) {
deliveTaskDO.setTabType(2L);
}
}
}
// 不按 task_status 默认过滤;若请求传入 taskStatus 则仍可按状态筛选
return deliveTaskDomainService.queryListApp(deliveTaskDO);
@@ -107,10 +118,23 @@ public class DeliveTaskApplicationService {
deliveTaskDO.setTopOrganizationId(loginUser.getUserPo().getTopOrganizationId());
deliveTaskDO.setOperatorsBy(loginUser.getUserid());
}
applyPdaWarehouseScope(deliveTaskDO, loginUser);
}
return deliveTaskDomainService.querySum(deliveTaskDO);
}
/** PDA:按用户绑定仓库过滤任务(与收货/上架等 App 列表一致) */
private static void applyPdaWarehouseScope(DeliveTaskDO deliveTaskDO, LoginUser loginUser) {
if (deliveTaskDO.getWarehouseId() != null) {
return;
}
AssociationWarehouseCacheDO warehouseCache =
SystemServiceCacheUtil.getAssociationWarehouseCache(loginUser.getUserid());
if (warehouseCache != null && warehouseCache.getWarehouseId() != null) {
deliveTaskDO.setWarehouseId(warehouseCache.getWarehouseId());
}
}
public Boolean forward(DeliveTaskDO deliveTaskDO) {
return deliveTaskDomainService.updateById(deliveTaskDO);
}
@@ -99,7 +99,7 @@ public class DeliveTaskImpl extends ServiceImpl<DeliveTaskMapper, DeliveTask> im
@Override
public List<DeliveTaskPO> queryListApp(DeliveTaskDO deliveTaskDO)
{
// App 列表条件见 DeliveTaskMapper.queryListApp / selectDeliveTaskPoApp1不按 tabType、operators_by 过滤
// App 列表条件见 DeliveTaskMapper.queryListApp / selectDeliveTaskPoApp1tabType=2 任务大厅 / tabType=1 指派给我
List<DeliveTaskPO> deliveTaskPOS = deliveTaskMapper.queryListApp(deliveTaskDO);
if (deliveTaskDO.getTaskType() == 7){
statistics(deliveTaskPOS);
@@ -14,6 +14,7 @@ import com.mhd.common.core.utils.bean.BeanUtils;
import com.mhd.common.core.utils.uuid.IdGenerator;
import com.mhd.common.security.utils.SecurityUtils;
import com.mhd.system.api.model.LoginUser;
import com.mhd.wms.domain.deliveTask.entity.DeliveTask;
import com.mhd.wms.domain.deliveTask.repository.facade.IDeliveTaskService;
import com.mhd.wms.domain.deliveTask.repository.todo.DeliveTaskDO;
import com.mhd.wms.domain.handoverTaskOrder.repository.facade.IHandoverTaskOrderService;
@@ -932,15 +933,20 @@ public class PickingOrderDomainService {
: loginUser.getUsername();
List<DeliveTaskDO> deliveTaskDOList = new ArrayList<>();
for (StockOutTaskOrderDO stockOutTaskOrderDO : stockOutTaskOrderDOList){
if (StringUtils.isNotBlank(stockOutTaskOrderDO.getTaskNumber())
&& deliveTaskService.count(new LambdaQueryWrapper<DeliveTask>()
.eq(DeliveTask::getTrackingNumber, stockOutTaskOrderDO.getTaskNumber())
.eq(DeliveTask::getTaskType, 3)
.eq(DeliveTask::getDelFlag, 1)) > 0) {
continue;
}
DeliveTaskDO deliveTaskDO = new DeliveTaskDO();
deliveTaskDO.setOrganizationId(loginUser.getUserPo().getOrganizationId());
deliveTaskDO.setOrganizationName(loginUser.getUserPo().getOrganizationName());
deliveTaskDO.setTopOrganizationId(loginUser.getUserPo().getTopOrganizationId());
deliveTaskDO.setTaskNumber(OrderSequence.getOrderCode("RW"));
deliveTaskDO.setTrackingNumber(stockOutTaskOrderDO.getTaskNumber());
deliveTaskDO.setWarehouseId(stockOutTaskOrderDO.getWarehouseId());
deliveTaskDO.setWarehouseCode(stockOutTaskOrderDO.getWarehouseCode());
deliveTaskDO.setWarehouseName(stockOutTaskOrderDO.getWarehouseName());
fillPickingDeliveTaskWarehouse(deliveTaskDO, stockOutTaskOrderDO);
deliveTaskDO.setTaskType(3);
deliveTaskDO.setTaskDistribution(1);
deliveTaskDO.setTaskDistributionId(loginUser.getUserid());
@@ -954,6 +960,46 @@ public class PickingOrderDomainService {
deliveTaskDO.setCreateTime(new Date());
deliveTaskDOList.add(deliveTaskDO);
}
deliveTaskService.batchInsert(deliveTaskDOList);
if (!deliveTaskDOList.isEmpty()) {
deliveTaskService.batchInsert(deliveTaskDOList);
}
}
/**
* 拣货类 delive_task 仓库:优先作业单/拣货单,否则按来源单号查出库单或波次单仓库(供 PDA 任务大厅按绑定仓库过滤)。
*/
private void fillPickingDeliveTaskWarehouse(DeliveTaskDO deliveTaskDO, StockOutTaskOrderDO stockOutTaskOrderDO) {
Long warehouseId = stockOutTaskOrderDO.getWarehouseId();
String warehouseCode = stockOutTaskOrderDO.getWarehouseCode();
String warehouseName = stockOutTaskOrderDO.getWarehouseName();
if (warehouseId != null && warehouseId != 0L) {
deliveTaskDO.setWarehouseId(warehouseId);
deliveTaskDO.setWarehouseCode(warehouseCode);
deliveTaskDO.setWarehouseName(warehouseName);
return;
}
String orderNumber = stockOutTaskOrderDO.getOrderNumber();
if (StringUtils.isBlank(orderNumber)) {
return;
}
StockOutOrder stockOutOrder = stockOutOrderService.getOne(new LambdaQueryWrapper<StockOutOrder>()
.eq(StockOutOrder::getOutOrderNumber, orderNumber)
.eq(StockOutOrder::getDelFlag, 1)
.last("LIMIT 1"));
if (stockOutOrder != null && stockOutOrder.getWarehouseId() != null) {
deliveTaskDO.setWarehouseId(stockOutOrder.getWarehouseId());
deliveTaskDO.setWarehouseCode(stockOutOrder.getWarehouseCode());
deliveTaskDO.setWarehouseName(stockOutOrder.getWarehouseName());
return;
}
WaveOrder waveOrder = waveOrderService.getOne(new LambdaQueryWrapper<WaveOrder>()
.eq(WaveOrder::getWaveOrderNumber, orderNumber)
.eq(WaveOrder::getDelFlag, 1)
.last("LIMIT 1"));
if (waveOrder != null && waveOrder.getWarehouseId() != null) {
deliveTaskDO.setWarehouseId(waveOrder.getWarehouseId());
deliveTaskDO.setWarehouseCode(waveOrder.getWarehouseCode());
deliveTaskDO.setWarehouseName(waveOrder.getWarehouseName());
}
}
}
@@ -630,6 +630,11 @@ public class StockOutOrderDomainService {
pickingOrderDO.setOrderNumber(p.getOutOrderNumber());
pickingOrderDO.setPickingOrderNumber(OrderSequence.getOrderCode("JH"));
pickingOrderDO.setQuantity(p.getAllocationQuantity());
if (pickingOrderDO.getWarehouseId() == null && p.getWarehouseId() != null) {
pickingOrderDO.setWarehouseId(p.getWarehouseId());
pickingOrderDO.setWarehouseCode(p.getWarehouseCode());
pickingOrderDO.setWarehouseName(p.getWarehouseName());
}
List<OutMaterialDetailPO> outMaterialDetailPOS = outMaterialDetailPOListMap.get(p.getOutOrderNumber());
// 出库单头 warehouse_code 常为空,用已分配明细(含子行)第一条有仓库编码的行兜底
OutMaterialDetailPO warehouseFromDetail = firstOutDetailWithWarehouse(outMaterialDetailPOS);
@@ -31,9 +31,9 @@ public class DeliveTaskAppApi extends BaseController {
private DeliveTaskAssembler deliveTaskAssembler;
/**
* 分页查询下发任务列表条件del_flag=1当前一级组织请求参数 warehouseId
* task_distribution_id=当前登录用户不按 task_status 过滤入参传入 taskStatus 时可选筛状态
* PC 列表不同不按 tabType/operators_by 过滤
* 分页查询下发任务列表条件del_flag=1当前一级组织绑定仓库未传 warehouseId 时取用户仓库绑定
* {@code tabType=2} 任务大厅operators_by 为空含收货/上架/拣货等自动下发任务
* {@code tabType=1} 指派给我的operators_by=当前用户不按 task_status 默认过滤
*/
@ApiOperation("查询下发任务列表")
@GetMapping("/list")
@@ -138,7 +138,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
</if>
</where>
</sql>
<!-- PDA 下发任务列表:del_flag、top_organization_id、warehouse_id、task_status、task_distribution_id 为主条件,不按 operators_by/tabType 过滤 -->
<!-- PDA 下发任务列表:del_flag、组织、仓库、tabType(1=指派给我/2=任务大厅未领取) 等 -->
<sql id="selectDeliveTaskPoApp1">
<where>
del_flag = 1
@@ -196,6 +196,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="taskDistributionName != null and taskDistributionName != ''">
and task_distribution_name like concat('%', #{taskDistributionName}, '%')
</if>
<if test="tabType != null and tabType==1">
and operators_by = #{operatorsBy}
</if>
<if test="tabType != null and tabType==2">
and operators_by IS NULL
</if>
<if test="operatorsName != null and operatorsName != ''">
and operators_name like concat('%', #{operatorsName}, '%')
</if>