PDA下发任务栏领取任务修改

This commit is contained in:
秦鸿展
2026-04-28 08:46:44 +08:00
parent 6d61e14a5e
commit 749cb50282
22 changed files with 522 additions and 60 deletions
@@ -47,9 +47,10 @@ 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 = 当前用户)
deliveTaskDO.setOperatorsBy(loginUser.getUserid()); deliveTaskDO.setTaskDistributionId(loginUser.getUserid());
} }
// 不按 task_status 默认过滤;若请求传入 taskStatus 则仍可按状态筛选
return deliveTaskDomainService.queryListApp(deliveTaskDO); return deliveTaskDomainService.queryListApp(deliveTaskDO);
} }
@@ -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.entity.HandoverTaskOrder;
import com.mhd.wms.domain.handoverTaskOrder.repository.facade.IHandoverTaskOrderService; import com.mhd.wms.domain.handoverTaskOrder.repository.facade.IHandoverTaskOrderService;
import com.mhd.wms.domain.handoverTaskOrder.repository.todo.HandoverTaskOrderDO; 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.entity.OutMaterialDetail;
import com.mhd.wms.domain.outMaterialDetail.repository.mapper.OutMaterialDetailMapper; import com.mhd.wms.domain.outMaterialDetail.repository.mapper.OutMaterialDetailMapper;
import com.mhd.wms.domain.outOrderAbnormal.repository.facade.IOutOrderAbnormalService; import com.mhd.wms.domain.outOrderAbnormal.repository.facade.IOutOrderAbnormalService;
@@ -87,6 +88,9 @@ public class ReviewOrderApplicationService {
@Autowired @Autowired
private IHandoverTaskOrderService handoverTaskOrderService; private IHandoverTaskOrderService handoverTaskOrderService;
@Autowired
private HandoverTaskOrderDomainService handoverTaskOrderDomainService;
@Autowired @Autowired
private OutMaterialDetailMapper outMaterialDetailMapper; private OutMaterialDetailMapper outMaterialDetailMapper;
@Autowired @Autowired
@@ -117,6 +121,8 @@ public class ReviewOrderApplicationService {
query.setReviewStatus(3); query.setReviewStatus(3);
} else { } else {
query.setLtReviewStatus(3); query.setLtReviewStatus(3);
// 待办仅展示已在下发任务中「接收」的复核单(receive_time 由接收 delive_task 回写);否则会出现未接收仍出现在列表
query.setOnlyReceived(1);
} }
query.setIssuedFlag("1"); query.setIssuedFlag("1");
if (query.getDelFlag() == null) { if (query.getDelFlag() == null) {
@@ -464,7 +470,10 @@ public class ReviewOrderApplicationService {
} }
handoverTaskOrderDO.setCreateByName(userRealName); handoverTaskOrderDO.setCreateByName(userRealName);
handoverTaskOrderDO.setCreateTime(new Date()); 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())) { if (header == null || !"0".equals(header.getIssuedFlag())) {
return; return;
} }
// 与入库收货自动下发一致:不在下发时预填作业人,仅在 PDA/PC「接收任务」后写入 delive_task
ReviewOrderDO cmd = new ReviewOrderDO(); ReviewOrderDO cmd = new ReviewOrderDO();
cmd.setCheckOperatorsBy(loginUser.getUserid());
cmd.setCheckOperatorsName(resolveLoginDisplayName(loginUser));
applyReviewTaskDistribution(Collections.singletonList(header), cmd, loginUser); applyReviewTaskDistribution(Collections.singletonList(header), cmd, loginUser);
} }
@@ -572,11 +580,11 @@ public class ReviewOrderApplicationService {
deliveTaskDO.setTaskDistributionId(loginUser.getUserid()); deliveTaskDO.setTaskDistributionId(loginUser.getUserid());
deliveTaskDO.setTaskDistributionName(userRealName); deliveTaskDO.setTaskDistributionName(userRealName);
deliveTaskDO.setTaskDistributionTime(new Date()); deliveTaskDO.setTaskDistributionTime(new Date());
// PC 复核下发可传 checkOperatorsBy/Name 预指派人;未传则留空,与收货/上架类任务一致,接收时再赋值
Long operatorsBy = reviewOrderDO != null ? reviewOrderDO.getCheckOperatorsBy() : null; Long operatorsBy = reviewOrderDO != null ? reviewOrderDO.getCheckOperatorsBy() : null;
String operatorsName = reviewOrderDO != null ? reviewOrderDO.getCheckOperatorsName() : null; String operatorsName = reviewOrderDO != null ? reviewOrderDO.getCheckOperatorsName() : null;
if (operatorsBy == null || operatorsBy == 0) { if (operatorsBy != null && operatorsBy == 0L) {
operatorsBy = loginUser.getUserid(); operatorsBy = null;
operatorsName = (operatorsName != null && !operatorsName.isEmpty()) ? operatorsName : userRealName;
} }
deliveTaskDO.setOperatorsBy(operatorsBy); deliveTaskDO.setOperatorsBy(operatorsBy);
deliveTaskDO.setOperatorsName(operatorsName); deliveTaskDO.setOperatorsName(operatorsName);
@@ -29,7 +29,7 @@ public class DeliveTaskServiceFactory {
*/ */
public IDeliveTaskTypeService getDeliveTaskTypeService(Integer taskType) { public IDeliveTaskTypeService getDeliveTaskTypeService(Integer taskType) {
String deliveTaskType = ""; String deliveTaskType = "";
//任务类型 0-无 1-收货 2-上架 3-拣货 4-复核 5-移位 6-盘点 //任务类型 0-无 1-收货 2-上架 3-拣货 4-复核 5-移位 6-盘点 7-交接作业单
switch (taskType){ switch (taskType){
case 1: case 1:
deliveTaskType = "stockReceiptOrderImpl"; deliveTaskType = "stockReceiptOrderImpl";
@@ -49,6 +49,9 @@ public class DeliveTaskServiceFactory {
case 6: case 6:
deliveTaskType = "investigationManageImpl"; deliveTaskType = "investigationManageImpl";
break; break;
case 7:
deliveTaskType = "handoverTaskOrderImpl";
break;
default: default:
throw new ServiceException("任务类型不存在"); throw new ServiceException("任务类型不存在");
} }
@@ -52,6 +52,11 @@ public interface IDeliveTaskService extends IService<DeliveTask>
public int refuse(Long deliverTaskId); public int refuse(Long deliverTaskId);
/**
* 更新下发任务作业人(接收时写入当前用户)
*/
int updateOperatorsBy(Long deliverTaskId, Long operatorsBy, String operatorsName);
/** /**
* 查询列表表头数量 * 查询列表表头数量
*/ */
@@ -99,14 +99,7 @@ public class DeliveTaskImpl extends ServiceImpl<DeliveTaskMapper, DeliveTask> im
@Override @Override
public List<DeliveTaskPO> queryListApp(DeliveTaskDO deliveTaskDO) public List<DeliveTaskPO> queryListApp(DeliveTaskDO deliveTaskDO)
{ {
LoginUser loginUser = SecurityUtils.getLoginUser(); // App 列表条件见 DeliveTaskMapper.queryListApp / selectDeliveTaskPoApp1(不按 tabType、operators_by 过滤)
if (null != deliveTaskDO.getTabType()) {
if (deliveTaskDO.getTabType() == 1) {
deliveTaskDO.setOperatorsBy(loginUser.getUserid());
} else if (deliveTaskDO.getTabType() == 2) {
deliveTaskDO.setOperatorsBy(null);
}
}
List<DeliveTaskPO> deliveTaskPOS = deliveTaskMapper.queryListApp(deliveTaskDO); List<DeliveTaskPO> deliveTaskPOS = deliveTaskMapper.queryListApp(deliveTaskDO);
if (deliveTaskDO.getTaskType() == 7){ if (deliveTaskDO.getTaskType() == 7){
statistics(deliveTaskPOS); statistics(deliveTaskPOS);
@@ -277,6 +270,11 @@ public class DeliveTaskImpl extends ServiceImpl<DeliveTaskMapper, DeliveTask> im
public int receive(Long deliverTaskId) { public int receive(Long deliverTaskId) {
return deliveTaskMapper.receive(deliverTaskId,1); return deliveTaskMapper.receive(deliverTaskId,1);
} }
@Override
public int updateOperatorsBy(Long deliverTaskId, Long operatorsBy, String operatorsName) {
return deliveTaskMapper.updateOperatorsBy(deliverTaskId, operatorsBy, operatorsName);
}
/** /**
* 拒绝操作 * 拒绝操作
*/ */
@@ -2,6 +2,8 @@ package com.mhd.wms.domain.deliveTask.service;
import com.mhd.common.core.exception.ServiceException; import com.mhd.common.core.exception.ServiceException;
import com.mhd.common.core.utils.bean.BeanUtils; 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.entity.DeliveTask;
import com.mhd.wms.domain.deliveTask.factorys.DeliveTaskServiceFactory; import com.mhd.wms.domain.deliveTask.factorys.DeliveTaskServiceFactory;
import com.mhd.wms.domain.deliveTask.repository.facade.IDeliveTaskService; 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.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils;
import java.util.List; import java.util.List;
@@ -85,17 +88,42 @@ public class DeliveTaskDomainService {
if (deliveTask.getTaskStatus() > 0){ if (deliveTask.getTaskStatus() > 0){
throw new ServiceException("任务已处理,请勿重复处理"); throw new ServiceException("任务已处理,请勿重复处理");
} }
LoginUser loginUser = SecurityUtils.getLoginUser();
if (loginUser == null) {
throw new ServiceException("用户未登录");
}
int count = deliveTaskService.receive(deliverTaskId); int count = deliveTaskService.receive(deliverTaskId);
if (count == 0) { if (count == 0) {
throw new ServiceException("接受任务失败"); 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 deliveTaskDO = new DeliveTaskDO();
deliveTaskDO.setTrackingNumber(deliveTask.getTrackingNumber()); deliveTaskDO.setTrackingNumber(deliveTask.getTrackingNumber());
deliveTaskDO.setOperatorsBy(deliveTask.getOperatorsBy()); deliveTaskDO.setOperatorsBy(loginUser.getUserid());
deliveTaskDO.setOperatorsName(deliveTask.getOperatorsName()); deliveTaskDO.setOperatorsName(operatorsName);
deliveTaskServiceFactory.getDeliveTaskTypeService(deliveTask.getTaskType()).handleDeliveTask(deliveTaskDO); deliveTaskServiceFactory.getDeliveTaskTypeService(deliveTask.getTaskType()).handleDeliveTask(deliveTaskDO);
return count; 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();
}
/** /**
* 拒绝操作 * 拒绝操作
*/ */
@@ -1,9 +1,12 @@
package com.mhd.wms.domain.handoverTaskOrder.repository.persistence; package com.mhd.wms.domain.handoverTaskOrder.repository.persistence;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; 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.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
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.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.entity.HandoverTaskOrder;
import com.mhd.wms.domain.handoverTaskOrder.repository.facade.IHandoverTaskOrderService; import com.mhd.wms.domain.handoverTaskOrder.repository.facade.IHandoverTaskOrderService;
import com.mhd.wms.domain.handoverTaskOrder.repository.mapper.HandoverTaskOrderMapper; import com.mhd.wms.domain.handoverTaskOrder.repository.mapper.HandoverTaskOrderMapper;
@@ -27,7 +30,7 @@ import java.util.stream.Collectors;
* @date 2024-05-28 * @date 2024-05-28
*/ */
@Service @Service
public class HandoverTaskOrderImpl extends ServiceImpl<HandoverTaskOrderMapper, HandoverTaskOrder> implements IHandoverTaskOrderService { public class HandoverTaskOrderImpl extends ServiceImpl<HandoverTaskOrderMapper, HandoverTaskOrder> implements IHandoverTaskOrderService, IDeliveTaskTypeService {
@Autowired @Autowired
private HandoverTaskOrderMapper handoverTaskOrderMapper; private HandoverTaskOrderMapper handoverTaskOrderMapper;
@@ -118,4 +121,20 @@ public class HandoverTaskOrderImpl extends ServiceImpl<HandoverTaskOrderMapper,
return i > 0; return i > 0;
} }
/**
* PDA 接收交接下发任务(taskType=7)后,按交接作业单号回写作业人(trackingNumber = task_number
*/
@Override
public Boolean handleDeliveTask(DeliveTaskDO deliveTaskDO) {
LoginUser loginUser = SecurityUtils.getLoginUser();
return update(null, new UpdateWrapper<HandoverTaskOrder>().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));
}
} }
@@ -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.entity.CopyCodeReference;
import com.mhd.wms.domain.copyCodeReference.repository.facade.ICopyCodeReferenceService; import com.mhd.wms.domain.copyCodeReference.repository.facade.ICopyCodeReferenceService;
import com.mhd.wms.domain.copyCodeReference.service.CopyCodeReferenceDomainService; 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.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.entity.HandoverTaskOrder; import com.mhd.wms.domain.handoverTaskOrder.entity.HandoverTaskOrder;
@@ -575,9 +576,20 @@ public class HandoverTaskOrderDomainService {
private void genDeliveTask(List<HandoverTaskOrder> handoverTaskOrders, HandoverTaskOrderDO handoverTaskOrderDO) { private void genDeliveTask(List<HandoverTaskOrder> handoverTaskOrders, HandoverTaskOrderDO handoverTaskOrderDO) {
LoginUser loginUser = SecurityUtils.getLoginUser(); LoginUser loginUser = SecurityUtils.getLoginUser();
// 获取用户姓名(优先从UserPo获取,如果为空则使用realname,最后使用username作为兜底) Long operatorsBy = handoverTaskOrderDO != null ? handoverTaskOrderDO.getOperatorsBy() : null;
final String userRealName = (loginUser.getUserPo() != null && loginUser.getUserPo().getUserName() != null String operatorsName = handoverTaskOrderDO != null ? handoverTaskOrderDO.getOperatorsName() : null;
&& !loginUser.getUserPo().getUserName().trim().isEmpty()) insertDeliveTasksForHandoverOrders(handoverTaskOrders, operatorsBy, operatorsName, loginUser);
}
/**
* 写入交接类下发任务(taskType=7trackingNumber=交接作业单号),与 PC「交接任务下发」一致。
*/
private void insertDeliveTasksForHandoverOrders(List<HandoverTaskOrder> 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.getUserPo().getUserName()
: (loginUser.getRealname() != null && !loginUser.getRealname().trim().isEmpty()) : (loginUser.getRealname() != null && !loginUser.getRealname().trim().isEmpty())
? loginUser.getRealname() ? loginUser.getRealname()
@@ -598,8 +610,8 @@ public class HandoverTaskOrderDomainService {
deliveTaskDO.setTaskDistributionId(loginUser.getUserid()); deliveTaskDO.setTaskDistributionId(loginUser.getUserid());
deliveTaskDO.setTaskDistributionName(userRealName); deliveTaskDO.setTaskDistributionName(userRealName);
deliveTaskDO.setTaskDistributionTime(new Date()); deliveTaskDO.setTaskDistributionTime(new Date());
deliveTaskDO.setOperatorsBy(handoverTaskOrderDO.getOperatorsBy()); deliveTaskDO.setOperatorsBy(operatorsBy);
deliveTaskDO.setOperatorsName(handoverTaskOrderDO.getOperatorsName()); deliveTaskDO.setOperatorsName(operatorsName);
deliveTaskDO.setCreateBy(loginUser.getUserid()); deliveTaskDO.setCreateBy(loginUser.getUserid());
deliveTaskDO.setCreateByName(userRealName); deliveTaskDO.setCreateByName(userRealName);
deliveTaskDO.setCreateTime(new Date()); deliveTaskDO.setCreateTime(new Date());
@@ -608,6 +620,50 @@ public class HandoverTaskOrderDomainService {
deliveTaskService.batchInsert(deliveTaskDOList); 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<HandoverTaskOrder>()
.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<DeliveTask>()
.eq(DeliveTask::getTrackingNumber, tn)
.eq(DeliveTask::getTaskType, 7)
.eq(DeliveTask::getDelFlag, 1L));
Date now = new Date();
if (deliveCnt > 0) {
handoverTaskOrderService.update(null, new UpdateWrapper<HandoverTaskOrder>().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<HandoverTaskOrder>().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()));
}
} }
@@ -71,6 +71,7 @@ import java.util.ArrayList;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Objects;
import java.util.function.Function; import java.util.function.Function;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@@ -189,6 +190,62 @@ public class PickingOrderDomainService {
return pickingMaterialDetailService.saveBatch(pickingMaterialDetailList); return pickingMaterialDetailService.saveBatch(pickingMaterialDetailList);
} }
/**
* 出库单「生成拣货单」后自动下发:生成拣货作业单 + delive_tasktaskType=3),与入库审核后
* {@link com.mhd.wms.domain.stockReceiptOrder.service.StockReceiptOrderDomainService#autoTaskDistributionAfterStockInAudit} 一致;
* 作业人仅在接收任务时写入 delive_task / 拣货作业单(拣货单主表实体未映射作业人字段,不在此更新)。
*/
@Transactional(rollbackFor = Exception.class)
public void autoTaskDistributionAfterGenPickingOrders(List<String> 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<PickingOrder> rows = pickingOrderService.list(new LambdaQueryWrapper<PickingOrder>()
.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<PickingOrderPO> 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<Long> 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<PickingOrder>().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 生成物料明细实体 * @description 生成物料明细实体
* @author ZhouGY * @author ZhouGY
@@ -889,8 +946,9 @@ public class PickingOrderDomainService {
deliveTaskDO.setTaskDistributionId(loginUser.getUserid()); deliveTaskDO.setTaskDistributionId(loginUser.getUserid());
deliveTaskDO.setTaskDistributionName(userRealName); deliveTaskDO.setTaskDistributionName(userRealName);
deliveTaskDO.setTaskDistributionTime(new Date()); deliveTaskDO.setTaskDistributionTime(new Date());
deliveTaskDO.setOperatorsBy(pickingOrderDO.getOperatorsBy()); // 作业人仅在 PDA/PC「接收任务」后写入,与入库审核自动下发的收货类 delive_task 一致
deliveTaskDO.setOperatorsName(pickingOrderDO.getOperatorsName()); deliveTaskDO.setOperatorsBy(null);
deliveTaskDO.setOperatorsName(null);
deliveTaskDO.setCreateBy(loginUser.getUserid()); deliveTaskDO.setCreateBy(loginUser.getUserid());
deliveTaskDO.setCreateByName(userRealName); deliveTaskDO.setCreateByName(userRealName);
deliveTaskDO.setCreateTime(new Date()); deliveTaskDO.setCreateTime(new Date());
@@ -80,4 +80,10 @@ public class ReviewOrderDO extends BaseVOEntity {
@ApiModelProperty("复核状态小于该值(查询用,如待办 review_status < 3") @ApiModelProperty("复核状态小于该值(查询用,如待办 review_status < 3")
private Integer ltReviewStatus; private Integer ltReviewStatus;
/**
* PDA 待办:1 表示仅查已在任务中心「接收」的复核单(receive_time 非空),与 delive_task 接收后回写一致
*/
@ApiModelProperty("仅已接收:1-是(receive_time 非空)")
private Integer onlyReceived;
} }
@@ -517,7 +517,7 @@ public class StockInOrderDomainService {
if (!batchInsertResult) { if (!batchInsertResult) {
throw new ServiceException("生成收货单失败"); throw new ServiceException("生成收货单失败");
} }
// 入库作业单(收货 type=1)在「收货任务下发」时生成,审核通过仅生成收货单与质检等,此处不再落 stock_in_task_order // 收货任务不随审核自动下发,需在收货单侧手动「任务下发」(delive_task 等)
return batchInsertResult; return batchInsertResult;
} }
@@ -720,7 +720,9 @@ public class StockOutOrderDomainService {
} }
pickingOrderDOList.add(pickingOrderDO); pickingOrderDOList.add(pickingOrderDO);
}); });
return pickingOrderDomainService.batchInsert(pickingOrderDOList); Boolean inserted = pickingOrderDomainService.batchInsert(pickingOrderDOList);
// 拣货任务不随生成拣货单自动下发需在拣货单侧整单下发/明细下发
return inserted;
} }
/** /**
@@ -770,6 +770,23 @@ public class StockOutTaskOrderDomainService {
outOrderAbnormalService.genOutOrderAbnormal(outOrderAbnormalBaseDO, 1); outOrderAbnormalService.genOutOrderAbnormal(outOrderAbnormalBaseDO, 1);
//设置拣货单拣货需要更新的数据数据 //设置拣货单拣货需要更新的数据数据
updateStockOutTaskOrder(null, stockOutTaskOrderPODb, 3); updateStockOutTaskOrder(null, stockOutTaskOrderPODb, 3);
// PickingOrderDomainService.completePicking 对齐PDA 完成拣货后确保生成复核单并自动下发delive_task taskType=4作业人待接收
PickingOrder pickingOrderRow = pickingOrderService.getOne(new QueryWrapper<PickingOrder>().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<StockOutOrder>()
.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; return true;
} }
@@ -1,6 +1,7 @@
package com.mhd.wms.domain.stockReceiptOrder.entity; package com.mhd.wms.domain.stockReceiptOrder.entity;
import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableId;
import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonFormat;
import com.mhd.common.core.annotation.Excel; import com.mhd.common.core.annotation.Excel;
@@ -40,6 +41,25 @@ public class StockReceiptOrder extends BaseVOEntity {
@Excel(name = "一级组织表ID") @Excel(name = "一级组织表ID")
private Long topOrganizationId; 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("入库单号") @ApiModelProperty("入库单号")
@Excel(name = "入库单号") @Excel(name = "入库单号")
private String inOrderNumber; private String inOrderNumber;
@@ -168,6 +168,7 @@ public class StockReceiptOrderDomainService {
List<ReceiptMaterialDetail> receiptMaterialDetailList = new ArrayList<>(); List<ReceiptMaterialDetail> receiptMaterialDetailList = new ArrayList<>();
stockReceiptOrderDOList.forEach(stockReceiptOrderDO -> { stockReceiptOrderDOList.forEach(stockReceiptOrderDO -> {
StockReceiptOrder stockReceiptOrder = JSONUtil.toBean(JSONUtil.toJsonStr(stockReceiptOrderDO), StockReceiptOrder.class); StockReceiptOrder stockReceiptOrder = JSONUtil.toBean(JSONUtil.toJsonStr(stockReceiptOrderDO), StockReceiptOrder.class);
// 仓库以入库单为准delive_task genDeliveTask 中从 stock_in_order 读取收货单实体仓库字段 exist=false 不落库
stockReceiptOrder.setReceiptOrderNumber(OrderSequence.getOrderCode("SH")); stockReceiptOrder.setReceiptOrderNumber(OrderSequence.getOrderCode("SH"));
stockReceiptOrder.setCreateBy(loginUser.getUserid()); stockReceiptOrder.setCreateBy(loginUser.getUserid());
stockReceiptOrder.setCreateByName(userRealName); stockReceiptOrder.setCreateByName(userRealName);
@@ -394,6 +395,12 @@ public class StockReceiptOrderDomainService {
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public Boolean taskDistribution(StockReceiptOrderDO stockReceiptOrderDO) { public Boolean taskDistribution(StockReceiptOrderDO stockReceiptOrderDO) {
LoginUser loginUser = SecurityUtils.getLoginUser(); 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(); StockReceiptOrderDO stockReceiptOrderDOQuery = new StockReceiptOrderDO();
List<Long> receiptOrderIds = stockReceiptOrderDO.getReceiptOrderIds(); List<Long> receiptOrderIds = stockReceiptOrderDO.getReceiptOrderIds();
if (receiptOrderIds == null || receiptOrderIds.size() == 0) { if (receiptOrderIds == null || receiptOrderIds.size() == 0) {
@@ -420,13 +427,67 @@ public class StockReceiptOrderDomainService {
.set(StockReceiptOrder::getTaskDistributionMerge, taskDistributionMerge) .set(StockReceiptOrder::getTaskDistributionMerge, taskDistributionMerge)
.set(StockReceiptOrder::getTaskDistributionTime, new Date()) .set(StockReceiptOrder::getTaskDistributionTime, new Date())
.set(StockReceiptOrder::getUpdateBy, loginUser.getUserid()) .set(StockReceiptOrder::getUpdateBy, loginUser.getUserid())
.set(StockReceiptOrder::getUpdateByName, loginUser.getUsername()) .set(StockReceiptOrder::getUpdateByName, userRealName)
.set(StockReceiptOrder::getUpdateTime, new Date()) .set(StockReceiptOrder::getUpdateTime, new Date())
.set(StockReceiptOrder::getOperatorsBy, stockReceiptOrderDO.getOperatorsBy()) .set(StockReceiptOrder::getOperatorsBy, stockReceiptOrderDO.getOperatorsBy())
.set(StockReceiptOrder::getOperatorsName, stockReceiptOrderDO.getOperatorsName()) .set(StockReceiptOrder::getOperatorsName, stockReceiptOrderDO.getOperatorsName())
.in(StockReceiptOrder::getReceiptOrderId, stockReceiptOrderDO.getReceiptOrderIds())); .in(StockReceiptOrder::getReceiptOrderId, stockReceiptOrderDO.getReceiptOrderIds()));
} }
/**
* 入库单审核通过后自动下发收货任务 PC 任务下发一致生成 delive_task收货作业单
* 作业人在 PDA/PC 领取任务时写入 delive_task 与收货单
*/
@Transactional(rollbackFor = Exception.class)
public void autoTaskDistributionAfterStockInAudit(List<String> 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<StockReceiptOrder> receiptList = stockReceiptOrderService.list(new LambdaQueryWrapper<StockReceiptOrder>()
.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<StockReceiptOrderPO> 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<Long> 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<StockReceiptOrder>().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 * @param stockReceiptOrderDO
* @return Boolean * @return Boolean
@@ -1466,6 +1527,14 @@ public class StockReceiptOrderDomainService {
List<StockShelfOrderDO> stockShelfOrderDOList = new ArrayList<>(); List<StockShelfOrderDO> stockShelfOrderDOList = new ArrayList<>();
StockShelfOrderDO stockShelfOrderDO = new StockShelfOrderDO(); StockShelfOrderDO stockShelfOrderDO = new StockShelfOrderDO();
BeanUtils.copyProperties(stockReceiptOrderPO, 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.setShelfOrderNumber(OrderSequence.getOrderCode("SJ"));
stockShelfOrderDO.setStatus(1); stockShelfOrderDO.setStatus(1);
//本次上架数量 //本次上架数量
@@ -1603,7 +1672,13 @@ public class StockReceiptOrderDomainService {
// PDA收货完成=是否下发是(1)PC收货完成=是否下发否(2) // PDA收货完成=是否下发是(1)PC收货完成=是否下发否(2)
stockShelfOrderDO.setTaskDistribution(fromPda != null && fromPda ? 1 : 2); stockShelfOrderDO.setTaskDistribution(fromPda != null && fromPda ? 1 : 2);
stockShelfOrderDOList.add(stockShelfOrderDO); 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 -> { stockReceiptOrderPOList.forEach(p -> {
StockShelfOrderDO stockShelfOrderDO = new StockShelfOrderDO(); StockShelfOrderDO stockShelfOrderDO = new StockShelfOrderDO();
BeanUtils.copyProperties(p, stockShelfOrderDO); BeanUtils.copyProperties(p, stockShelfOrderDO);
stockShelfOrderDO.setTaskDistributionTime(null);
stockShelfOrderDO.setOperatorsBy(null);
stockShelfOrderDO.setOperatorsName(null);
stockShelfOrderDO.setShelfOrderNumber(OrderSequence.getOrderCode("SJ")); stockShelfOrderDO.setShelfOrderNumber(OrderSequence.getOrderCode("SJ"));
stockShelfOrderDO.setReceiptQuantity(p.getQuantity()); stockShelfOrderDO.setReceiptQuantity(p.getQuantity());
List<ReceiptMaterialDetailPO> receiptMaterialDetailPODbs = receiptMaterialDetailPOListMap.get(p.getReceiptOrderNumber()); List<ReceiptMaterialDetailPO> receiptMaterialDetailPODbs = receiptMaterialDetailPOListMap.get(p.getReceiptOrderNumber());
@@ -2072,6 +2150,12 @@ public class StockReceiptOrderDomainService {
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public void genDeliveTask(List<StockReceiptOrderPO> stockReceiptOrderPOList, StockReceiptOrderDO stockReceiptOrderDO){ public void genDeliveTask(List<StockReceiptOrderPO> stockReceiptOrderPOList, StockReceiptOrderDO stockReceiptOrderDO){
LoginUser loginUser = SecurityUtils.getLoginUser(); 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<DeliveTaskDO> deliveTaskDOList = new ArrayList<>(); List<DeliveTaskDO> deliveTaskDOList = new ArrayList<>();
for (StockReceiptOrderPO stockReceiptOrderPO : stockReceiptOrderPOList){ for (StockReceiptOrderPO stockReceiptOrderPO : stockReceiptOrderPOList){
DeliveTaskDO deliveTaskDO = new DeliveTaskDO(); DeliveTaskDO deliveTaskDO = new DeliveTaskDO();
@@ -2080,18 +2164,32 @@ public class StockReceiptOrderDomainService {
deliveTaskDO.setTopOrganizationId(loginUser.getUserPo().getTopOrganizationId()); deliveTaskDO.setTopOrganizationId(loginUser.getUserPo().getTopOrganizationId());
deliveTaskDO.setTaskNumber(OrderSequence.getOrderCode("RW")); deliveTaskDO.setTaskNumber(OrderSequence.getOrderCode("RW"));
deliveTaskDO.setTrackingNumber(stockReceiptOrderPO.getReceiptOrderNumber()); deliveTaskDO.setTrackingNumber(stockReceiptOrderPO.getReceiptOrderNumber());
deliveTaskDO.setWarehouseId(stockReceiptOrderPO.getWarehouseId()); // 收货类 delive_task 仓库与入库单一致统一从 stock_in_order 不依赖收货单表是否已落库仓库字段
deliveTaskDO.setWarehouseCode(stockReceiptOrderPO.getWarehouseCode()); Long warehouseId = null;
deliveTaskDO.setWarehouseName(stockReceiptOrderPO.getWarehouseName()); String warehouseCode = null;
String warehouseName = null;
if (StringUtils.isNotBlank(stockReceiptOrderPO.getInOrderNumber())) {
StockInOrder inOrder = stockInOrderService.getOne(new LambdaQueryWrapper<StockInOrder>()
.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.setTaskType(1);
deliveTaskDO.setTaskDistribution(1); deliveTaskDO.setTaskDistribution(1);
deliveTaskDO.setTaskDistributionId(loginUser.getUserid()); deliveTaskDO.setTaskDistributionId(loginUser.getUserid());
deliveTaskDO.setTaskDistributionName(loginUser.getUsername()); deliveTaskDO.setTaskDistributionName(userRealName);
deliveTaskDO.setTaskDistributionTime(new Date()); deliveTaskDO.setTaskDistributionTime(new Date());
deliveTaskDO.setOperatorsBy(stockReceiptOrderDO.getOperatorsBy()); // 作业人仅在 PDA/PC 领取任务时写入 delive_task
deliveTaskDO.setOperatorsName(stockReceiptOrderDO.getOperatorsName());
deliveTaskDO.setCreateBy(loginUser.getUserid()); deliveTaskDO.setCreateBy(loginUser.getUserid());
deliveTaskDO.setCreateByName(loginUser.getUsername()); deliveTaskDO.setCreateByName(userRealName);
deliveTaskDO.setCreateTime(new Date()); deliveTaskDO.setCreateTime(new Date());
deliveTaskDOList.add(deliveTaskDO); deliveTaskDOList.add(deliveTaskDO);
} }
@@ -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.containerUsageRecord.repository.todo.ContainerUsageRecordDO;
import com.mhd.wms.domain.copyCodeReference.entity.CopyCodeReference; import com.mhd.wms.domain.copyCodeReference.entity.CopyCodeReference;
import com.mhd.wms.domain.copyCodeReference.repository.facade.ICopyCodeReferenceService; 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.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.inMaterialDetail.entity.InMaterialDetail; import com.mhd.wms.domain.inMaterialDetail.entity.InMaterialDetail;
@@ -323,8 +324,8 @@ public class StockShelfOrderDomainService {
if (CollectionUtils.isEmpty(stockShelfOrderPOList)){ if (CollectionUtils.isEmpty(stockShelfOrderPOList)){
throw new ServiceException("上架单不存在或已下发,请重新选择"); throw new ServiceException("上架单不存在或已下发,请重新选择");
} }
//上架生成任务下发 //上架生成任务下发delive_task 作业人留空接收任务后再写入
genDeliveTask(stockShelfOrderPOList, stockShelfOrderDO); genDeliveTask(stockShelfOrderPOList);
//标记收货单任务已下发 //标记收货单任务已下发
return stockShelfOrderService.update(null, new UpdateWrapper<StockShelfOrder>().lambda() return stockShelfOrderService.update(null, new UpdateWrapper<StockShelfOrder>().lambda()
.set(StockShelfOrder::getTaskDistribution, 1) .set(StockShelfOrder::getTaskDistribution, 1)
@@ -1728,11 +1729,10 @@ public class StockShelfOrderDomainService {
* @description 上架生成任务下发 * @description 上架生成任务下发
* @author ZhouGY * @author ZhouGY
* @date 2024/7/27 15:23 * @date 2024/7/27 15:23
* @param stockReceiptOrderPOList * @param stockShelfOrderPOList 待生成上架类下发的上架单
* @param stockReceiptOrderDO
*/ */
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public void genDeliveTask(List<StockShelfOrderPO> stockReceiptOrderPOList, StockShelfOrderDO stockReceiptOrderDO){ public void genDeliveTask(List<StockShelfOrderPO> stockShelfOrderPOList){
LoginUser loginUser = SecurityUtils.getLoginUser(); LoginUser loginUser = SecurityUtils.getLoginUser();
// 获取用户姓名优先从UserPo获取如果为空则使用realname最后使用username作为兜底 // 获取用户姓名优先从UserPo获取如果为空则使用realname最后使用username作为兜底
final String userRealName = (loginUser.getUserPo() != null && loginUser.getUserPo().getUserName() != null final String userRealName = (loginUser.getUserPo() != null && loginUser.getUserPo().getUserName() != null
@@ -1742,23 +1742,38 @@ public class StockShelfOrderDomainService {
? loginUser.getRealname() ? loginUser.getRealname()
: loginUser.getUsername(); : loginUser.getUsername();
List<DeliveTaskDO> deliveTaskDOList = new ArrayList<>(); List<DeliveTaskDO> deliveTaskDOList = new ArrayList<>();
for (StockShelfOrderPO stockShelfOrderPO : stockReceiptOrderPOList){ for (StockShelfOrderPO stockShelfOrderPO : stockShelfOrderPOList){
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(stockShelfOrderPO.getShelfOrderNumber()); deliveTaskDO.setTrackingNumber(stockShelfOrderPO.getShelfOrderNumber());
deliveTaskDO.setWarehouseId(stockShelfOrderPO.getWarehouseId()); Long whId = stockShelfOrderPO.getWarehouseId();
deliveTaskDO.setWarehouseCode(stockShelfOrderPO.getWarehouseCode()); String whCode = stockShelfOrderPO.getWarehouseCode();
deliveTaskDO.setWarehouseName(stockShelfOrderPO.getWarehouseName()); String whName = stockShelfOrderPO.getWarehouseName();
if ((whId == null || whId == 0L) && StringUtils.isNotBlank(stockShelfOrderPO.getInOrderNumber())) {
StockInOrder inOrder = stockInOrderService.getOne(new LambdaQueryWrapper<StockInOrder>()
.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.setTaskType(2);
deliveTaskDO.setTaskDistribution(1); deliveTaskDO.setTaskDistribution(1);
deliveTaskDO.setTaskDistributionId(loginUser.getUserid()); deliveTaskDO.setTaskDistributionId(loginUser.getUserid());
deliveTaskDO.setTaskDistributionName(userRealName); deliveTaskDO.setTaskDistributionName(userRealName);
deliveTaskDO.setTaskDistributionTime(new Date()); deliveTaskDO.setTaskDistributionTime(new Date());
deliveTaskDO.setOperatorsBy(stockReceiptOrderDO.getOperatorsBy()); // 作业人必须为空仅在 PDA/PC接收任务后由 DeliveTaskDomainService.receive 赋值
deliveTaskDO.setOperatorsName(stockReceiptOrderDO.getOperatorsName()); deliveTaskDO.setOperatorsBy(null);
deliveTaskDO.setOperatorsName(null);
deliveTaskDO.setCreateBy(loginUser.getUserid()); deliveTaskDO.setCreateBy(loginUser.getUserid());
deliveTaskDO.setCreateByName(userRealName); deliveTaskDO.setCreateByName(userRealName);
deliveTaskDO.setCreateTime(new Date()); deliveTaskDO.setCreateTime(new Date());
@@ -1767,6 +1782,57 @@ public class StockShelfOrderDomainService {
deliveTaskService.batchInsert(deliveTaskDOList); 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<StockShelfOrderPO> 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<StockShelfOrderPO> pending = shelves.stream()
.filter(s -> s != null && Objects.equals(1, s.getTaskDistribution()))
.filter(s -> StringUtils.isNotBlank(s.getShelfOrderNumber()))
.filter(s -> deliveTaskService.count(new LambdaQueryWrapper<DeliveTask>()
.eq(DeliveTask::getTrackingNumber, s.getShelfOrderNumber())
.eq(DeliveTask::getTaskType, 2)
.eq(DeliveTask::getDelFlag, 1)) == 0)
.collect(Collectors.toList());
if (pending.isEmpty()) {
return;
}
genDeliveTask(pending);
List<Long> shelfOrderIds = pending.stream()
.map(StockShelfOrderPO::getShelfOrderId)
.filter(Objects::nonNull)
.collect(Collectors.toList());
if (!shelfOrderIds.isEmpty()) {
stockShelfOrderService.update(null, new UpdateWrapper<StockShelfOrder>().lambda()
.set(StockShelfOrder::getTaskDistributionTime, now)
.set(StockShelfOrder::getUpdateBy, loginUser.getUserid())
.set(StockShelfOrder::getUpdateByName, userRealName)
.set(StockShelfOrder::getUpdateTime, now)
.in(StockShelfOrder::getShelfOrderId, shelfOrderIds));
}
}
/** /**
* @description 保存库存序列号 * @description 保存库存序列号
* @author liyc * @author liyc
@@ -31,8 +31,9 @@ public class DeliveTaskAppApi extends BaseController {
private DeliveTaskAssembler deliveTaskAssembler; private DeliveTaskAssembler deliveTaskAssembler;
/** /**
* 分页查询下发任务列表 * 分页查询下发任务列表条件del_flag=1当前一级组织请求参数 warehouseId
* @return * task_distribution_id=当前登录用户不按 task_status 过滤入参传入 taskStatus 时可选筛状态
* PC 列表不同不按 tabType/operators_by 过滤
*/ */
@ApiOperation("查询下发任务列表") @ApiOperation("查询下发任务列表")
@GetMapping("/list") @GetMapping("/list")
@@ -48,7 +48,7 @@ public class ReviewOrderAppApi extends BaseController {
* 分页查询复核单列表仅已下发任务按当前用户仓库过滤 * 分页查询复核单列表仅已下发任务按当前用户仓库过滤
* <ul> * <ul>
* <li>{@code tabType=2}历史{@code review_status=3} 已复核</li> * <li>{@code tabType=2}历史{@code review_status=3} 已复核</li>
* <li>其它待办{@code review_status &lt; 3}待复核/复核中</li> * <li>其它待办{@code review_status &lt; 3}待复核/复核中且仅 {@code receive_time} 非空已在下发任务中接收</li>
* </ul> * </ul>
*/ */
@ApiOperation("PDA 复核单列表(REVIEW_ORDER") @ApiOperation("PDA 复核单列表(REVIEW_ORDER")
@@ -104,7 +104,7 @@ public class ReviewOrderAppApi extends BaseController {
} }
/** /**
* 完成复核确认无待复核数量时可确认同步出库明细生成交接 PC checkConfirm 一致 * 完成复核确认同步出库明细生成交接作业单并自动下发交接类 PDA 任务 delive_task/taskType=7与拣货完成后自动复核下发对齐
*/ */
@ApiOperation("PDA 完成复核") @ApiOperation("PDA 完成复核")
@PostMapping("/completeCheck") @PostMapping("/completeCheck")
@@ -132,16 +132,17 @@ public class StockReceiptOrderAppApi extends BaseController {
} }
/** /**
* 完成收货 * 完成收货生成上架单后自动创建上架类下发任务delive_task.task_type=2tracking_number=上架单号
* 作业人 operators_by/operators_name 默认为空作业人在 {@code DeliveTaskAppApi#receive} 接收任务后写入
*/ */
@ApiOperation("完成收货") @ApiOperation("完成收货(自动生成上架单及上架 delive_task,作业人须接收任务后才有)")
@PostMapping("/completeReceipt") @PostMapping("/completeReceipt")
public AjaxResult completeReceipt(@RequestBody StockReceiptOrderDTO stockReceiptOrderDTO) { public AjaxResult completeReceipt(@RequestBody StockReceiptOrderDTO stockReceiptOrderDTO) {
stockReceiptOrderApplicationService.updateInOrder(stockReceiptOrderDTO); stockReceiptOrderApplicationService.updateInOrder(stockReceiptOrderDTO);
return toAjax(stockReceiptOrderApplicationService.completeReceiptByApp(stockReceiptOrderDTO.getReceiptOrderId())); return toAjax(stockReceiptOrderApplicationService.completeReceiptByApp(stockReceiptOrderDTO.getReceiptOrderId()));
} }
@ApiOperation("生成上架单") @ApiOperation("生成上架单(PDA 路径同完成收货:自动上架 delive_task,作业人接收后赋值)")
@PostMapping("/genStockShelfOrder") @PostMapping("/genStockShelfOrder")
public AjaxResult genStockShelfOrder(@RequestBody StockReceiptOrderDTO stockReceiptOrderDTO) { public AjaxResult genStockShelfOrder(@RequestBody StockReceiptOrderDTO stockReceiptOrderDTO) {
return toAjax(stockReceiptOrderApplicationService.genStockShelfOrder(stockReceiptOrderDTO.getReceiptOrderId())); return toAjax(stockReceiptOrderApplicationService.genStockShelfOrder(stockReceiptOrderDTO.getReceiptOrderId()));
@@ -138,6 +138,78 @@ 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 过滤 -->
<sql id="selectDeliveTaskPoApp1">
<where>
del_flag = 1
<if test="taskNumber != null and taskNumber != ''">
and task_number = #{taskNumber}
</if>
<if test="trackingNumber != null and trackingNumber != ''">
and tracking_number = #{trackingNumber}
</if>
<if test="organizationId != null ">
and organization_id = #{organizationId}
</if>
<if test="organizationIdList != null and organizationIdList.size() > 0">
and organization_id in
<foreach collection="organizationIdList" item="item" open="(" separator="," close=")">
#{item}
</foreach>
</if>
<if test="organizationName != null and organizationName != ''">
and organization_name like concat('%', #{organizationName}, '%')
</if>
<if test="topOrganizationId != null ">
and top_organization_id = #{topOrganizationId}
</if>
<if test="warehouseId != null ">
and warehouse_id = #{warehouseId}
</if>
<if test="warehouseCode != null and warehouseCode != ''">
and warehouse_code = #{warehouseCode}
</if>
<if test="warehouseName != null and warehouseName != ''">
and warehouse_name like concat('%', #{warehouseName}, '%')
</if>
<if test="taskType != null and taskType != 0 ">
and task_type = #{taskType}
</if>
<if test="taskType != null and taskType == 7 and (handoverQueryType == null or handoverQueryType == 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 = 1)
</if>
<if test="taskType != null and taskType == 7 and handoverQueryType == 2">
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)
</if>
<if test="taskStatus != null ">
and task_status = #{taskStatus}
</if>
<if test="taskDistribution != null ">
and task_distribution = #{taskDistribution}
</if>
<if test="taskDistributionTime != null ">
and task_distribution_time = #{taskDistributionTime}
</if>
<if test="taskDistributionId != null ">
and task_distribution_id = #{taskDistributionId}
</if>
<if test="taskDistributionName != null and taskDistributionName != ''">
and task_distribution_name like concat('%', #{taskDistributionName}, '%')
</if>
<if test="operatorsName != null and operatorsName != ''">
and operators_name like concat('%', #{operatorsName}, '%')
</if>
<if test="reassignTime != null ">
and reassign_time = #{reassignTime}
</if>
<if test="reassignById != null ">
and reassign_by_id = #{reassignById}
</if>
<if test="reassignByName != null and reassignByName != ''">
and reassign_by_name like concat('%', #{reassignByName}, '%')
</if>
</where>
</sql>
<sql id="selectDeliveTaskPo2"> <sql id="selectDeliveTaskPo2">
<if test="organizationId != null "> <if test="organizationId != null ">
and organization_id = #{organizationId} and organization_id = #{organizationId}
@@ -208,7 +280,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
</select> </select>
<select id="queryListApp" parameterType="com.mhd.wms.domain.deliveTask.repository.todo.DeliveTaskDO" resultMap="DeliveTaskResult"> <select id="queryListApp" parameterType="com.mhd.wms.domain.deliveTask.repository.todo.DeliveTaskDO" resultMap="DeliveTaskResult">
<include refid="selectDeliveTaskPo"/> <include refid="selectDeliveTaskPo"/>
<include refid="selectDeliveTaskPo1"/> <include refid="selectDeliveTaskPoApp1"/>
order by create_time desc order by create_time desc
</select> </select>
<select id="workbenchQuery" parameterType="java.lang.Long" resultMap="DeliveTaskResultSum"> <select id="workbenchQuery" parameterType="java.lang.Long" resultMap="DeliveTaskResultSum">
@@ -165,6 +165,9 @@
<if test="receiveTimeEnd != null and receiveTimeEnd != ''"> <if test="receiveTimeEnd != null and receiveTimeEnd != ''">
and date_format(a.receive_time, '%Y-%m-%d') &lt;= #{receiveTimeEnd} and date_format(a.receive_time, '%Y-%m-%d') &lt;= #{receiveTimeEnd}
</if> </if>
<if test="onlyReceived != null and onlyReceived == 1">
and a.receive_time is not null
</if>
<choose> <choose>
<when test="delFlag != null"> <when test="delFlag != null">
and a.del_flag = #{delFlag} and a.del_flag = #{delFlag}
@@ -147,8 +147,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
where IN_ORDER_NUMBER = #{inOrderNumber} and LOT_NUMBER = #{lotNumber} where IN_ORDER_NUMBER = #{inOrderNumber} and LOT_NUMBER = #{lotNumber}
</update> </update>
<update id="updateOmsInventorySynchronization"> <update id="updateOmsInventorySynchronization">
update "NGWL_TEST_OMS".RESERVATION_MATERIAL_INVENTORY set INVENTORY_QUANTITY = INVENTORY_QUANTITY - #{quantity}, update "NGWL_TEST_OMS".RESERVATION_MATERIAL_INVENTORY set INVENTORY_QUANTITY = INVENTORY_QUANTITY - #{checkQuantity},
ALLOCATION_QUANTITY= ALLOCATION_QUANTITY - #{quantity} ALLOCATION_QUANTITY= ALLOCATION_QUANTITY - #{checkQuantity}
where IN_ORDER_NUMBER = #{inOrderNumber} and LOT_NUMBER = #{lotNo} where IN_ORDER_NUMBER = #{inOrderNumber} and LOT_NUMBER = #{lotNo}
</update> </update>
</mapper> </mapper>