PDA下发任务栏领取任务修改
This commit is contained in:
+3
-2
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
+14
-6
@@ -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);
|
||||
|
||||
+4
-1
@@ -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("任务类型不存在");
|
||||
}
|
||||
|
||||
+5
@@ -52,6 +52,11 @@ public interface IDeliveTaskService extends IService<DeliveTask>
|
||||
|
||||
public int refuse(Long deliverTaskId);
|
||||
|
||||
/**
|
||||
* 更新下发任务作业人(接收时写入当前用户)
|
||||
*/
|
||||
int updateOperatorsBy(Long deliverTaskId, Long operatorsBy, String operatorsName);
|
||||
|
||||
/**
|
||||
* 查询列表表头数量
|
||||
*/
|
||||
|
||||
+6
-8
@@ -99,14 +99,7 @@ public class DeliveTaskImpl extends ServiceImpl<DeliveTaskMapper, DeliveTask> im
|
||||
@Override
|
||||
public List<DeliveTaskPO> 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<DeliveTaskPO> deliveTaskPOS = deliveTaskMapper.queryListApp(deliveTaskDO);
|
||||
if (deliveTaskDO.getTaskType() == 7){
|
||||
statistics(deliveTaskPOS);
|
||||
@@ -277,6 +270,11 @@ public class DeliveTaskImpl extends ServiceImpl<DeliveTaskMapper, DeliveTask> 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);
|
||||
}
|
||||
/**
|
||||
* 拒绝操作
|
||||
*/
|
||||
|
||||
+30
-2
@@ -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();
|
||||
}
|
||||
/**
|
||||
* 拒绝操作
|
||||
*/
|
||||
|
||||
+20
-1
@@ -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<HandoverTaskOrderMapper, HandoverTaskOrder> implements IHandoverTaskOrderService {
|
||||
public class HandoverTaskOrderImpl extends ServiceImpl<HandoverTaskOrderMapper, HandoverTaskOrder> implements IHandoverTaskOrderService, IDeliveTaskTypeService {
|
||||
@Autowired
|
||||
private HandoverTaskOrderMapper handoverTaskOrderMapper;
|
||||
|
||||
@@ -118,4 +121,20 @@ public class HandoverTaskOrderImpl extends ServiceImpl<HandoverTaskOrderMapper,
|
||||
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));
|
||||
}
|
||||
|
||||
}
|
||||
+62
-6
@@ -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<HandoverTaskOrder> 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<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.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<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()));
|
||||
}
|
||||
|
||||
}
|
||||
+60
-2
@@ -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<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 生成物料明细实体
|
||||
* @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());
|
||||
|
||||
+6
@@ -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;
|
||||
}
|
||||
|
||||
+1
-1
@@ -517,7 +517,7 @@ public class StockInOrderDomainService {
|
||||
if (!batchInsertResult) {
|
||||
throw new ServiceException("生成收货单失败");
|
||||
}
|
||||
// 入库作业单(收货 type=1)在「收货任务下发」时生成,审核通过仅生成收货单与质检等,此处不再落 stock_in_task_order
|
||||
// 收货任务不随审核自动下发,需在收货单侧手动「任务下发」(delive_task 等)
|
||||
return batchInsertResult;
|
||||
}
|
||||
|
||||
|
||||
+3
-1
@@ -720,7 +720,9 @@ public class StockOutOrderDomainService {
|
||||
}
|
||||
pickingOrderDOList.add(pickingOrderDO);
|
||||
});
|
||||
return pickingOrderDomainService.batchInsert(pickingOrderDOList);
|
||||
Boolean inserted = pickingOrderDomainService.batchInsert(pickingOrderDOList);
|
||||
// 拣货任务不随生成拣货单自动下发,需在拣货单侧「整单下发/明细下发」
|
||||
return inserted;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
+17
@@ -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<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;
|
||||
}
|
||||
|
||||
|
||||
+20
@@ -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;
|
||||
|
||||
+107
-9
@@ -168,6 +168,7 @@ public class StockReceiptOrderDomainService {
|
||||
List<ReceiptMaterialDetail> 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<Long> 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<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
|
||||
* @return Boolean
|
||||
@@ -1466,6 +1527,14 @@ public class StockReceiptOrderDomainService {
|
||||
List<StockShelfOrderDO> 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<ReceiptMaterialDetailPO> receiptMaterialDetailPODbs = receiptMaterialDetailPOListMap.get(p.getReceiptOrderNumber());
|
||||
@@ -2072,6 +2150,12 @@ public class StockReceiptOrderDomainService {
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public void genDeliveTask(List<StockReceiptOrderPO> 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<DeliveTaskDO> 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<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.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);
|
||||
}
|
||||
|
||||
+77
-11
@@ -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<StockShelfOrder>().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<StockShelfOrderPO> stockReceiptOrderPOList, StockShelfOrderDO stockReceiptOrderDO){
|
||||
public void genDeliveTask(List<StockShelfOrderPO> 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<DeliveTaskDO> 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<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.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<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 保存库存序列号
|
||||
* @author liyc
|
||||
|
||||
+3
-2
@@ -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")
|
||||
|
||||
+2
-2
@@ -48,7 +48,7 @@ public class ReviewOrderAppApi extends BaseController {
|
||||
* 分页查询复核单列表(仅已下发任务,按当前用户仓库过滤)
|
||||
* <ul>
|
||||
* <li>{@code tabType=2}:历史({@code review_status=3} 已复核)</li>
|
||||
* <li>其它:待办({@code review_status < 3},待复核/复核中)</li>
|
||||
* <li>其它:待办({@code review_status < 3},待复核/复核中),且仅 {@code receive_time} 非空(已在下发任务中接收)</li>
|
||||
* </ul>
|
||||
*/
|
||||
@ApiOperation("PDA 复核单列表(REVIEW_ORDER)")
|
||||
@@ -104,7 +104,7 @@ public class ReviewOrderAppApi extends BaseController {
|
||||
}
|
||||
|
||||
/**
|
||||
* 完成复核确认(无待复核数量时可确认,同步出库明细并生成交接等,与 PC checkConfirm 一致)
|
||||
* 完成复核确认(同步出库明细、生成交接作业单,并自动下发交接类 PDA 任务 delive_task/taskType=7,与拣货完成后自动复核下发对齐)
|
||||
*/
|
||||
@ApiOperation("PDA 完成复核")
|
||||
@PostMapping("/completeCheck")
|
||||
|
||||
+4
-3
@@ -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()));
|
||||
|
||||
@@ -138,6 +138,78 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||
</if>
|
||||
</where>
|
||||
</sql>
|
||||
<!-- PDA 下发任务列表:与 del_flag、top_organization_id、warehouse_id、task_status、task_distribution_id 为主条件,不按 operators_by/tabType 过滤 -->
|
||||
<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">
|
||||
<if test="organizationId != null ">
|
||||
and organization_id = #{organizationId}
|
||||
@@ -208,7 +280,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||
</select>
|
||||
<select id="queryListApp" parameterType="com.mhd.wms.domain.deliveTask.repository.todo.DeliveTaskDO" resultMap="DeliveTaskResult">
|
||||
<include refid="selectDeliveTaskPo"/>
|
||||
<include refid="selectDeliveTaskPo1"/>
|
||||
<include refid="selectDeliveTaskPoApp1"/>
|
||||
order by create_time desc
|
||||
</select>
|
||||
<select id="workbenchQuery" parameterType="java.lang.Long" resultMap="DeliveTaskResultSum">
|
||||
|
||||
@@ -165,6 +165,9 @@
|
||||
<if test="receiveTimeEnd != null and receiveTimeEnd != ''">
|
||||
and date_format(a.receive_time, '%Y-%m-%d') <= #{receiveTimeEnd}
|
||||
</if>
|
||||
<if test="onlyReceived != null and onlyReceived == 1">
|
||||
and a.receive_time is not null
|
||||
</if>
|
||||
<choose>
|
||||
<when test="delFlag != null">
|
||||
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}
|
||||
</update>
|
||||
<update id="updateOmsInventorySynchronization">
|
||||
update "NGWL_TEST_OMS".RESERVATION_MATERIAL_INVENTORY set INVENTORY_QUANTITY = INVENTORY_QUANTITY - #{quantity},
|
||||
ALLOCATION_QUANTITY= ALLOCATION_QUANTITY - #{quantity}
|
||||
update "NGWL_TEST_OMS".RESERVATION_MATERIAL_INVENTORY set INVENTORY_QUANTITY = INVENTORY_QUANTITY - #{checkQuantity},
|
||||
ALLOCATION_QUANTITY= ALLOCATION_QUANTITY - #{checkQuantity}
|
||||
where IN_ORDER_NUMBER = #{inOrderNumber} and LOT_NUMBER = #{lotNo}
|
||||
</update>
|
||||
</mapper>
|
||||
Reference in New Issue
Block a user