From 749cb50282952cb95c3fe0928b9b2949da3da9d9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A7=A6=E9=B8=BF=E5=B1=95?= <18031053041@163.com> Date: Tue, 28 Apr 2026 08:46:44 +0800 Subject: [PATCH] =?UTF-8?q?PDA=E4=B8=8B=E5=8F=91=E4=BB=BB=E5=8A=A1?= =?UTF-8?q?=E6=A0=8F=E9=A2=86=E5=8F=96=E4=BB=BB=E5=8A=A1=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DeliveTaskApplicationService.java | 5 +- .../ReviewOrderApplicationService.java | 20 ++- .../factorys/DeliveTaskServiceFactory.java | 5 +- .../repository/facade/IDeliveTaskService.java | 5 + .../persistence/DeliveTaskImpl.java | 14 +-- .../service/DeliveTaskDomainService.java | 32 ++++- .../persistence/HandoverTaskOrderImpl.java | 21 +++- .../HandoverTaskOrderDomainService.java | 68 +++++++++- .../service/PickingOrderDomainService.java | 62 +++++++++- .../repository/todo/ReviewOrderDO.java | 6 + .../service/StockInOrderDomainService.java | 2 +- .../service/StockOutOrderDomainService.java | 4 +- .../StockOutTaskOrderDomainService.java | 17 +++ .../entity/StockReceiptOrder.java | 20 +++ .../StockReceiptOrderDomainService.java | 116 ++++++++++++++++-- .../service/StockShelfOrderDomainService.java | 88 +++++++++++-- .../deliveTask/DeliveTaskAppApi.java | 5 +- .../reviewOrder/ReviewOrderAppApi.java | 4 +- .../StockReceiptOrderAppApi.java | 7 +- .../mapper/deliveTask/DeliveTaskMapper.xml | 74 ++++++++++- .../mapper/reviewOrder/ReviewOrderMapper.xml | 3 + .../stockShelfOrder/StockShelfOrderMapper.xml | 4 +- 22 files changed, 522 insertions(+), 60 deletions(-) diff --git a/mhd_wms/src/main/java/com/mhd/wms/application/service/deliveTask/DeliveTaskApplicationService.java b/mhd_wms/src/main/java/com/mhd/wms/application/service/deliveTask/DeliveTaskApplicationService.java index 58f3b21f1..9fe86c797 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/application/service/deliveTask/DeliveTaskApplicationService.java +++ b/mhd_wms/src/main/java/com/mhd/wms/application/service/deliveTask/DeliveTaskApplicationService.java @@ -47,9 +47,10 @@ public class DeliveTaskApplicationService { if (topOrganizationId != null && topOrganizationId != 1){ deliveTaskDO.setTopOrganizationId(loginUser.getUserPo().getTopOrganizationId()); } - // 只查询下发给当前登录用户的任务 - deliveTaskDO.setOperatorsBy(loginUser.getUserid()); + // 只查询下发给当前登录用户的任务(对应 task_distribution_id = 当前用户) + deliveTaskDO.setTaskDistributionId(loginUser.getUserid()); } + // 不按 task_status 默认过滤;若请求传入 taskStatus 则仍可按状态筛选 return deliveTaskDomainService.queryListApp(deliveTaskDO); } diff --git a/mhd_wms/src/main/java/com/mhd/wms/application/service/reviewOrder/ReviewOrderApplicationService.java b/mhd_wms/src/main/java/com/mhd/wms/application/service/reviewOrder/ReviewOrderApplicationService.java index 58591ca43..8e884d7c7 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/application/service/reviewOrder/ReviewOrderApplicationService.java +++ b/mhd_wms/src/main/java/com/mhd/wms/application/service/reviewOrder/ReviewOrderApplicationService.java @@ -22,6 +22,7 @@ import com.mhd.wms.domain.deliveTask.repository.todo.DeliveTaskDO; import com.mhd.wms.domain.handoverTaskOrder.entity.HandoverTaskOrder; import com.mhd.wms.domain.handoverTaskOrder.repository.facade.IHandoverTaskOrderService; import com.mhd.wms.domain.handoverTaskOrder.repository.todo.HandoverTaskOrderDO; +import com.mhd.wms.domain.handoverTaskOrder.service.HandoverTaskOrderDomainService; import com.mhd.wms.domain.outMaterialDetail.entity.OutMaterialDetail; import com.mhd.wms.domain.outMaterialDetail.repository.mapper.OutMaterialDetailMapper; import com.mhd.wms.domain.outOrderAbnormal.repository.facade.IOutOrderAbnormalService; @@ -87,6 +88,9 @@ public class ReviewOrderApplicationService { @Autowired private IHandoverTaskOrderService handoverTaskOrderService; + @Autowired + private HandoverTaskOrderDomainService handoverTaskOrderDomainService; + @Autowired private OutMaterialDetailMapper outMaterialDetailMapper; @Autowired @@ -117,6 +121,8 @@ public class ReviewOrderApplicationService { query.setReviewStatus(3); } else { query.setLtReviewStatus(3); + // 待办仅展示已在下发任务中「接收」的复核单(receive_time 由接收 delive_task 回写);否则会出现未接收仍出现在列表 + query.setOnlyReceived(1); } query.setIssuedFlag("1"); if (query.getDelFlag() == null) { @@ -464,7 +470,10 @@ public class ReviewOrderApplicationService { } handoverTaskOrderDO.setCreateByName(userRealName); handoverTaskOrderDO.setCreateTime(new Date()); - handoverTaskOrderService.insert(handoverTaskOrderDO); + Boolean inserted = handoverTaskOrderService.insert(handoverTaskOrderDO); + if (Boolean.TRUE.equals(inserted) && StringUtils.isNotEmpty(handoverTaskOrderDO.getTaskNumber())) { + handoverTaskOrderDomainService.autoDistributeHandoverAfterInsertByTaskNumber(handoverTaskOrderDO.getTaskNumber(), loginUser); + } } /** @@ -519,9 +528,8 @@ public class ReviewOrderApplicationService { if (header == null || !"0".equals(header.getIssuedFlag())) { return; } + // 与入库收货自动下发一致:不在下发时预填作业人,仅在 PDA/PC「接收任务」后写入 delive_task ReviewOrderDO cmd = new ReviewOrderDO(); - cmd.setCheckOperatorsBy(loginUser.getUserid()); - cmd.setCheckOperatorsName(resolveLoginDisplayName(loginUser)); applyReviewTaskDistribution(Collections.singletonList(header), cmd, loginUser); } @@ -572,11 +580,11 @@ public class ReviewOrderApplicationService { deliveTaskDO.setTaskDistributionId(loginUser.getUserid()); deliveTaskDO.setTaskDistributionName(userRealName); deliveTaskDO.setTaskDistributionTime(new Date()); + // PC 复核下发可传 checkOperatorsBy/Name 预指派人;未传则留空,与收货/上架类任务一致,接收时再赋值 Long operatorsBy = reviewOrderDO != null ? reviewOrderDO.getCheckOperatorsBy() : null; String operatorsName = reviewOrderDO != null ? reviewOrderDO.getCheckOperatorsName() : null; - if (operatorsBy == null || operatorsBy == 0) { - operatorsBy = loginUser.getUserid(); - operatorsName = (operatorsName != null && !operatorsName.isEmpty()) ? operatorsName : userRealName; + if (operatorsBy != null && operatorsBy == 0L) { + operatorsBy = null; } deliveTaskDO.setOperatorsBy(operatorsBy); deliveTaskDO.setOperatorsName(operatorsName); diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/deliveTask/factorys/DeliveTaskServiceFactory.java b/mhd_wms/src/main/java/com/mhd/wms/domain/deliveTask/factorys/DeliveTaskServiceFactory.java index fc309ec7a..066c24ed9 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/deliveTask/factorys/DeliveTaskServiceFactory.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/deliveTask/factorys/DeliveTaskServiceFactory.java @@ -29,7 +29,7 @@ public class DeliveTaskServiceFactory { */ public IDeliveTaskTypeService getDeliveTaskTypeService(Integer taskType) { String deliveTaskType = ""; - //任务类型 0-无 1-收货 2-上架 3-拣货 4-复核 5-移位 6-盘点 + //任务类型 0-无 1-收货 2-上架 3-拣货 4-复核 5-移位 6-盘点 7-交接作业单 switch (taskType){ case 1: deliveTaskType = "stockReceiptOrderImpl"; @@ -49,6 +49,9 @@ public class DeliveTaskServiceFactory { case 6: deliveTaskType = "investigationManageImpl"; break; + case 7: + deliveTaskType = "handoverTaskOrderImpl"; + break; default: throw new ServiceException("任务类型不存在"); } diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/deliveTask/repository/facade/IDeliveTaskService.java b/mhd_wms/src/main/java/com/mhd/wms/domain/deliveTask/repository/facade/IDeliveTaskService.java index 7714f15c9..13f661ae9 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/deliveTask/repository/facade/IDeliveTaskService.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/deliveTask/repository/facade/IDeliveTaskService.java @@ -52,6 +52,11 @@ public interface IDeliveTaskService extends IService public int refuse(Long deliverTaskId); + /** + * 更新下发任务作业人(接收时写入当前用户) + */ + int updateOperatorsBy(Long deliverTaskId, Long operatorsBy, String operatorsName); + /** * 查询列表表头数量 */ diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/deliveTask/repository/persistence/DeliveTaskImpl.java b/mhd_wms/src/main/java/com/mhd/wms/domain/deliveTask/repository/persistence/DeliveTaskImpl.java index d5a07e167..58aff4d5b 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/deliveTask/repository/persistence/DeliveTaskImpl.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/deliveTask/repository/persistence/DeliveTaskImpl.java @@ -99,14 +99,7 @@ public class DeliveTaskImpl extends ServiceImpl im @Override public List queryListApp(DeliveTaskDO deliveTaskDO) { - LoginUser loginUser = SecurityUtils.getLoginUser(); - if (null != deliveTaskDO.getTabType()) { - if (deliveTaskDO.getTabType() == 1) { - deliveTaskDO.setOperatorsBy(loginUser.getUserid()); - } else if (deliveTaskDO.getTabType() == 2) { - deliveTaskDO.setOperatorsBy(null); - } - } + // App 列表条件见 DeliveTaskMapper.queryListApp / selectDeliveTaskPoApp1(不按 tabType、operators_by 过滤) List deliveTaskPOS = deliveTaskMapper.queryListApp(deliveTaskDO); if (deliveTaskDO.getTaskType() == 7){ statistics(deliveTaskPOS); @@ -277,6 +270,11 @@ public class DeliveTaskImpl extends ServiceImpl im public int receive(Long deliverTaskId) { return deliveTaskMapper.receive(deliverTaskId,1); } + + @Override + public int updateOperatorsBy(Long deliverTaskId, Long operatorsBy, String operatorsName) { + return deliveTaskMapper.updateOperatorsBy(deliverTaskId, operatorsBy, operatorsName); + } /** * 拒绝操作 */ diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/deliveTask/service/DeliveTaskDomainService.java b/mhd_wms/src/main/java/com/mhd/wms/domain/deliveTask/service/DeliveTaskDomainService.java index ecc412453..2e04e6075 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/deliveTask/service/DeliveTaskDomainService.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/deliveTask/service/DeliveTaskDomainService.java @@ -2,6 +2,8 @@ package com.mhd.wms.domain.deliveTask.service; import com.mhd.common.core.exception.ServiceException; import com.mhd.common.core.utils.bean.BeanUtils; +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.factorys.DeliveTaskServiceFactory; import com.mhd.wms.domain.deliveTask.repository.facade.IDeliveTaskService; @@ -12,6 +14,7 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.StringUtils; import java.util.List; @@ -85,17 +88,42 @@ public class DeliveTaskDomainService { if (deliveTask.getTaskStatus() > 0){ throw new ServiceException("任务已处理,请勿重复处理"); } + LoginUser loginUser = SecurityUtils.getLoginUser(); + if (loginUser == null) { + throw new ServiceException("用户未登录"); + } int count = deliveTaskService.receive(deliverTaskId); if (count == 0) { throw new ServiceException("接受任务失败"); } + + String operatorsName = resolveLoginDisplayName(loginUser); + if (!StringUtils.hasText(operatorsName)) { + operatorsName = loginUser.getUsername() != null ? loginUser.getUsername() : ""; + } + deliveTaskService.updateOperatorsBy(deliverTaskId, loginUser.getUserid(), operatorsName); + DeliveTaskDO deliveTaskDO = new DeliveTaskDO(); deliveTaskDO.setTrackingNumber(deliveTask.getTrackingNumber()); - deliveTaskDO.setOperatorsBy(deliveTask.getOperatorsBy()); - deliveTaskDO.setOperatorsName(deliveTask.getOperatorsName()); + deliveTaskDO.setOperatorsBy(loginUser.getUserid()); + deliveTaskDO.setOperatorsName(operatorsName); deliveTaskServiceFactory.getDeliveTaskTypeService(deliveTask.getTaskType()).handleDeliveTask(deliveTaskDO); return count; } + + /** 与复核等模块一致:优先 UserPo 真实姓名,其次 realname,最后登录账号 */ + private static String resolveLoginDisplayName(LoginUser loginUser) { + if (loginUser == null) { + return null; + } + if (loginUser.getUserPo() != null && StringUtils.hasText(loginUser.getUserPo().getUserName())) { + return loginUser.getUserPo().getUserName(); + } + if (StringUtils.hasText(loginUser.getRealname())) { + return loginUser.getRealname(); + } + return loginUser.getUsername(); + } /** * 拒绝操作 */ diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/handoverTaskOrder/repository/persistence/HandoverTaskOrderImpl.java b/mhd_wms/src/main/java/com/mhd/wms/domain/handoverTaskOrder/repository/persistence/HandoverTaskOrderImpl.java index 130309390..e379d06e9 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/handoverTaskOrder/repository/persistence/HandoverTaskOrderImpl.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/handoverTaskOrder/repository/persistence/HandoverTaskOrderImpl.java @@ -1,9 +1,12 @@ package com.mhd.wms.domain.handoverTaskOrder.repository.persistence; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.mhd.common.security.utils.SecurityUtils; import com.mhd.system.api.model.LoginUser; +import com.mhd.wms.domain.deliveTask.repository.facade.IDeliveTaskTypeService; +import com.mhd.wms.domain.deliveTask.repository.todo.DeliveTaskDO; import com.mhd.wms.domain.handoverTaskOrder.entity.HandoverTaskOrder; import com.mhd.wms.domain.handoverTaskOrder.repository.facade.IHandoverTaskOrderService; import com.mhd.wms.domain.handoverTaskOrder.repository.mapper.HandoverTaskOrderMapper; @@ -27,7 +30,7 @@ import java.util.stream.Collectors; * @date 2024-05-28 */ @Service -public class HandoverTaskOrderImpl extends ServiceImpl implements IHandoverTaskOrderService { +public class HandoverTaskOrderImpl extends ServiceImpl implements IHandoverTaskOrderService, IDeliveTaskTypeService { @Autowired private HandoverTaskOrderMapper handoverTaskOrderMapper; @@ -118,4 +121,20 @@ public class HandoverTaskOrderImpl extends ServiceImpl 0; } + /** + * PDA 接收交接下发任务(taskType=7)后,按交接作业单号回写作业人(trackingNumber = task_number) + */ + @Override + public Boolean handleDeliveTask(DeliveTaskDO deliveTaskDO) { + LoginUser loginUser = SecurityUtils.getLoginUser(); + return update(null, new UpdateWrapper().lambda() + .set(HandoverTaskOrder::getOperatorsBy, deliveTaskDO.getOperatorsBy()) + .set(HandoverTaskOrder::getOperatorsName, deliveTaskDO.getOperatorsName()) + .set(HandoverTaskOrder::getUpdateBy, loginUser != null ? loginUser.getUserid() : null) + .set(HandoverTaskOrder::getUpdateByName, loginUser != null ? loginUser.getUsername() : null) + .set(HandoverTaskOrder::getUpdateTime, new Date()) + .eq(HandoverTaskOrder::getTaskNumber, deliveTaskDO.getTrackingNumber()) + .eq(HandoverTaskOrder::getDelFlag, 1)); + } + } \ No newline at end of file diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/handoverTaskOrder/service/HandoverTaskOrderDomainService.java b/mhd_wms/src/main/java/com/mhd/wms/domain/handoverTaskOrder/service/HandoverTaskOrderDomainService.java index 9b71d74e4..2cd2edb42 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/handoverTaskOrder/service/HandoverTaskOrderDomainService.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/handoverTaskOrder/service/HandoverTaskOrderDomainService.java @@ -14,6 +14,7 @@ import com.mhd.system.api.model.LoginUser; import com.mhd.wms.domain.copyCodeReference.entity.CopyCodeReference; import com.mhd.wms.domain.copyCodeReference.repository.facade.ICopyCodeReferenceService; import com.mhd.wms.domain.copyCodeReference.service.CopyCodeReferenceDomainService; +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.entity.HandoverTaskOrder; @@ -575,9 +576,20 @@ public class HandoverTaskOrderDomainService { private void genDeliveTask(List handoverTaskOrders, HandoverTaskOrderDO handoverTaskOrderDO) { LoginUser loginUser = SecurityUtils.getLoginUser(); - // 获取用户姓名(优先从UserPo获取,如果为空则使用realname,最后使用username作为兜底) - final String userRealName = (loginUser.getUserPo() != null && loginUser.getUserPo().getUserName() != null - && !loginUser.getUserPo().getUserName().trim().isEmpty()) + Long operatorsBy = handoverTaskOrderDO != null ? handoverTaskOrderDO.getOperatorsBy() : null; + String operatorsName = handoverTaskOrderDO != null ? handoverTaskOrderDO.getOperatorsName() : null; + insertDeliveTasksForHandoverOrders(handoverTaskOrders, operatorsBy, operatorsName, loginUser); + } + + /** + * 写入交接类下发任务(taskType=7,trackingNumber=交接作业单号),与 PC「交接任务下发」一致。 + */ + private void insertDeliveTasksForHandoverOrders(List handoverTaskOrders, Long operatorsBy, String operatorsName, LoginUser loginUser) { + if (CollectionUtils.isEmpty(handoverTaskOrders) || loginUser == null || loginUser.getUserPo() == null) { + return; + } + final String userRealName = (loginUser.getUserPo().getUserName() != null + && !loginUser.getUserPo().getUserName().trim().isEmpty()) ? loginUser.getUserPo().getUserName() : (loginUser.getRealname() != null && !loginUser.getRealname().trim().isEmpty()) ? loginUser.getRealname() @@ -598,8 +610,8 @@ public class HandoverTaskOrderDomainService { deliveTaskDO.setTaskDistributionId(loginUser.getUserid()); deliveTaskDO.setTaskDistributionName(userRealName); deliveTaskDO.setTaskDistributionTime(new Date()); - deliveTaskDO.setOperatorsBy(handoverTaskOrderDO.getOperatorsBy()); - deliveTaskDO.setOperatorsName(handoverTaskOrderDO.getOperatorsName()); + deliveTaskDO.setOperatorsBy(operatorsBy); + deliveTaskDO.setOperatorsName(operatorsName); deliveTaskDO.setCreateBy(loginUser.getUserid()); deliveTaskDO.setCreateByName(userRealName); deliveTaskDO.setCreateTime(new Date()); @@ -608,6 +620,50 @@ public class HandoverTaskOrderDomainService { deliveTaskService.batchInsert(deliveTaskDOList); } - + /** + * 复核完成等场景新建交接作业单后:自动写入 delive_task(taskType=7) 并将交接单标记为已下发, + * 与拣货完成后自动复核下发、PC 端「交接任务下发」效果一致(作业人不预填)。 + */ + @Transactional(rollbackFor = Exception.class) + public void autoDistributeHandoverAfterInsertByTaskNumber(String taskNumber, LoginUser loginUser) { + if (taskNumber == null || taskNumber.trim().isEmpty() || loginUser == null || loginUser.getUserPo() == null) { + log.warn("交接单自动下发任务跳过:taskNumber 或登录组织信息缺失 taskNumber={}", taskNumber); + return; + } + String tn = taskNumber.trim(); + HandoverTaskOrder ho = handoverTaskOrderService.getOne(new LambdaQueryWrapper() + .eq(HandoverTaskOrder::getTaskNumber, tn) + .eq(HandoverTaskOrder::getDelFlag, 1)); + if (ho == null) { + log.warn("交接单自动下发任务跳过:未找到作业单 taskNumber={}", tn); + return; + } + if (Integer.valueOf(1).equals(ho.getTaskDistribution())) { + return; + } + long deliveCnt = deliveTaskService.count(new LambdaQueryWrapper() + .eq(DeliveTask::getTrackingNumber, tn) + .eq(DeliveTask::getTaskType, 7) + .eq(DeliveTask::getDelFlag, 1L)); + Date now = new Date(); + if (deliveCnt > 0) { + handoverTaskOrderService.update(null, new UpdateWrapper().lambda() + .set(HandoverTaskOrder::getTaskDistribution, 1) + .set(HandoverTaskOrder::getTaskDistributionTime, now) + .set(HandoverTaskOrder::getUpdateBy, loginUser.getUserid()) + .set(HandoverTaskOrder::getUpdateByName, loginUser.getUsername()) + .set(HandoverTaskOrder::getUpdateTime, now) + .eq(HandoverTaskOrder::getHandoverTaskOrderId, ho.getHandoverTaskOrderId())); + return; + } + insertDeliveTasksForHandoverOrders(Collections.singletonList(ho), null, null, loginUser); + handoverTaskOrderService.update(null, new UpdateWrapper().lambda() + .set(HandoverTaskOrder::getTaskDistribution, 1) + .set(HandoverTaskOrder::getTaskDistributionTime, now) + .set(HandoverTaskOrder::getUpdateBy, loginUser.getUserid()) + .set(HandoverTaskOrder::getUpdateByName, loginUser.getUsername()) + .set(HandoverTaskOrder::getUpdateTime, now) + .eq(HandoverTaskOrder::getHandoverTaskOrderId, ho.getHandoverTaskOrderId())); + } } \ No newline at end of file diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/pickingOrder/service/PickingOrderDomainService.java b/mhd_wms/src/main/java/com/mhd/wms/domain/pickingOrder/service/PickingOrderDomainService.java index 53db4e9db..394ea5edd 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/pickingOrder/service/PickingOrderDomainService.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/pickingOrder/service/PickingOrderDomainService.java @@ -71,6 +71,7 @@ import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.function.Function; import java.util.stream.Collectors; @@ -189,6 +190,62 @@ public class PickingOrderDomainService { return pickingMaterialDetailService.saveBatch(pickingMaterialDetailList); } + /** + * 出库单「生成拣货单」后自动下发:生成拣货作业单 + delive_task(taskType=3),与入库审核后 + * {@link com.mhd.wms.domain.stockReceiptOrder.service.StockReceiptOrderDomainService#autoTaskDistributionAfterStockInAudit} 一致; + * 作业人仅在接收任务时写入 delive_task / 拣货作业单(拣货单主表实体未映射作业人字段,不在此更新)。 + */ + @Transactional(rollbackFor = Exception.class) + public void autoTaskDistributionAfterGenPickingOrders(List pickingOrderNumbers) { + if (CollectionUtils.isEmpty(pickingOrderNumbers)) { + return; + } + LoginUser loginUser = SecurityUtils.getLoginUser(); + if (loginUser == null || loginUser.getUserPo() == null) { + return; + } + final String userRealName = (loginUser.getUserPo().getUserName() != null + && !loginUser.getUserPo().getUserName().trim().isEmpty()) + ? loginUser.getUserPo().getUserName() + : (loginUser.getRealname() != null && !loginUser.getRealname().trim().isEmpty()) + ? loginUser.getRealname() + : loginUser.getUsername(); + List rows = pickingOrderService.list(new LambdaQueryWrapper() + .in(PickingOrder::getPickingOrderNumber, pickingOrderNumbers) + .eq(PickingOrder::getDelFlag, 1) + .and(w -> w.isNull(PickingOrder::getTaskDistribution) + .or() + .eq(PickingOrder::getTaskDistribution, 2))); + if (CollectionUtils.isEmpty(rows)) { + return; + } + List pickingOrderPODbList = rows.stream().map(r -> { + PickingOrderPO po = new PickingOrderPO(); + BeanUtils.copyProperties(r, po); + return po; + }).collect(Collectors.toList()); + PickingOrderDO ctx = new PickingOrderDO(); + ctx.setOperatorsBy(null); + ctx.setOperatorsName(null); + genStockOutTaskOrderByAllDistribution(ctx, pickingOrderPODbList); + List ids = rows.stream() + .map(PickingOrder::getPickingOrderId) + .filter(Objects::nonNull) + .collect(Collectors.toList()); + if (CollectionUtils.isEmpty(ids)) { + return; + } + Date now = new Date(); + // picking_order 表若存在作业人字段,当前实体 PickingOrder 未映射,不在此回写;作业人以 delive_task / 拣货作业单为准 + pickingOrderService.update(null, new UpdateWrapper().lambda() + .set(PickingOrder::getTaskDistribution, 1) + .set(PickingOrder::getTaskDistributionTime, now) + .set(PickingOrder::getUpdateBy, loginUser.getUserid()) + .set(PickingOrder::getUpdateByName, userRealName) + .set(PickingOrder::getUpdateTime, now) + .in(PickingOrder::getPickingOrderId, ids)); + } + /** * @description 生成物料明细实体 * @author ZhouGY @@ -889,8 +946,9 @@ public class PickingOrderDomainService { deliveTaskDO.setTaskDistributionId(loginUser.getUserid()); deliveTaskDO.setTaskDistributionName(userRealName); deliveTaskDO.setTaskDistributionTime(new Date()); - deliveTaskDO.setOperatorsBy(pickingOrderDO.getOperatorsBy()); - deliveTaskDO.setOperatorsName(pickingOrderDO.getOperatorsName()); + // 作业人仅在 PDA/PC「接收任务」后写入,与入库审核自动下发的收货类 delive_task 一致 + deliveTaskDO.setOperatorsBy(null); + deliveTaskDO.setOperatorsName(null); deliveTaskDO.setCreateBy(loginUser.getUserid()); deliveTaskDO.setCreateByName(userRealName); deliveTaskDO.setCreateTime(new Date()); diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/reviewOrder/repository/todo/ReviewOrderDO.java b/mhd_wms/src/main/java/com/mhd/wms/domain/reviewOrder/repository/todo/ReviewOrderDO.java index 6305a5000..ee8f2ff20 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/reviewOrder/repository/todo/ReviewOrderDO.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/reviewOrder/repository/todo/ReviewOrderDO.java @@ -80,4 +80,10 @@ public class ReviewOrderDO extends BaseVOEntity { @ApiModelProperty("复核状态小于该值(查询用,如待办 review_status < 3)") private Integer ltReviewStatus; + + /** + * PDA 待办:1 表示仅查已在任务中心「接收」的复核单(receive_time 非空),与 delive_task 接收后回写一致 + */ + @ApiModelProperty("仅已接收:1-是(receive_time 非空)") + private Integer onlyReceived; } diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/stockInOrder/service/StockInOrderDomainService.java b/mhd_wms/src/main/java/com/mhd/wms/domain/stockInOrder/service/StockInOrderDomainService.java index 2eafe8264..0ba442b6d 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/stockInOrder/service/StockInOrderDomainService.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/stockInOrder/service/StockInOrderDomainService.java @@ -517,7 +517,7 @@ public class StockInOrderDomainService { if (!batchInsertResult) { throw new ServiceException("生成收货单失败"); } - // 入库作业单(收货 type=1)在「收货任务下发」时生成,审核通过仅生成收货单与质检等,此处不再落 stock_in_task_order + // 收货任务不随审核自动下发,需在收货单侧手动「任务下发」(delive_task 等) return batchInsertResult; } diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/stockOutOrder/service/StockOutOrderDomainService.java b/mhd_wms/src/main/java/com/mhd/wms/domain/stockOutOrder/service/StockOutOrderDomainService.java index bfc782689..e51e44ba2 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/stockOutOrder/service/StockOutOrderDomainService.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/stockOutOrder/service/StockOutOrderDomainService.java @@ -720,7 +720,9 @@ public class StockOutOrderDomainService { } pickingOrderDOList.add(pickingOrderDO); }); - return pickingOrderDomainService.batchInsert(pickingOrderDOList); + Boolean inserted = pickingOrderDomainService.batchInsert(pickingOrderDOList); + // 拣货任务不随生成拣货单自动下发,需在拣货单侧「整单下发/明细下发」 + return inserted; } /** diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/stockOutTaskOrder/service/StockOutTaskOrderDomainService.java b/mhd_wms/src/main/java/com/mhd/wms/domain/stockOutTaskOrder/service/StockOutTaskOrderDomainService.java index b6117ec66..0715610a7 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/stockOutTaskOrder/service/StockOutTaskOrderDomainService.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/stockOutTaskOrder/service/StockOutTaskOrderDomainService.java @@ -770,6 +770,23 @@ public class StockOutTaskOrderDomainService { outOrderAbnormalService.genOutOrderAbnormal(outOrderAbnormalBaseDO, 1); //设置拣货单拣货需要更新的数据数据 updateStockOutTaskOrder(null, stockOutTaskOrderPODb, 3); + // 与 PickingOrderDomainService.completePicking 对齐:PDA 完成拣货后确保生成复核单并自动下发(delive_task taskType=4,作业人待接收) + PickingOrder pickingOrderRow = pickingOrderService.getOne(new QueryWrapper().lambda() + .eq(PickingOrder::getPickingOrderNumber, stockOutTaskOrderPODb.getPickingOrderNumber()) + .eq(PickingOrder::getDelFlag, 1)); + if (pickingOrderRow != null && Integer.valueOf(1).equals(pickingOrderRow.getType())) { + PickingOrderPO pickingOrderPO = pickingOrderService.getInfoByIdAndType( + pickingOrderRow.getPickingOrderId(), pickingOrderRow.getType()); + StockOutOrder stockOutOrder = stockOutOrderService.getOne(new LambdaQueryWrapper() + .eq(StockOutOrder::getOutOrderNumber, stockOutTaskOrderPODb.getOrderNumber()) + .eq(StockOutOrder::getDelFlag, 1)); + if (pickingOrderPO != null && stockOutOrder != null) { + Long newReviewId = reviewOrderDomainService.tryGenerateReviewOrderAfterPickingComplete(pickingOrderPO, stockOutOrder); + if (newReviewId != null) { + reviewOrderApplicationService.autoDistributeReviewAfterPickingComplete(newReviewId); + } + } + } return true; } diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/stockReceiptOrder/entity/StockReceiptOrder.java b/mhd_wms/src/main/java/com/mhd/wms/domain/stockReceiptOrder/entity/StockReceiptOrder.java index db246a2ab..47b651da7 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/stockReceiptOrder/entity/StockReceiptOrder.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/stockReceiptOrder/entity/StockReceiptOrder.java @@ -1,6 +1,7 @@ package com.mhd.wms.domain.stockReceiptOrder.entity; import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.fasterxml.jackson.annotation.JsonFormat; import com.mhd.common.core.annotation.Excel; @@ -40,6 +41,25 @@ public class StockReceiptOrder extends BaseVOEntity { @Excel(name = "一级组织表ID") private Long topOrganizationId; + /** + * 与入库单一致,列表/业务可从 stock_in_order 关联取;多数库表 stock_receipt_order 无此列,不参与持久化。 + * 若库表已执行 alter_stock_receipt_order_warehouse_dm.sql,可去掉 exist=false 以落库。 + */ + @TableField(exist = false) + @ApiModelProperty("仓库id") + @Excel(name = "仓库id") + private Long warehouseId; + + @TableField(exist = false) + @ApiModelProperty("仓库编码") + @Excel(name = "仓库编码") + private String warehouseCode; + + @TableField(exist = false) + @ApiModelProperty("仓库名称") + @Excel(name = "仓库名称") + private String warehouseName; + @ApiModelProperty("入库单号") @Excel(name = "入库单号") private String inOrderNumber; diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/stockReceiptOrder/service/StockReceiptOrderDomainService.java b/mhd_wms/src/main/java/com/mhd/wms/domain/stockReceiptOrder/service/StockReceiptOrderDomainService.java index 0173fcf13..6a71b89a0 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/stockReceiptOrder/service/StockReceiptOrderDomainService.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/stockReceiptOrder/service/StockReceiptOrderDomainService.java @@ -168,6 +168,7 @@ public class StockReceiptOrderDomainService { List receiptMaterialDetailList = new ArrayList<>(); stockReceiptOrderDOList.forEach(stockReceiptOrderDO -> { StockReceiptOrder stockReceiptOrder = JSONUtil.toBean(JSONUtil.toJsonStr(stockReceiptOrderDO), StockReceiptOrder.class); + // 仓库以入库单为准;delive_task 在 genDeliveTask 中从 stock_in_order 读取。收货单实体仓库字段 exist=false 不落库。 stockReceiptOrder.setReceiptOrderNumber(OrderSequence.getOrderCode("SH")); stockReceiptOrder.setCreateBy(loginUser.getUserid()); stockReceiptOrder.setCreateByName(userRealName); @@ -394,6 +395,12 @@ public class StockReceiptOrderDomainService { @Transactional(rollbackFor = Exception.class) public Boolean taskDistribution(StockReceiptOrderDO stockReceiptOrderDO) { LoginUser loginUser = SecurityUtils.getLoginUser(); + final String userRealName = (loginUser.getUserPo() != null && loginUser.getUserPo().getUserName() != null + && !loginUser.getUserPo().getUserName().trim().isEmpty()) + ? loginUser.getUserPo().getUserName() + : (loginUser.getRealname() != null && !loginUser.getRealname().trim().isEmpty()) + ? loginUser.getRealname() + : loginUser.getUsername(); StockReceiptOrderDO stockReceiptOrderDOQuery = new StockReceiptOrderDO(); List receiptOrderIds = stockReceiptOrderDO.getReceiptOrderIds(); if (receiptOrderIds == null || receiptOrderIds.size() == 0) { @@ -420,13 +427,67 @@ public class StockReceiptOrderDomainService { .set(StockReceiptOrder::getTaskDistributionMerge, taskDistributionMerge) .set(StockReceiptOrder::getTaskDistributionTime, new Date()) .set(StockReceiptOrder::getUpdateBy, loginUser.getUserid()) - .set(StockReceiptOrder::getUpdateByName, loginUser.getUsername()) + .set(StockReceiptOrder::getUpdateByName, userRealName) .set(StockReceiptOrder::getUpdateTime, new Date()) .set(StockReceiptOrder::getOperatorsBy, stockReceiptOrderDO.getOperatorsBy()) .set(StockReceiptOrder::getOperatorsName, stockReceiptOrderDO.getOperatorsName()) .in(StockReceiptOrder::getReceiptOrderId, stockReceiptOrderDO.getReceiptOrderIds())); } + /** + * 入库单审核通过后:自动下发收货任务(与 PC 任务下发一致生成 delive_task、收货作业单), + * 作业人在 PDA/PC 领取任务时写入 delive_task 与收货单。 + */ + @Transactional(rollbackFor = Exception.class) + public void autoTaskDistributionAfterStockInAudit(List inOrderNumbers) { + if (CollectionUtils.isEmpty(inOrderNumbers)) { + return; + } + LoginUser loginUser = SecurityUtils.getLoginUser(); + final String userRealName = (loginUser.getUserPo() != null && loginUser.getUserPo().getUserName() != null + && !loginUser.getUserPo().getUserName().trim().isEmpty()) + ? loginUser.getUserPo().getUserName() + : (loginUser.getRealname() != null && !loginUser.getRealname().trim().isEmpty()) + ? loginUser.getRealname() + : loginUser.getUsername(); + List receiptList = stockReceiptOrderService.list(new LambdaQueryWrapper() + .in(StockReceiptOrder::getInOrderNumber, inOrderNumbers) + .eq(StockReceiptOrder::getDelFlag, 1) + .and(w -> w.isNull(StockReceiptOrder::getTaskDistribution) + .or() + .eq(StockReceiptOrder::getTaskDistribution, 2))); + if (CollectionUtils.isEmpty(receiptList)) { + return; + } + List stockReceiptOrderPOList = receiptList.stream().map(r -> { + StockReceiptOrderPO po = new StockReceiptOrderPO(); + BeanUtils.copyProperties(r, po); + return po; + }).collect(Collectors.toList()); + StockReceiptOrderDO emptyOps = new StockReceiptOrderDO(); + emptyOps.setTaskDistributionMerge(2); + genDeliveTask(stockReceiptOrderPOList, emptyOps); + genStockReceiptTaskOrder(stockReceiptOrderPOList); + List receiptOrderIds = stockReceiptOrderPOList.stream() + .map(StockReceiptOrderPO::getReceiptOrderId) + .filter(Objects::nonNull) + .collect(Collectors.toList()); + if (CollectionUtils.isEmpty(receiptOrderIds)) { + return; + } + Date now = new Date(); + stockReceiptOrderService.update(null, new UpdateWrapper().lambda() + .set(StockReceiptOrder::getTaskDistribution, 1) + .set(StockReceiptOrder::getTaskDistributionMerge, 2) + .set(StockReceiptOrder::getTaskDistributionTime, now) + .set(StockReceiptOrder::getUpdateBy, loginUser.getUserid()) + .set(StockReceiptOrder::getUpdateByName, userRealName) + .set(StockReceiptOrder::getUpdateTime, now) + .set(StockReceiptOrder::getOperatorsBy, null) + .set(StockReceiptOrder::getOperatorsName, null) + .in(StockReceiptOrder::getReceiptOrderId, receiptOrderIds)); + } + /** * @param stockReceiptOrderDO * @return Boolean @@ -1466,6 +1527,14 @@ public class StockReceiptOrderDomainService { List stockShelfOrderDOList = new ArrayList<>(); StockShelfOrderDO stockShelfOrderDO = new StockShelfOrderDO(); BeanUtils.copyProperties(stockReceiptOrderPO, stockShelfOrderDO); + // 勿沿用收货单作业人到上架单;PDA 自动下发时「任务下发时间」用当前时间(下发人由落库时的 create/update 及 autoDelive 回写体现为当前登录用户) + stockShelfOrderDO.setOperatorsBy(null); + stockShelfOrderDO.setOperatorsName(null); + if (Boolean.TRUE.equals(fromPda)) { + stockShelfOrderDO.setTaskDistributionTime(new Date()); + } else { + stockShelfOrderDO.setTaskDistributionTime(null); + } stockShelfOrderDO.setShelfOrderNumber(OrderSequence.getOrderCode("SJ")); stockShelfOrderDO.setStatus(1); //本次上架数量 @@ -1603,7 +1672,13 @@ public class StockReceiptOrderDomainService { // PDA收货完成=是否下发是(1),PC收货完成=是否下发否(2) stockShelfOrderDO.setTaskDistribution(fromPda != null && fromPda ? 1 : 2); stockShelfOrderDOList.add(stockShelfOrderDO); - return stockShelfOrderDomainService.genStockShelfOrder(stockShelfOrderDOList); + Boolean ok = stockShelfOrderDomainService.genStockShelfOrder(stockShelfOrderDOList); + // PDA:生成上架单后自动产生上架类 delive_task 并回写下发时间(与入库审核后收货自动下发同类) + if (Boolean.TRUE.equals(fromPda) && Boolean.TRUE.equals(ok) + && StringUtils.isNotBlank(stockReceiptOrderPO.getReceiptOrderNumber())) { + stockShelfOrderDomainService.autoDeliveTaskAfterPdaGenShelf(stockReceiptOrderPO.getReceiptOrderNumber()); + } + return ok; } /** @@ -1624,6 +1699,9 @@ public class StockReceiptOrderDomainService { stockReceiptOrderPOList.forEach(p -> { StockShelfOrderDO stockShelfOrderDO = new StockShelfOrderDO(); BeanUtils.copyProperties(p, stockShelfOrderDO); + stockShelfOrderDO.setTaskDistributionTime(null); + stockShelfOrderDO.setOperatorsBy(null); + stockShelfOrderDO.setOperatorsName(null); stockShelfOrderDO.setShelfOrderNumber(OrderSequence.getOrderCode("SJ")); stockShelfOrderDO.setReceiptQuantity(p.getQuantity()); List receiptMaterialDetailPODbs = receiptMaterialDetailPOListMap.get(p.getReceiptOrderNumber()); @@ -2072,6 +2150,12 @@ public class StockReceiptOrderDomainService { @Transactional(rollbackFor = Exception.class) public void genDeliveTask(List stockReceiptOrderPOList, StockReceiptOrderDO stockReceiptOrderDO){ LoginUser loginUser = SecurityUtils.getLoginUser(); + final String userRealName = (loginUser.getUserPo() != null && loginUser.getUserPo().getUserName() != null + && !loginUser.getUserPo().getUserName().trim().isEmpty()) + ? loginUser.getUserPo().getUserName() + : (loginUser.getRealname() != null && !loginUser.getRealname().trim().isEmpty()) + ? loginUser.getRealname() + : loginUser.getUsername(); List deliveTaskDOList = new ArrayList<>(); for (StockReceiptOrderPO stockReceiptOrderPO : stockReceiptOrderPOList){ DeliveTaskDO deliveTaskDO = new DeliveTaskDO(); @@ -2080,18 +2164,32 @@ public class StockReceiptOrderDomainService { deliveTaskDO.setTopOrganizationId(loginUser.getUserPo().getTopOrganizationId()); deliveTaskDO.setTaskNumber(OrderSequence.getOrderCode("RW")); deliveTaskDO.setTrackingNumber(stockReceiptOrderPO.getReceiptOrderNumber()); - deliveTaskDO.setWarehouseId(stockReceiptOrderPO.getWarehouseId()); - deliveTaskDO.setWarehouseCode(stockReceiptOrderPO.getWarehouseCode()); - deliveTaskDO.setWarehouseName(stockReceiptOrderPO.getWarehouseName()); + // 收货类 delive_task 仓库与入库单一致,统一从 stock_in_order 取(不依赖收货单表是否已落库仓库字段) + Long warehouseId = null; + String warehouseCode = null; + String warehouseName = null; + if (StringUtils.isNotBlank(stockReceiptOrderPO.getInOrderNumber())) { + StockInOrder inOrder = stockInOrderService.getOne(new LambdaQueryWrapper() + .eq(StockInOrder::getInOrderNumber, stockReceiptOrderPO.getInOrderNumber()) + .eq(StockInOrder::getDelFlag, 1) + .last("LIMIT 1")); + if (inOrder != null) { + warehouseId = inOrder.getWarehouseId(); + warehouseCode = inOrder.getWarehouseCode(); + warehouseName = inOrder.getWarehouseName(); + } + } + deliveTaskDO.setWarehouseId(warehouseId); + deliveTaskDO.setWarehouseCode(warehouseCode); + deliveTaskDO.setWarehouseName(warehouseName); deliveTaskDO.setTaskType(1); deliveTaskDO.setTaskDistribution(1); deliveTaskDO.setTaskDistributionId(loginUser.getUserid()); - deliveTaskDO.setTaskDistributionName(loginUser.getUsername()); + deliveTaskDO.setTaskDistributionName(userRealName); deliveTaskDO.setTaskDistributionTime(new Date()); - deliveTaskDO.setOperatorsBy(stockReceiptOrderDO.getOperatorsBy()); - deliveTaskDO.setOperatorsName(stockReceiptOrderDO.getOperatorsName()); + // 作业人仅在 PDA/PC 领取任务时写入 delive_task deliveTaskDO.setCreateBy(loginUser.getUserid()); - deliveTaskDO.setCreateByName(loginUser.getUsername()); + deliveTaskDO.setCreateByName(userRealName); deliveTaskDO.setCreateTime(new Date()); deliveTaskDOList.add(deliveTaskDO); } diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/stockShelfOrder/service/StockShelfOrderDomainService.java b/mhd_wms/src/main/java/com/mhd/wms/domain/stockShelfOrder/service/StockShelfOrderDomainService.java index 745f05cf1..e642e85c5 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/stockShelfOrder/service/StockShelfOrderDomainService.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/stockShelfOrder/service/StockShelfOrderDomainService.java @@ -29,6 +29,7 @@ import com.mhd.wms.domain.containerUsageRecord.repository.facade.IContainerUsage import com.mhd.wms.domain.containerUsageRecord.repository.todo.ContainerUsageRecordDO; import com.mhd.wms.domain.copyCodeReference.entity.CopyCodeReference; import com.mhd.wms.domain.copyCodeReference.repository.facade.ICopyCodeReferenceService; +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.inMaterialDetail.entity.InMaterialDetail; @@ -323,8 +324,8 @@ public class StockShelfOrderDomainService { if (CollectionUtils.isEmpty(stockShelfOrderPOList)){ throw new ServiceException("上架单不存在或已下发,请重新选择"); } - //上架生成任务下发 - genDeliveTask(stockShelfOrderPOList, stockShelfOrderDO); + //上架生成任务下发(delive_task 作业人留空,接收任务后再写入) + genDeliveTask(stockShelfOrderPOList); //标记收货单任务已下发 return stockShelfOrderService.update(null, new UpdateWrapper().lambda() .set(StockShelfOrder::getTaskDistribution, 1) @@ -1728,11 +1729,10 @@ public class StockShelfOrderDomainService { * @description 上架生成任务下发 * @author ZhouGY * @date 2024/7/27 15:23 - * @param stockReceiptOrderPOList - * @param stockReceiptOrderDO + * @param stockShelfOrderPOList 待生成上架类下发的上架单 */ @Transactional(rollbackFor = Exception.class) - public void genDeliveTask(List stockReceiptOrderPOList, StockShelfOrderDO stockReceiptOrderDO){ + public void genDeliveTask(List stockShelfOrderPOList){ LoginUser loginUser = SecurityUtils.getLoginUser(); // 获取用户姓名(优先从UserPo获取,如果为空则使用realname,最后使用username作为兜底) final String userRealName = (loginUser.getUserPo() != null && loginUser.getUserPo().getUserName() != null @@ -1742,23 +1742,38 @@ public class StockShelfOrderDomainService { ? loginUser.getRealname() : loginUser.getUsername(); List deliveTaskDOList = new ArrayList<>(); - for (StockShelfOrderPO stockShelfOrderPO : stockReceiptOrderPOList){ + for (StockShelfOrderPO stockShelfOrderPO : stockShelfOrderPOList){ 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(stockShelfOrderPO.getShelfOrderNumber()); - deliveTaskDO.setWarehouseId(stockShelfOrderPO.getWarehouseId()); - deliveTaskDO.setWarehouseCode(stockShelfOrderPO.getWarehouseCode()); - deliveTaskDO.setWarehouseName(stockShelfOrderPO.getWarehouseName()); + Long whId = stockShelfOrderPO.getWarehouseId(); + String whCode = stockShelfOrderPO.getWarehouseCode(); + String whName = stockShelfOrderPO.getWarehouseName(); + if ((whId == null || whId == 0L) && StringUtils.isNotBlank(stockShelfOrderPO.getInOrderNumber())) { + StockInOrder inOrder = stockInOrderService.getOne(new LambdaQueryWrapper() + .eq(StockInOrder::getInOrderNumber, stockShelfOrderPO.getInOrderNumber()) + .eq(StockInOrder::getDelFlag, 1) + .last("LIMIT 1")); + if (inOrder != null) { + whId = inOrder.getWarehouseId(); + whCode = inOrder.getWarehouseCode(); + whName = inOrder.getWarehouseName(); + } + } + deliveTaskDO.setWarehouseId(whId); + deliveTaskDO.setWarehouseCode(whCode); + deliveTaskDO.setWarehouseName(whName); deliveTaskDO.setTaskType(2); deliveTaskDO.setTaskDistribution(1); deliveTaskDO.setTaskDistributionId(loginUser.getUserid()); deliveTaskDO.setTaskDistributionName(userRealName); deliveTaskDO.setTaskDistributionTime(new Date()); - deliveTaskDO.setOperatorsBy(stockReceiptOrderDO.getOperatorsBy()); - deliveTaskDO.setOperatorsName(stockReceiptOrderDO.getOperatorsName()); + // 作业人必须为空,仅在 PDA/PC「接收任务」后由 DeliveTaskDomainService.receive 赋值 + deliveTaskDO.setOperatorsBy(null); + deliveTaskDO.setOperatorsName(null); deliveTaskDO.setCreateBy(loginUser.getUserid()); deliveTaskDO.setCreateByName(userRealName); deliveTaskDO.setCreateTime(new Date()); @@ -1767,6 +1782,57 @@ public class StockShelfOrderDomainService { deliveTaskService.batchInsert(deliveTaskDOList); } + /** + * PDA 收货完成生成上架单后:自动产生上架类 delive_task,并回写上架单下发时间(与 PC 对上架单「任务下发」、入库审核后收货自动下发同类)。 + */ + public void autoDeliveTaskAfterPdaGenShelf(String receiptOrderNumber) { + if (StringUtils.isBlank(receiptOrderNumber)) { + return; + } + StockShelfOrderDO query = new StockShelfOrderDO(); + query.setReceiptOrderNumber(receiptOrderNumber); + List shelves = stockShelfOrderService.queryList(query); + if (CollectionUtils.isEmpty(shelves)) { + return; + } + LoginUser loginUser = SecurityUtils.getLoginUser(); + if (loginUser == null) { + return; + } + final String userRealName = (loginUser.getUserPo() != null && loginUser.getUserPo().getUserName() != null + && !loginUser.getUserPo().getUserName().trim().isEmpty()) + ? loginUser.getUserPo().getUserName() + : (loginUser.getRealname() != null && !loginUser.getRealname().trim().isEmpty()) + ? loginUser.getRealname() + : loginUser.getUsername(); + Date now = new Date(); + // 以「是否已有上架类 delive_task」为准,避免 PDA 已写入 task_distribution_time 时漏生成任务 + List pending = shelves.stream() + .filter(s -> s != null && Objects.equals(1, s.getTaskDistribution())) + .filter(s -> StringUtils.isNotBlank(s.getShelfOrderNumber())) + .filter(s -> deliveTaskService.count(new LambdaQueryWrapper() + .eq(DeliveTask::getTrackingNumber, s.getShelfOrderNumber()) + .eq(DeliveTask::getTaskType, 2) + .eq(DeliveTask::getDelFlag, 1)) == 0) + .collect(Collectors.toList()); + if (pending.isEmpty()) { + return; + } + genDeliveTask(pending); + List shelfOrderIds = pending.stream() + .map(StockShelfOrderPO::getShelfOrderId) + .filter(Objects::nonNull) + .collect(Collectors.toList()); + if (!shelfOrderIds.isEmpty()) { + stockShelfOrderService.update(null, new UpdateWrapper().lambda() + .set(StockShelfOrder::getTaskDistributionTime, now) + .set(StockShelfOrder::getUpdateBy, loginUser.getUserid()) + .set(StockShelfOrder::getUpdateByName, userRealName) + .set(StockShelfOrder::getUpdateTime, now) + .in(StockShelfOrder::getShelfOrderId, shelfOrderIds)); + } + } + /** * @description 保存库存序列号 * @author liyc diff --git a/mhd_wms/src/main/java/com/mhd/wms/interfaces/facadeApp/deliveTask/DeliveTaskAppApi.java b/mhd_wms/src/main/java/com/mhd/wms/interfaces/facadeApp/deliveTask/DeliveTaskAppApi.java index d9a1a244b..0f2f86159 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/interfaces/facadeApp/deliveTask/DeliveTaskAppApi.java +++ b/mhd_wms/src/main/java/com/mhd/wms/interfaces/facadeApp/deliveTask/DeliveTaskAppApi.java @@ -31,8 +31,9 @@ public class DeliveTaskAppApi extends BaseController { private DeliveTaskAssembler deliveTaskAssembler; /** - * 分页查询下发任务列表 - * @return + * 分页查询下发任务列表。条件:del_flag=1、当前一级组织、请求参数 warehouseId、 + * task_distribution_id=当前登录用户;不按 task_status 过滤(入参传入 taskStatus 时可选筛状态)。 + * 与 PC 列表不同,不按 tabType/operators_by 过滤。 */ @ApiOperation("查询下发任务列表") @GetMapping("/list") diff --git a/mhd_wms/src/main/java/com/mhd/wms/interfaces/facadeApp/reviewOrder/ReviewOrderAppApi.java b/mhd_wms/src/main/java/com/mhd/wms/interfaces/facadeApp/reviewOrder/ReviewOrderAppApi.java index ed9a47224..a133de7cb 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/interfaces/facadeApp/reviewOrder/ReviewOrderAppApi.java +++ b/mhd_wms/src/main/java/com/mhd/wms/interfaces/facadeApp/reviewOrder/ReviewOrderAppApi.java @@ -48,7 +48,7 @@ public class ReviewOrderAppApi extends BaseController { * 分页查询复核单列表(仅已下发任务,按当前用户仓库过滤) *
    *
  • {@code tabType=2}:历史({@code review_status=3} 已复核)
  • - *
  • 其它:待办({@code review_status < 3},待复核/复核中)
  • + *
  • 其它:待办({@code review_status < 3},待复核/复核中),且仅 {@code receive_time} 非空(已在下发任务中接收)
  • *
*/ @ApiOperation("PDA 复核单列表(REVIEW_ORDER)") @@ -104,7 +104,7 @@ public class ReviewOrderAppApi extends BaseController { } /** - * 完成复核确认(无待复核数量时可确认,同步出库明细并生成交接等,与 PC checkConfirm 一致) + * 完成复核确认(同步出库明细、生成交接作业单,并自动下发交接类 PDA 任务 delive_task/taskType=7,与拣货完成后自动复核下发对齐) */ @ApiOperation("PDA 完成复核") @PostMapping("/completeCheck") diff --git a/mhd_wms/src/main/java/com/mhd/wms/interfaces/facadeApp/stockReceiptOrder/StockReceiptOrderAppApi.java b/mhd_wms/src/main/java/com/mhd/wms/interfaces/facadeApp/stockReceiptOrder/StockReceiptOrderAppApi.java index 24400d1a9..f30c29dad 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/interfaces/facadeApp/stockReceiptOrder/StockReceiptOrderAppApi.java +++ b/mhd_wms/src/main/java/com/mhd/wms/interfaces/facadeApp/stockReceiptOrder/StockReceiptOrderAppApi.java @@ -132,16 +132,17 @@ public class StockReceiptOrderAppApi extends BaseController { } /** - * 完成收货 + * 完成收货:生成上架单后自动创建上架类下发任务(delive_task.task_type=2,tracking_number=上架单号), + * 作业人 operators_by/operators_name 默认为空;作业人在 {@code DeliveTaskAppApi#receive} 接收任务后写入。 */ - @ApiOperation("完成收货") + @ApiOperation("完成收货(自动生成上架单及上架 delive_task,作业人须接收任务后才有)") @PostMapping("/completeReceipt") public AjaxResult completeReceipt(@RequestBody StockReceiptOrderDTO stockReceiptOrderDTO) { stockReceiptOrderApplicationService.updateInOrder(stockReceiptOrderDTO); return toAjax(stockReceiptOrderApplicationService.completeReceiptByApp(stockReceiptOrderDTO.getReceiptOrderId())); } - @ApiOperation("生成上架单") + @ApiOperation("生成上架单(PDA 路径同完成收货:自动上架 delive_task,作业人接收后赋值)") @PostMapping("/genStockShelfOrder") public AjaxResult genStockShelfOrder(@RequestBody StockReceiptOrderDTO stockReceiptOrderDTO) { return toAjax(stockReceiptOrderApplicationService.genStockShelfOrder(stockReceiptOrderDTO.getReceiptOrderId())); diff --git a/mhd_wms/src/main/resources/mapper/deliveTask/DeliveTaskMapper.xml b/mhd_wms/src/main/resources/mapper/deliveTask/DeliveTaskMapper.xml index 0484809ed..0ac6887bc 100644 --- a/mhd_wms/src/main/resources/mapper/deliveTask/DeliveTaskMapper.xml +++ b/mhd_wms/src/main/resources/mapper/deliveTask/DeliveTaskMapper.xml @@ -138,6 +138,78 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + + + + del_flag = 1 + + and task_number = #{taskNumber} + + + and tracking_number = #{trackingNumber} + + + and organization_id = #{organizationId} + + + and organization_id in + + #{item} + + + + and organization_name like concat('%', #{organizationName}, '%') + + + and top_organization_id = #{topOrganizationId} + + + and warehouse_id = #{warehouseId} + + + and warehouse_code = #{warehouseCode} + + + and warehouse_name like concat('%', #{warehouseName}, '%') + + + and task_type = #{taskType} + + + and EXISTS (SELECT 1 FROM handover_task_order hto WHERE hto.task_number = delive_task.tracking_number AND hto.del_flag = 1 AND hto.status = 1) + + + and EXISTS (SELECT 1 FROM handover_task_order hto WHERE hto.task_number = delive_task.tracking_number AND hto.del_flag = 1 AND hto.status = 2) + + + and task_status = #{taskStatus} + + + and task_distribution = #{taskDistribution} + + + and task_distribution_time = #{taskDistributionTime} + + + and task_distribution_id = #{taskDistributionId} + + + and task_distribution_name like concat('%', #{taskDistributionName}, '%') + + + and operators_name like concat('%', #{operatorsName}, '%') + + + and reassign_time = #{reassignTime} + + + and reassign_by_id = #{reassignById} + + + and reassign_by_name like concat('%', #{reassignByName}, '%') + + + and organization_id = #{organizationId} @@ -208,7 +280,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"