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; package com.mhd.wms.application.service.deliveTask;
import com.mhd.common.security.utils.SecurityUtils; 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.system.api.model.LoginUser;
import com.mhd.wms.domain.deliveTask.repository.po.DeliveTaskPO; import com.mhd.wms.domain.deliveTask.repository.po.DeliveTaskPO;
import com.mhd.wms.domain.deliveTask.repository.po.DeliveTaskSumPO; import com.mhd.wms.domain.deliveTask.repository.po.DeliveTaskSumPO;
@@ -47,8 +49,17 @@ public class DeliveTaskApplicationService {
if (topOrganizationId != null && topOrganizationId != 1){ if (topOrganizationId != null && topOrganizationId != 1){
deliveTaskDO.setTopOrganizationId(loginUser.getUserPo().getTopOrganizationId()); deliveTaskDO.setTopOrganizationId(loginUser.getUserPo().getTopOrganizationId());
} }
// 只查询下发给当前登录用户的任务(对应 task_distribution_id = 当前用户) applyPdaWarehouseScope(deliveTaskDO, loginUser);
deliveTaskDO.setTaskDistributionId(loginUser.getUserid()); 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 则仍可按状态筛选 // 不按 task_status 默认过滤;若请求传入 taskStatus 则仍可按状态筛选
return deliveTaskDomainService.queryListApp(deliveTaskDO); return deliveTaskDomainService.queryListApp(deliveTaskDO);
@@ -107,10 +118,23 @@ public class DeliveTaskApplicationService {
deliveTaskDO.setTopOrganizationId(loginUser.getUserPo().getTopOrganizationId()); deliveTaskDO.setTopOrganizationId(loginUser.getUserPo().getTopOrganizationId());
deliveTaskDO.setOperatorsBy(loginUser.getUserid()); deliveTaskDO.setOperatorsBy(loginUser.getUserid());
} }
applyPdaWarehouseScope(deliveTaskDO, loginUser);
} }
return deliveTaskDomainService.querySum(deliveTaskDO); 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) { public Boolean forward(DeliveTaskDO deliveTaskDO) {
return deliveTaskDomainService.updateById(deliveTaskDO); return deliveTaskDomainService.updateById(deliveTaskDO);
} }
@@ -99,7 +99,7 @@ public class DeliveTaskImpl extends ServiceImpl<DeliveTaskMapper, DeliveTask> im
@Override @Override
public List<DeliveTaskPO> queryListApp(DeliveTaskDO deliveTaskDO) 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); List<DeliveTaskPO> deliveTaskPOS = deliveTaskMapper.queryListApp(deliveTaskDO);
if (deliveTaskDO.getTaskType() == 7){ if (deliveTaskDO.getTaskType() == 7){
statistics(deliveTaskPOS); 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.core.utils.uuid.IdGenerator;
import com.mhd.common.security.utils.SecurityUtils; import com.mhd.common.security.utils.SecurityUtils;
import com.mhd.system.api.model.LoginUser; 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.facade.IDeliveTaskService;
import com.mhd.wms.domain.deliveTask.repository.todo.DeliveTaskDO; import com.mhd.wms.domain.deliveTask.repository.todo.DeliveTaskDO;
import com.mhd.wms.domain.handoverTaskOrder.repository.facade.IHandoverTaskOrderService; import com.mhd.wms.domain.handoverTaskOrder.repository.facade.IHandoverTaskOrderService;
@@ -932,15 +933,20 @@ public class PickingOrderDomainService {
: loginUser.getUsername(); : loginUser.getUsername();
List<DeliveTaskDO> deliveTaskDOList = new ArrayList<>(); List<DeliveTaskDO> deliveTaskDOList = new ArrayList<>();
for (StockOutTaskOrderDO stockOutTaskOrderDO : stockOutTaskOrderDOList){ 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 deliveTaskDO = new DeliveTaskDO();
deliveTaskDO.setOrganizationId(loginUser.getUserPo().getOrganizationId()); deliveTaskDO.setOrganizationId(loginUser.getUserPo().getOrganizationId());
deliveTaskDO.setOrganizationName(loginUser.getUserPo().getOrganizationName()); deliveTaskDO.setOrganizationName(loginUser.getUserPo().getOrganizationName());
deliveTaskDO.setTopOrganizationId(loginUser.getUserPo().getTopOrganizationId()); deliveTaskDO.setTopOrganizationId(loginUser.getUserPo().getTopOrganizationId());
deliveTaskDO.setTaskNumber(OrderSequence.getOrderCode("RW")); deliveTaskDO.setTaskNumber(OrderSequence.getOrderCode("RW"));
deliveTaskDO.setTrackingNumber(stockOutTaskOrderDO.getTaskNumber()); deliveTaskDO.setTrackingNumber(stockOutTaskOrderDO.getTaskNumber());
deliveTaskDO.setWarehouseId(stockOutTaskOrderDO.getWarehouseId()); fillPickingDeliveTaskWarehouse(deliveTaskDO, stockOutTaskOrderDO);
deliveTaskDO.setWarehouseCode(stockOutTaskOrderDO.getWarehouseCode());
deliveTaskDO.setWarehouseName(stockOutTaskOrderDO.getWarehouseName());
deliveTaskDO.setTaskType(3); deliveTaskDO.setTaskType(3);
deliveTaskDO.setTaskDistribution(1); deliveTaskDO.setTaskDistribution(1);
deliveTaskDO.setTaskDistributionId(loginUser.getUserid()); deliveTaskDO.setTaskDistributionId(loginUser.getUserid());
@@ -954,6 +960,46 @@ public class PickingOrderDomainService {
deliveTaskDO.setCreateTime(new Date()); deliveTaskDO.setCreateTime(new Date());
deliveTaskDOList.add(deliveTaskDO); 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.setOrderNumber(p.getOutOrderNumber());
pickingOrderDO.setPickingOrderNumber(OrderSequence.getOrderCode("JH")); pickingOrderDO.setPickingOrderNumber(OrderSequence.getOrderCode("JH"));
pickingOrderDO.setQuantity(p.getAllocationQuantity()); 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()); List<OutMaterialDetailPO> outMaterialDetailPOS = outMaterialDetailPOListMap.get(p.getOutOrderNumber());
// 出库单头 warehouse_code 常为空,用已分配明细(含子行)第一条有仓库编码的行兜底 // 出库单头 warehouse_code 常为空,用已分配明细(含子行)第一条有仓库编码的行兜底
OutMaterialDetailPO warehouseFromDetail = firstOutDetailWithWarehouse(outMaterialDetailPOS); OutMaterialDetailPO warehouseFromDetail = firstOutDetailWithWarehouse(outMaterialDetailPOS);
@@ -31,9 +31,9 @@ public class DeliveTaskAppApi extends BaseController {
private DeliveTaskAssembler deliveTaskAssembler; private DeliveTaskAssembler deliveTaskAssembler;
/** /**
* 分页查询下发任务列表条件del_flag=1当前一级组织请求参数 warehouseId * 分页查询下发任务列表条件del_flag=1当前一级组织绑定仓库未传 warehouseId 时取用户仓库绑定
* task_distribution_id=当前登录用户不按 task_status 过滤入参传入 taskStatus 时可选筛状态 * {@code tabType=2} 任务大厅operators_by 为空含收货/上架/拣货等自动下发任务
* PC 列表不同不按 tabType/operators_by 过滤 * {@code tabType=1} 指派给我的operators_by=当前用户不按 task_status 默认过滤
*/ */
@ApiOperation("查询下发任务列表") @ApiOperation("查询下发任务列表")
@GetMapping("/list") @GetMapping("/list")
@@ -138,7 +138,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
</if> </if>
</where> </where>
</sql> </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"> <sql id="selectDeliveTaskPoApp1">
<where> <where>
del_flag = 1 del_flag = 1
@@ -196,6 +196,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="taskDistributionName != null and taskDistributionName != ''"> <if test="taskDistributionName != null and taskDistributionName != ''">
and task_distribution_name like concat('%', #{taskDistributionName}, '%') and task_distribution_name like concat('%', #{taskDistributionName}, '%')
</if> </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 != ''"> <if test="operatorsName != null and operatorsName != ''">
and operators_name like concat('%', #{operatorsName}, '%') and operators_name like concat('%', #{operatorsName}, '%')
</if> </if>