Merge branch 'refs/heads/dev_WMS20260401' into dev

# Conflicts:
#	mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/UserServiceFeign.java
#	mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/factory/RemoteUserFeignFallbackFactory.java
This commit is contained in:
赵辉
2026-04-29 11:16:40 +08:00
131 changed files with 19524 additions and 210 deletions
+31
View File
@@ -59,4 +59,35 @@ ALTER TABLE NGWL_TEST_WMS.PICKING_MATERIAL_DETAIL ADD IN_ORDER_NUMBER varchar(10
ALTER TABLE stock_receipt_order ADD oms_stock_in_order_id VARCHAR(64);
CREATE TABLE NGWL_TEST_SYSTEM.LINE_MANAGEMENT (
ID BIGINT NOT NULL AUTO_INCREMENT,
ORGANIZATION_ID BIGINT DEFAULT NULL,
ORGANIZATION_NAME VARCHAR(100) DEFAULT NULL,
TOP_ORGANIZATION_ID BIGINT DEFAULT NULL,
WAREHOUSE_ID BIGINT DEFAULT NULL,
WAREHOUSE_NAME VARCHAR(100) DEFAULT NULL,
ROUTE_CODE VARCHAR(100) DEFAULT NULL,
ROUTE_NAME VARCHAR(200) DEFAULT NULL,
CUSTOMER_JSON CLOB DEFAULT NULL,
CREATE_BY BIGINT DEFAULT NULL,
CREATE_BY_NAME VARCHAR(50) DEFAULT NULL,
CREATE_TIME TIMESTAMP DEFAULT CURRENT_TIMESTAMP NULL,
UPDATE_BY BIGINT DEFAULT NULL,
UPDATE_BY_NAME VARCHAR(50) DEFAULT NULL,
UPDATE_TIME TIMESTAMP DEFAULT CURRENT_TIMESTAMP NULL,
DEL_FLAG TINYINT DEFAULT 1 NULL,
CONSTRAINT PK_LINE_MANAGEMENT PRIMARY KEY (ID)
);
ALTER TABLE NGWL_TEST_USER."USER" ADD LINE_MANAGEMENT_ID varchar(100) NULL;
ALTER TABLE NGWL_TEST_USER."USER" ADD ROUTE_CODE varchar(100) NULL;
ALTER TABLE NGWL_TEST_USER."USER" ADD ROUTE_NAME varchar(100) NULL;
ALTER TABLE NGWL_TEST_USER."USER" ADD DELIVERY_ORDER varchar(100) NULL;
@@ -6,12 +6,17 @@ import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.context.annotation.ComponentScan;
@SpringBootApplication
@EnableRyFeignClients
@EnableDiscoveryClient
@MapperScan("com.mhd.wms.domain.**.mapper")
@EnableMethodCache(basePackages = "com.mhd.platform.domain.**.cache")
@ComponentScan(basePackages = {
"com.mhd.wms",
"com.mhd.system.api.factory"
})
public class MhdWmsApplication {
public static void main(String[] args) {
@@ -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);
}
@@ -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);
@@ -6,7 +6,9 @@ import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson2.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.mhd.common.core.constant.SecurityConstants;
import com.mhd.common.core.constant.SnowFlakeConstants;
import com.mhd.common.core.domain.entity.R;
import com.mhd.common.core.domain.po.UserPo;
import com.mhd.common.core.enums.DictCode;
import com.mhd.common.core.exception.ServiceException;
@@ -245,6 +247,16 @@ public class StockOutOrderApplicationService {
stockOutOrderPO.setReceiptOrderAccountList(
accountByOrderId.getOrDefault(stockOutOrderPO.getOutOrderId(), Collections.emptyList()));
}
for (StockOutOrderPO stockOutOrderPO : stockOutOrderPOS) {
R<LoginUser> userByUser = userServiceFeign.getUserByUserId(stockOutOrderPO.getCustomerId(), SecurityConstants.INNER);
LoginUser user = userByUser.getData();
if (StringUtils.isNotEmpty(user.getLineManagementId())){
stockOutOrderPO.setLineManagementId(user.getLineManagementId());
stockOutOrderPO.setRouteCode(user.getRouteCode());
stockOutOrderPO.setRouteName(user.getRouteName());
stockOutOrderPO.setDeliveryOrder(user.getDeliveryOrder());
}
}
return stockOutOrderPOS;
}
@@ -217,6 +217,10 @@ public class StockReceiptOrderApplicationService {
Map<Long, List<BatchDetailFeignPO>> batchDetailMap = new HashMap<>();
for (Long materialBaseInfoId : materialBaseInfoIdSet) {
try {
MaterialGoodsRulePO localGoodsRule = materialGoodsRuleService.getInfoByMaterialBaseInfoIds(materialBaseInfoId);
if (localGoodsRule == null || localGoodsRule.getBatchId() == null) {
continue;
}
AjaxResult ajaxResult = systemServiceFeign.getBatchDetailListByMaterialBaseInfoId(materialBaseInfoId);
if (ajaxResult != null && "200".equals(String.valueOf(ajaxResult.get("code")))) {
List<BatchDetailFeignPO> batchDetailFeignPOList = JSON.parseArray(
@@ -253,6 +257,10 @@ public class StockReceiptOrderApplicationService {
log.warn("获取物料基础信息失败,物料基础信息ID:{},错误:{}", materialBaseInfoId, e.getMessage());
}
}
for (ReceiptMaterialDetailPO receiptMaterialDetailPO : receiptMaterialDetailPOList) {
MaterialBaseInfoPO materialBaseInfoPO = materialBaseInfoMap.get(receiptMaterialDetailPO.getMaterialBaseInfoId());
receiptMaterialDetailPO.setCopyCode(materialBaseInfoPO.getCopyCode());
}
// 4.2 批量查询包装规格信息(单位代码为EA的单位名称)
Map<Long, PackDetailFeignPO> packDetailMap = new HashMap<>();
@@ -2332,6 +2332,9 @@ public class StockShelfOrderApplicationService {
}
}
}
if (materialMoreDetailList.isEmpty() && !CollectionUtils.isEmpty(existingList)) {
materialMoreDetailList.addAll(existingList);
}
shelfMaterialDetailPO.setMaterialMoreDetailList(materialMoreDetailList);
log.info("物料明细 uniqueId={}, materialBaseInfoId={}, materialMoreDetailList大小={}",
shelfMaterialDetailPO.getUniqueId(), shelfMaterialDetailPO.getMaterialBaseInfoId(),
@@ -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("任务类型不存在");
}
@@ -52,6 +52,11 @@ public interface IDeliveTaskService extends IService<DeliveTask>
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
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不按 tabTypeoperators_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);
}
/**
* 拒绝操作
*/
@@ -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();
}
/**
* 拒绝操作
*/
@@ -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));
}
}
@@ -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;
@@ -371,6 +372,9 @@ public class HandoverTaskOrderDomainService {
checkNetWeight = checkNetWeight != null ? checkNetWeight : BigDecimal.ZERO;
MaterialInventory materialInventoryPO = materialInventoryMapper.selectById(materialInventoryId);
//oms库存同步
OMSInventorySynchronization(outMaterialDetail,checkQuantity);
if (materialInventoryPO != null) {
MaterialInventoryParamDO materialInventoryParamDO = new MaterialInventoryParamDO();
//更新库存数量
@@ -500,6 +504,12 @@ public class HandoverTaskOrderDomainService {
}
}
private void OMSInventorySynchronization(OutMaterialDetail outMaterialDetail,BigDecimal checkQuantity) {
outMaterialDetail.getLotNo();
outMaterialDetail.getInOrderNumber();
stockShelfOrderService.updateOmsInventorySynchronization(checkQuantity,outMaterialDetail.getLotNo(),outMaterialDetail.getInOrderNumber());
}
@Autowired
private IStockShelfOrderService stockShelfOrderService;
private void OMSWarehouseEntryDetails(OutMaterialDetail outMaterialDetail) {
@@ -566,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=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.getRealname() != null && !loginUser.getRealname().trim().isEmpty())
? loginUser.getRealname()
@@ -589,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());
@@ -599,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()));
}
}
@@ -0,0 +1,67 @@
package com.mhd.wms.domain.lineManagement.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.mhd.common.core.annotation.Excel;
import com.mhd.common.core.web.domain.BaseVOEntity;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.math.BigDecimal;
import java.time.LocalTime;
import java.util.Date;
/**
* 路线管理对象
*
*/
@Data
public class LineManagement extends BaseVOEntity{
private static final long serialVersionUID = 1L;
@ApiModelProperty("id")
@TableId(type = IdType.AUTO)
private Long id;
@ApiModelProperty("组织表ID")
@Excel(name = "组织表ID")
private Long organizationId;
@ApiModelProperty("组织名称")
@Excel(name = "组织名称")
private String organizationName;
@ApiModelProperty("一级组织表ID")
@Excel(name = "一级组织表ID")
private Long topOrganizationId;
@ApiModelProperty("仓库ID")
private Long warehouseId;
@ApiModelProperty("仓库名字")
private String warehouseName;
/**
* 路线编码
*/
@ApiModelProperty("路线编码")
private String routeCode;
/**
* 路线名称
*/
@ApiModelProperty("路线名称")
private String routeName;
/**
* 客户
*/
@ApiModelProperty("客户Json数据")
private String customerJson;
@ApiModelProperty("注册地址")
private String register;
}
@@ -0,0 +1,45 @@
package com.mhd.wms.domain.lineManagement.repository.facade;
import com.baomidou.mybatisplus.extension.service.IService;
import com.mhd.wms.domain.lineManagement.entity.LineManagement;
import com.mhd.wms.domain.lineManagement.repository.po.LineManagementPO;
import com.mhd.wms.domain.lineManagement.repository.todo.LineManagementDO;
import java.util.List;
/**
* 路线管理Service接口
*
* @author gen
* @date 2024-05-07
*/
public interface ILineManagementService extends IService<LineManagement>
{
/**
* 分页查询路线管理列表
*/
public List<LineManagementPO> queryList(LineManagementDO lineManagementDO);
/**
* 新增路线管理
*/
public Boolean insert(LineManagementDO lineManagementDO);
public LineManagement insertReturn(LineManagementDO lineManagementDO);
/**
* 修改路线管理
*/
public Boolean update(LineManagementDO lineManagementDO);
/**
* 批量删除路线管理
*/
public Boolean delete(Long[] ids);
/**
* 查询路线管理
*/
public LineManagementPO getInfo(Long id);
}
@@ -0,0 +1,21 @@
package com.mhd.wms.domain.lineManagement.repository.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.mhd.wms.domain.lineManagement.entity.LineManagement;
import com.mhd.wms.domain.lineManagement.repository.po.LineManagementPO;
import com.mhd.wms.domain.lineManagement.repository.todo.LineManagementDO;
import java.util.List;
/**
* 路线管理Mapper接口
*
*/
public interface LineManagementMapper extends BaseMapper<LineManagement>
{
/**
* 查询路线管理列表
*/
public List<LineManagementPO> queryList(LineManagementDO lineManagementDO);
}
@@ -0,0 +1,156 @@
package com.mhd.wms.domain.lineManagement.repository.persistence;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.nacos.shaded.com.google.gson.JsonObject;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.mhd.common.security.utils.SecurityUtils;
import com.mhd.system.api.UserServiceFeign;
import com.mhd.system.api.domain.UserDTO;
import com.mhd.system.api.model.LoginUser;
import com.mhd.wms.domain.lineManagement.entity.LineManagement;
import com.mhd.wms.domain.lineManagement.repository.facade.ILineManagementService;
import com.mhd.wms.domain.lineManagement.repository.mapper.LineManagementMapper;
import com.mhd.wms.domain.lineManagement.repository.po.LineManagementPO;
import com.mhd.wms.domain.lineManagement.repository.todo.LineManagementCustomer;
import com.mhd.wms.domain.lineManagement.repository.todo.LineManagementDO;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
/**
* 路线管理Service业务层处理
*
* @author gen
* @date 2024-05-07
*/
@Service
public class LineManagementImpl extends ServiceImpl<LineManagementMapper, LineManagement> implements ILineManagementService {
@Autowired
private LineManagementMapper lineManagementMapper;
@Autowired
private UserServiceFeign userServiceFeign;
/**
* 查询路线管理列表
*/
@Override
public List<LineManagementPO> queryList(LineManagementDO lineManagementDO)
{
return lineManagementMapper.queryList(lineManagementDO);
}
/**
* 新增路线管理
*/
@Override
public Boolean insert(LineManagementDO lineManagementDO) {
LoginUser loginUser = SecurityUtils.getLoginUser();
LineManagement LineManagement = new LineManagement();
BeanUtils.copyProperties(lineManagementDO,LineManagement);
LineManagement.setCreateBy(loginUser.getUserid());
LineManagement.setCreateByName(loginUser.getUsername());
LineManagement.setCreateTime(new Date());
boolean save = this.save(LineManagement);
//客户列表补充id
List<LineManagementCustomer> lineManagementCustomers =
JSONObject.parseArray(lineManagementDO.getCustomerJson(), LineManagementCustomer.class);
for (LineManagementCustomer lineManagementCustomer : lineManagementCustomers) {
UserDTO userDTO = new UserDTO();
userDTO.setUserId(lineManagementCustomer.getUserId());
userDTO.setDeliveryOrder(lineManagementCustomer.getDeliveryOrder());
userDTO.setLineManagementId(LineManagement.getId().toString());
userDTO.setRouteCode(lineManagementDO.getRouteCode());
userDTO.setRouteName(lineManagementDO.getRouteName());
userServiceFeign.updateLineManagement(userDTO);
}
return save;
}
@Override
public LineManagement insertReturn(LineManagementDO lineManagementDO) {
LoginUser loginUser = SecurityUtils.getLoginUser();
LineManagement lineManagement = new LineManagement();
BeanUtils.copyProperties(lineManagementDO,lineManagement);
boolean save = this.save(lineManagement);
if (save) {
return lineManagement;
}
return lineManagement;
}
/**
* 修改路线管理
*/
@Override
public Boolean update(LineManagementDO lineManagementDO) {
LoginUser loginUser = SecurityUtils.getLoginUser();
LineManagement lineManagement = new LineManagement();
BeanUtils.copyProperties(lineManagementDO,lineManagement);
LineManagement lineManagementDB = this.getById(lineManagement.getId());
//删除用户
List<LineManagementCustomer> lineManagementCustomers =
JSONObject.parseArray(lineManagementDB.getCustomerJson(), LineManagementCustomer.class);
for (LineManagementCustomer lineManagementCustomer : lineManagementCustomers) {
UserDTO userDTO = new UserDTO();
userDTO.setUserId(lineManagementCustomer.getUserId());
userDTO.setDeliveryOrder("");
userDTO.setLineManagementId("");
userDTO.setRouteCode("");
userDTO.setRouteName("");
userServiceFeign.updateLineManagement(userDTO);
}
List<LineManagementCustomer> lineManagementCustomers2 =
JSONObject.parseArray(lineManagementDO.getCustomerJson(), LineManagementCustomer.class);
for (LineManagementCustomer lineManagementCustomer : lineManagementCustomers) {
UserDTO userDTO = new UserDTO();
userDTO.setUserId(lineManagementCustomer.getUserId());
userDTO.setDeliveryOrder(lineManagementCustomer.getDeliveryOrder());
userDTO.setLineManagementId(lineManagement.getId().toString());
userDTO.setRouteCode(lineManagementDO.getRouteCode());
userDTO.setRouteName(lineManagementDO.getRouteName());
userServiceFeign.updateLineManagement(userDTO);
}
lineManagement.setUpdateBy(loginUser.getUserid());
lineManagement.setUpdateTime(new Date());
lineManagement.setUpdateByName(loginUser.getUsername());
return this.updateById(lineManagement);
}
/**
* 批量删除路线管理
*/
@Override
@Transactional(rollbackFor = Exception.class)
public Boolean delete(Long[] lineManagementIds ) {
LoginUser loginUser = SecurityUtils.getLoginUser();
List<LineManagement> list = new ArrayList<>();
for (Long id : lineManagementIds) {
LineManagement lineManagement = new LineManagement();
lineManagement.setId(id);
lineManagement.setDelFlag(2);
lineManagement.setUpdateBy(loginUser.getUserid());
lineManagement.setUpdateByName(loginUser.getUsername());
lineManagement.setUpdateTime(new Date());
list.add(lineManagement);
}
return this.updateBatchById(list);
}
/**
* 修改路线管理
*/
@Override
public LineManagementPO getInfo(Long lineManagementId) {
LineManagement LineManagement = this.getById(lineManagementId);
LineManagementPO lineManagementPO = new LineManagementPO();
BeanUtils.copyProperties(LineManagement,lineManagementPO);
return lineManagementPO;
}
}
@@ -0,0 +1,62 @@
package com.mhd.wms.domain.lineManagement.repository.po;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.mhd.common.core.annotation.Excel;
import com.mhd.common.core.web.domain.BaseVOEntity;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* 路线管理对象
*
*/
@Data
public class LineManagementPO extends BaseVOEntity{
private static final long serialVersionUID = 1L;
@ApiModelProperty("id")
@TableId(type = IdType.AUTO)
private Long id;
@ApiModelProperty("组织表ID")
@Excel(name = "组织表ID")
private Long organizationId;
@ApiModelProperty("组织名称")
@Excel(name = "组织名称")
private String organizationName;
@ApiModelProperty("一级组织表ID")
@Excel(name = "一级组织表ID")
private Long topOrganizationId;
@ApiModelProperty("仓库ID")
private Long warehouseId;
@ApiModelProperty("仓库名字")
private String warehouseName;
/**
* 路线编码
*/
@ApiModelProperty("路线编码")
private String routeCode;
/**
* 路线名称
*/
@ApiModelProperty("路线名称")
private String routeName;
/**
* 客户
*/
@ApiModelProperty("客户Json数据")
private String customerJson;
@ApiModelProperty("注册地址")
private String register;
}
@@ -0,0 +1,42 @@
package com.mhd.wms.domain.lineManagement.repository.todo;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.mhd.common.core.annotation.Excel;
import com.mhd.common.core.web.domain.BaseVOEntity;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* 路线管理对象
*
*/
@Data
public class LineManagementCustomer {
/**
* 用户id
*/
@ApiModelProperty("用户id")
private Long userId;
/**
* 客户编码
*/
@ApiModelProperty("客户编码")
private String customerCode;
/**
* 客户名称
*/
@ApiModelProperty("客户名称")
private String customerName;
/**
* 配送顺序
*/
@ApiModelProperty("配送顺序")
private String deliveryOrder;
}
@@ -0,0 +1,61 @@
package com.mhd.wms.domain.lineManagement.repository.todo;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.mhd.common.core.annotation.Excel;
import com.mhd.common.core.web.domain.BaseVOEntity;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* 路线管理对象
*
*/
@Data
public class LineManagementDO extends BaseVOEntity{
private static final long serialVersionUID = 1L;
@ApiModelProperty("id")
@TableId(type = IdType.AUTO)
private Long id;
@ApiModelProperty("组织表ID")
@Excel(name = "组织表ID")
private Long organizationId;
@ApiModelProperty("组织名称")
@Excel(name = "组织名称")
private String organizationName;
@ApiModelProperty("一级组织表ID")
@Excel(name = "一级组织表ID")
private Long topOrganizationId;
@ApiModelProperty("仓库ID")
private Long warehouseId;
@ApiModelProperty("仓库名字")
private String warehouseName;
/**
* 路线编码
*/
@ApiModelProperty("路线编码")
private String routeCode;
/**
* 路线名称
*/
@ApiModelProperty("路线名称")
private String routeName;
/**
* 客户
*/
@ApiModelProperty("客户Json数据")
private String customerJson;
@ApiModelProperty("注册地址")
private String register;
}
@@ -0,0 +1,88 @@
package com.mhd.wms.domain.lineManagement.service;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.mhd.common.security.utils.SecurityUtils;
import com.mhd.system.api.model.LoginUser;
import com.mhd.wms.domain.lineManagement.entity.LineManagement;
import com.mhd.wms.domain.lineManagement.repository.facade.ILineManagementService;
import com.mhd.wms.domain.lineManagement.repository.po.LineManagementPO;
import com.mhd.wms.domain.lineManagement.repository.todo.LineManagementDO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Date;
import java.util.List;
/**
* 租赁管理
*
*/
@Service
@Slf4j
public class LineManagementDomainService {
@Autowired
private ILineManagementService lineManagementService;
/**
* 分页查询租赁管理列表
*/
public List<LineManagementPO> queryList(LineManagementDO lineManagementDO) {
return lineManagementService.queryList(lineManagementDO);
}
/**
* 新增租赁管理
*/
public Boolean insert(LineManagementDO lineManagementDO) {
return lineManagementService.insert(lineManagementDO);
}
public LineManagement insertReturn(LineManagementDO lineManagementDO) {
return lineManagementService.insertReturn(lineManagementDO);
}
/**
* 修改租赁管理
*/
public Boolean update(LineManagementDO lineManagementDO) {
return lineManagementService.update(lineManagementDO);
}
/**
* 批量删除租赁管理
*/
public Boolean delete(Long[] leaseIds) {
return lineManagementService.delete(leaseIds);
}
/**
* 获取租赁管理详细信息
*/
public LineManagementPO getInfo(Long leaseId)
{
return lineManagementService.getInfo(leaseId);
}
/**
* @description 批量作废租赁
* @author ZhouGY
* @date 2024/5/13 9:46
* @param leaseIds
* @return Boolean
*/
public Boolean nullifyByIds(List<Long> leaseIds) {
LoginUser loginUser = SecurityUtils.getLoginUser();
return lineManagementService.update(new UpdateWrapper<LineManagement>().lambda()
.set(LineManagement::getUpdateBy, loginUser.getUserid())
.set(LineManagement::getUpdateTime, new Date())
.in(LineManagement::getId, leaseIds)
.eq(LineManagement::getDelFlag, 1));
}
}
@@ -10,6 +10,7 @@ import com.mhd.common.core.exception.ServiceException;
import com.mhd.common.core.web.domain.AjaxResult;
import com.mhd.common.core.web.domain.BaseVOEntity;
import com.mhd.common.security.utils.SecurityUtils;
import com.mhd.system.api.OmsServiceFeign;
import com.mhd.system.api.SystemServiceFeign;
import com.mhd.system.api.model.LoginUser;
import com.mhd.wms.domain.inventoryAdjustmentRecord.entity.InventoryAdjustmentRecord;
@@ -64,6 +65,8 @@ public class MaterialInventoryImpl extends ServiceImpl<MaterialInventoryMapper,
private IMaterialBarCodeService materialBarCodeService;
@Autowired
private InventoryAdjustmentRecordMapper inventoryAdjustmentRecordMapper;
@Autowired
private OmsServiceFeign omsServiceFeign;
/**
* 查询物料库存列表
@@ -770,10 +773,10 @@ public class MaterialInventoryImpl extends ServiceImpl<MaterialInventoryMapper,
inventoryAdjustmentRecord.setAdjustedVolume(materialInventory.getVolume());
inventoryAdjustmentRecord.setAdjustedArea(materialInventory.getArea());
}
com.mhd.system.api.domain.InventoryAdjustmentRecord inventoryAdjustmentRecordOMS = new com.mhd.system.api.domain.InventoryAdjustmentRecord();
BeanUtils.copyProperties(inventoryAdjustmentRecord, inventoryAdjustmentRecordOMS);
//推送库存调整记录到oms
omsServiceFeign.inventoryAdjustmentRecordInsert(inventoryAdjustmentRecordOMS);
inventoryAdjustmentRecordMapper.insert(inventoryAdjustmentRecord);
}
@@ -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_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 生成物料明细实体
* @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());
@@ -41,6 +41,8 @@ import com.mhd.wms.domain.materialInventory.entity.MaterialInventory;
import com.mhd.wms.domain.materialInventory.repository.facade.IMaterialInventoryService;
import com.mhd.wms.domain.materialInventory.repository.todo.MaterialInventoryDO;
import com.mhd.wms.domain.materialInventory.repository.mapper.MaterialInventoryMapper;
import com.mhd.wms.domain.materialGoodsRule.repository.facade.IMaterialGoodsRuleService;
import com.mhd.wms.domain.materialGoodsRule.repository.po.MaterialGoodsRulePO;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@@ -89,6 +91,8 @@ public class ReceiptMaterialDetailImpl extends ServiceImpl<ReceiptMaterialDetail
@Autowired
private com.mhd.wms.domain.stockInOrder.repository.facade.IStockInOrderService stockInOrderService;
@Autowired
private IMaterialGoodsRuleService materialGoodsRuleService;
@Autowired
private MaterialInventoryMapper materialInventoryMapper;
/**
* 查询物料明细列表
@@ -248,6 +252,11 @@ public class ReceiptMaterialDetailImpl extends ServiceImpl<ReceiptMaterialDetail
if (materialBaseInfoId == null) {
return result;
}
// 本库无商品规则或未绑定 batch_id 禁止调 System 拉批次属性避免 System 对空规则误解析为 batchId=null 时全表查 batch_detail
MaterialGoodsRulePO goodsRule = materialGoodsRuleService.getInfoByMaterialBaseInfoIds(materialBaseInfoId);
if (goodsRule == null || goodsRule.getBatchId() == null) {
return result;
}
try {
AjaxResult ajaxResult = systemServiceFeign.getBatchDetailListByMaterialBaseInfoId(materialBaseInfoId);
if (ajaxResult == null || !"200".equals(String.valueOf(ajaxResult.get("code")))) {
@@ -638,6 +647,10 @@ public class ReceiptMaterialDetailImpl extends ServiceImpl<ReceiptMaterialDetail
private Map<Long, String> loadBatchDetailIdToFieldName(Long materialBaseInfoId) {
Map<Long, String> result = new HashMap<>();
MaterialGoodsRulePO gr = materialGoodsRuleService.getInfoByMaterialBaseInfoIds(materialBaseInfoId);
if (gr == null || gr.getBatchId() == null) {
return result;
}
try {
AjaxResult ajaxResult = systemServiceFeign.getBatchDetailListByMaterialBaseInfoId(materialBaseInfoId);
if (ajaxResult == null || !"200".equals(String.valueOf(ajaxResult.get("code")))) {
@@ -1060,6 +1073,10 @@ public class ReceiptMaterialDetailImpl extends ServiceImpl<ReceiptMaterialDetail
if (materialBaseInfoId == null) {
return result;
}
MaterialGoodsRulePO gr = materialGoodsRuleService.getInfoByMaterialBaseInfoIds(materialBaseInfoId);
if (gr == null || gr.getBatchId() == null) {
return result;
}
try {
AjaxResult ajaxResult = systemServiceFeign.getBatchDetailListByMaterialBaseInfoId(materialBaseInfoId);
if (ajaxResult == null || !"200".equals(String.valueOf(ajaxResult.get("code")))) {
@@ -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;
}
@@ -517,7 +517,7 @@ public class StockInOrderDomainService {
if (!batchInsertResult) {
throw new ServiceException("生成收货单失败");
}
// 入库作业单收货 type=1收货任务下发时生成审核通过仅生成收货单与质检等此处不再落 stock_in_task_order
// 收货任务不随审核自动下发需在收货单侧手动任务下发delive_task
return batchInsertResult;
}
@@ -2,6 +2,7 @@ package com.mhd.wms.domain.stockInTaskOrder.repository.persistence;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.mhd.common.core.constant.SnowFlakeConstants;
import com.mhd.common.core.utils.StringUtils;
import com.mhd.common.core.utils.uuid.IdGenerator;
import com.mhd.common.security.utils.SecurityUtils;
import com.mhd.system.api.model.LoginUser;
@@ -38,6 +39,11 @@ import java.util.List;
*/
@Service
public class StockInTaskOrderImpl extends ServiceImpl<StockInTaskOrderMapper, StockInTaskOrder> implements IStockInTaskOrderService{
/**
* 与收货侧同步写 remark 的约定前缀 StockReceiptOrderDomainService用于 PDA/PC 收货后回写 task_receipt_material_detail
*/
public static final String TASK_RECEIPT_REMARK_RUID_PREFIX = "__RUID__:";
@Autowired
private StockInTaskOrderMapper stockInTaskOrderMapper;
@Autowired
@@ -99,6 +105,7 @@ public class StockInTaskOrderImpl extends ServiceImpl<StockInTaskOrderMapper, St
taskReceiptMaterialDetailDO.setOrganizationName(loginUser.getUserPo().getOrganizationName());
taskReceiptMaterialDetailDO.setTopOrganizationId(loginUser.getUserPo().getTopOrganizationId());
taskReceiptMaterialDetailDO.setTaskNumber(stockInTaskOrderDO.getTaskNumber());
Long receiptLineUidForTaskRemark = taskReceiptMaterialDetailDO.getUniqueId();
taskReceiptMaterialDetailDO.setUniqueId(idGenerator.snowflakeId(SnowFlakeConstants.wmsId));
taskReceiptMaterialDetailDO.setCreateBy(loginUser.getUserid());
taskReceiptMaterialDetailDO.setCreateByName(loginUser.getUsername());
@@ -106,6 +113,7 @@ public class StockInTaskOrderImpl extends ServiceImpl<StockInTaskOrderMapper, St
TaskReceiptMaterialDetail taskReceiptMaterialDetail = new TaskReceiptMaterialDetail();
BeanUtils.copyProperties(taskReceiptMaterialDetailDO, taskReceiptMaterialDetail, "materialDetailId","createBy","createByName","createTime",
"updateBy","updateByName","updateTime");
mergeReceiptLineUniqueIdIntoTaskRemark(taskReceiptMaterialDetail, receiptLineUidForTaskRemark);
taskReceiptMaterialDetailList.add(taskReceiptMaterialDetail);
List<TaskReceiptMaterialDetailDO> taskReceiptMaterialDetailDOList = taskReceiptMaterialDetailDO.getChildren();
if (taskReceiptMaterialDetailDOList != null){
@@ -114,6 +122,7 @@ public class StockInTaskOrderImpl extends ServiceImpl<StockInTaskOrderMapper, St
materialDetailChildDO.setOrganizationName(loginUser.getUserPo().getOrganizationName());
materialDetailChildDO.setTopOrganizationId(loginUser.getUserPo().getTopOrganizationId());
materialDetailChildDO.setTaskNumber(stockInTaskOrderDO.getTaskNumber());
Long childReceiptLineUid = materialDetailChildDO.getUniqueId();
materialDetailChildDO.setUniqueId(idGenerator.snowflakeId(SnowFlakeConstants.wmsId));
materialDetailChildDO.setParentUniqueId(taskReceiptMaterialDetail.getUniqueId());
materialDetailChildDO.setCreateBy(loginUser.getUserid());
@@ -122,6 +131,7 @@ public class StockInTaskOrderImpl extends ServiceImpl<StockInTaskOrderMapper, St
TaskReceiptMaterialDetail taskReceiptMaterialDetailChildren = new TaskReceiptMaterialDetail();
BeanUtils.copyProperties(materialDetailChildDO, taskReceiptMaterialDetailChildren, "materialDetailId","createBy","createByName","createTime",
"updateBy","updateByName","updateTime");
mergeReceiptLineUniqueIdIntoTaskRemark(taskReceiptMaterialDetailChildren, childReceiptLineUid);
taskReceiptMaterialDetailList.add(taskReceiptMaterialDetailChildren);
//序列号
materialDetailSerialNumberList.addAll(genMaterialDetailSerialNumberByReceipt(taskReceiptMaterialDetailDO));
@@ -142,6 +152,38 @@ public class StockInTaskOrderImpl extends ServiceImpl<StockInTaskOrderMapper, St
return saveBatch(stockInTaskOrderList);
}
/**
* 在作业单明细 remark 中保留收货行 business uniqueId便于收货保存后按行回写 receipt_quantity 作业单行 unique_id 与收货行不同
*/
private static void mergeReceiptLineUniqueIdIntoTaskRemark(TaskReceiptMaterialDetail taskRow, Long receiptLineUniqueId) {
if (receiptLineUniqueId == null) {
return;
}
String link = TASK_RECEIPT_REMARK_RUID_PREFIX + receiptLineUniqueId;
String r = taskRow.getRemark();
if (StringUtils.isNotBlank(r) && !r.contains(link)) {
taskRow.setRemark(r + "|" + link);
} else if (StringUtils.isBlank(r)) {
taskRow.setRemark(link);
}
}
/**
* 上架作业单明细 remark 中保留 shelf_material_detail 业务行 uniqueId便于 PDA/PC 上架提交后回写 {@code shelves_quantity} 与收货侧 {@link #mergeReceiptLineUniqueIdIntoTaskRemark} 同前缀
*/
private static void mergeShelfLineUniqueIdIntoTaskRemark(TaskShelfMaterialDetail taskRow, Long shelfLineUniqueId) {
if (shelfLineUniqueId == null) {
return;
}
String link = TASK_RECEIPT_REMARK_RUID_PREFIX + shelfLineUniqueId;
String r = taskRow.getRemark();
if (StringUtils.isNotBlank(r) && !r.contains(link)) {
taskRow.setRemark(r + "|" + link);
} else if (StringUtils.isBlank(r)) {
taskRow.setRemark(link);
}
}
/**
* @description 生成上架作业单
* @author ZhouGY
@@ -161,6 +203,7 @@ public class StockInTaskOrderImpl extends ServiceImpl<StockInTaskOrderMapper, St
BeanUtils.copyProperties(stockInTaskOrderDO, stockInTaskOrder);
stockInTaskOrderList.add(stockInTaskOrder);
stockInTaskOrderDO.getTaskShelfMaterialDetailList().forEach(taskShelfMaterialDetailDO -> {
Long shelfLineBizUid = taskShelfMaterialDetailDO.getUniqueId();
TaskShelfMaterialDetail taskShelfMaterialDetail = new TaskShelfMaterialDetail();
BeanUtils.copyProperties(taskShelfMaterialDetailDO, taskShelfMaterialDetail, "materialDetailId","createBy","createByName","createTime",
"updateBy","updateByName","updateTime");
@@ -168,28 +211,33 @@ public class StockInTaskOrderImpl extends ServiceImpl<StockInTaskOrderMapper, St
taskShelfMaterialDetail.setOrganizationName(loginUser.getUserPo().getOrganizationName());
taskShelfMaterialDetail.setTopOrganizationId(loginUser.getUserPo().getTopOrganizationId());
taskShelfMaterialDetail.setTaskNumber(stockInTaskOrderDO.getTaskNumber());
mergeShelfLineUniqueIdIntoTaskRemark(taskShelfMaterialDetail, shelfLineBizUid);
taskShelfMaterialDetail.setUniqueId(idGenerator.snowflakeId(SnowFlakeConstants.wmsId));
taskShelfMaterialDetail.setCreateBy(loginUser.getUserid());
taskShelfMaterialDetail.setCreateByName(loginUser.getUsername());
taskShelfMaterialDetail.setCreateTime(new Date());
taskShelfMaterialDetailList.add(taskShelfMaterialDetail);
taskShelfMaterialDetailDO.getChildren().forEach(taskShelfMaterialDetailDOChildren -> {
TaskShelfMaterialDetail taskShelfMaterialDetailChildren = new TaskShelfMaterialDetail();
BeanUtils.copyProperties(taskShelfMaterialDetailDOChildren, taskShelfMaterialDetailChildren, "materialDetailId","createBy","createByName","createTime",
if (taskShelfMaterialDetailDO.getChildren() != null) {
taskShelfMaterialDetailDO.getChildren().forEach(taskShelfMaterialDetailDOChildren -> {
Long childShelfLineBizUid = taskShelfMaterialDetailDOChildren.getUniqueId();
TaskShelfMaterialDetail taskShelfMaterialDetailChildren = new TaskShelfMaterialDetail();
BeanUtils.copyProperties(taskShelfMaterialDetailDOChildren, taskShelfMaterialDetailChildren, "materialDetailId","createBy","createByName","createTime",
"updateBy","updateByName","updateTime");
taskShelfMaterialDetailChildren.setOrganizationId(loginUser.getUserPo().getOrganizationId());
taskShelfMaterialDetailChildren.setOrganizationName(loginUser.getUserPo().getOrganizationName());
taskShelfMaterialDetailChildren.setTopOrganizationId(loginUser.getUserPo().getTopOrganizationId());
taskShelfMaterialDetailChildren.setTaskNumber(stockInTaskOrderDO.getTaskNumber());
taskShelfMaterialDetailChildren.setUniqueId(idGenerator.snowflakeId(SnowFlakeConstants.wmsId));
taskShelfMaterialDetailChildren.setParentUniqueId(taskShelfMaterialDetail.getUniqueId());
taskShelfMaterialDetailChildren.setCreateBy(loginUser.getUserid());
taskShelfMaterialDetailChildren.setCreateByName(loginUser.getUsername());
taskShelfMaterialDetailChildren.setCreateTime(new Date());
taskShelfMaterialDetailList.add(taskShelfMaterialDetailChildren);
//序列号
materialDetailSerialNumberList.addAll(genMaterialDetailSerialNumberByShelf(taskShelfMaterialDetailDOChildren));
});
taskShelfMaterialDetailChildren.setOrganizationId(loginUser.getUserPo().getOrganizationId());
taskShelfMaterialDetailChildren.setOrganizationName(loginUser.getUserPo().getOrganizationName());
taskShelfMaterialDetailChildren.setTopOrganizationId(loginUser.getUserPo().getTopOrganizationId());
taskShelfMaterialDetailChildren.setTaskNumber(stockInTaskOrderDO.getTaskNumber());
mergeShelfLineUniqueIdIntoTaskRemark(taskShelfMaterialDetailChildren, childShelfLineBizUid);
taskShelfMaterialDetailChildren.setUniqueId(idGenerator.snowflakeId(SnowFlakeConstants.wmsId));
taskShelfMaterialDetailChildren.setParentUniqueId(taskShelfMaterialDetail.getUniqueId());
taskShelfMaterialDetailChildren.setCreateBy(loginUser.getUserid());
taskShelfMaterialDetailChildren.setCreateByName(loginUser.getUsername());
taskShelfMaterialDetailChildren.setCreateTime(new Date());
taskShelfMaterialDetailList.add(taskShelfMaterialDetailChildren);
//序列号
materialDetailSerialNumberList.addAll(genMaterialDetailSerialNumberByShelf(taskShelfMaterialDetailDOChildren));
});
}
//序列号
materialDetailSerialNumberList.addAll(genMaterialDetailSerialNumberByShelf(taskShelfMaterialDetailDO));
});
@@ -98,7 +98,7 @@ public class StockInTaskOrderPO extends BaseVOEntity {
private String operatorsName;
@ApiModelProperty("作业完成时间")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
@Excel(name = "作业完成时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
private Date operatorsEndTime;
@@ -83,18 +83,20 @@ public class StockInTaskOrderDomainService {
if (stockInTaskOrderPO == null) {
return null;
}
if (Integer.valueOf(1).equals(stockInTaskOrderPO.getType())){
int taskType = resolveStockInTaskOrderType(stockInTaskOrderPO);
if (taskType == 1) {
// 收货作业优先按收货单号查询查不到再回退作业单号
List<TaskReceiptMaterialDetailPO> receiptDetails = getReceiptInfo(stockInTaskOrderPO.getReceiptOrderNumber());
if (CollectionUtils.isEmpty(receiptDetails)) {
receiptDetails = getReceiptInfo(stockInTaskOrderPO.getTaskNumber());
}
stockInTaskOrderPO.setTaskReceiptMaterialDetailList(receiptDetails);
} else if (Integer.valueOf(2).equals(stockInTaskOrderPO.getType())) {
// 上架作业优先按上架单号查询查不到再回退作业单号
List<TaskShelfMaterialDetailPO> shelfDetails = getShelfInfo(stockInTaskOrderPO.getShelfOrderNumber());
} else if (taskType == 2) {
// 上架作业task_shelf_material_detail.task_number 存的是作业单号 SHZY... genStockShelfTaskOrder
// 与上架单号 SJ 不一致须优先用作业单号再按上架单号兜底历史/异常数据
List<TaskShelfMaterialDetailPO> shelfDetails = getShelfInfo(stockInTaskOrderPO.getTaskNumber());
if (CollectionUtils.isEmpty(shelfDetails)) {
shelfDetails = getShelfInfo(stockInTaskOrderPO.getTaskNumber());
shelfDetails = getShelfInfo(stockInTaskOrderPO.getShelfOrderNumber());
}
stockInTaskOrderPO.setTaskShelfMaterialDetailList(shelfDetails);
} else {
@@ -104,15 +106,25 @@ public class StockInTaskOrderDomainService {
receiptDetails = getReceiptInfo(stockInTaskOrderPO.getTaskNumber());
}
stockInTaskOrderPO.setTaskReceiptMaterialDetailList(receiptDetails);
List<TaskShelfMaterialDetailPO> shelfDetails = getShelfInfo(stockInTaskOrderPO.getShelfOrderNumber());
List<TaskShelfMaterialDetailPO> shelfDetails = getShelfInfo(stockInTaskOrderPO.getTaskNumber());
if (CollectionUtils.isEmpty(shelfDetails)) {
shelfDetails = getShelfInfo(stockInTaskOrderPO.getTaskNumber());
shelfDetails = getShelfInfo(stockInTaskOrderPO.getShelfOrderNumber());
}
stockInTaskOrderPO.setTaskShelfMaterialDetailList(shelfDetails);
}
return stockInTaskOrderPO;
}
/** 兼容 Integer/Long/Byte 等 JDBC 映射,避免 2L 与 Integer(2) equals 为 false 导致走错分支。 */
private static int resolveStockInTaskOrderType(StockInTaskOrderPO po) {
if (po == null || po.getType() == null) {
return 0;
}
if (po.getType() instanceof Number) {
return ((Number) po.getType()).intValue();
}
return 0;
}
/**
* 获取入库收货作业单详细信息
@@ -417,4 +417,16 @@ public class StockOutOrderPO extends BaseVOEntity {
private String salesmanName;
@ApiModelProperty("费用")
List<ReceiptOrderAccount> receiptOrderAccountList;
@ApiModelProperty("路线id")
private String lineManagementId;
@ApiModelProperty("路线编码")
private String routeCode;
@ApiModelProperty("路线名称")
private String routeName;
@ApiModelProperty("配送顺序")
private String deliveryOrder;
}
@@ -720,7 +720,9 @@ public class StockOutOrderDomainService {
}
pickingOrderDOList.add(pickingOrderDO);
});
return pickingOrderDomainService.batchInsert(pickingOrderDOList);
Boolean inserted = pickingOrderDomainService.batchInsert(pickingOrderDOList);
// 拣货任务不随生成拣货单自动下发需在拣货单侧整单下发/明细下发
return inserted;
}
/**
@@ -143,7 +143,7 @@ public class StockOutTaskOrderPO extends BaseVOEntity {
private String operatorsName;
@ApiModelProperty("作业完成时间")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
@Excel(name = "作业完成时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
private Date operatorsEndTime;
@@ -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;
}
@@ -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;
@@ -5,6 +5,7 @@ import cn.hutool.core.util.ObjectUtil;
import cn.hutool.json.JSONUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson2.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.mhd.common.core.constant.SnowFlakeConstants;
@@ -40,6 +41,7 @@ import com.mhd.wms.domain.inventoryStandingReport.repository.facade.IInventorySt
import com.mhd.wms.domain.inventoryStandingReport.repository.todo.InventoryStandingReportDO;
import com.mhd.wms.domain.materialGoodsRule.entity.MaterialGoodsRule;
import com.mhd.wms.domain.materialGoodsRule.repository.facade.IMaterialGoodsRuleService;
import com.mhd.wms.domain.materialGoodsRule.repository.po.MaterialGoodsRulePO;
import com.mhd.wms.domain.materialMoreDetail.repository.facade.IMaterialMoreDetailService;
import com.mhd.wms.domain.materialMoreDetail.repository.po.MaterialMoreDetailPO;
import com.mhd.wms.domain.materialMoreDetail.repository.todo.MaterialMoreDetailDO;
@@ -69,6 +71,8 @@ import com.mhd.wms.domain.stockShelfOrder.repository.facade.IStockShelfOrderServ
import com.mhd.wms.domain.stockShelfOrder.repository.po.StockShelfOrderPO;
import com.mhd.wms.domain.stockShelfOrder.repository.todo.StockShelfOrderDO;
import com.mhd.wms.domain.stockShelfOrder.service.StockShelfOrderDomainService;
import com.mhd.wms.domain.taskReceiptMaterialDetail.entity.TaskReceiptMaterialDetail;
import com.mhd.wms.domain.taskReceiptMaterialDetail.repository.facade.ITaskReceiptMaterialDetailService;
import com.mhd.wms.domain.taskReceiptMaterialDetail.repository.todo.TaskReceiptMaterialDetailDO;
import com.mhd.wms.interfaces.dto.stockReceiptOrder.StockReceiptOrderDTO;
import io.swagger.annotations.ApiModelProperty;
@@ -81,6 +85,7 @@ import org.springframework.util.CollectionUtils;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.util.*;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
/**
@@ -93,6 +98,9 @@ import java.util.stream.Collectors;
@Slf4j
public class StockReceiptOrderDomainService {
/** 与 {@link com.mhd.wms.domain.stockInTaskOrder.repository.persistence.StockInTaskOrderImpl#TASK_RECEIPT_REMARK_RUID_PREFIX} 一致,用于在作业单 remark 中关联收货行 uniqueId。 */
private static final String TASK_RECEIPT_REMARK_RUID_PREFIX = "__RUID__:";
@Autowired
private IStockReceiptOrderService stockReceiptOrderService;
@Autowired
@@ -100,6 +108,8 @@ public class StockReceiptOrderDomainService {
@Autowired
private IStockInTaskOrderService stockInTaskOrderService;
@Autowired
private ITaskReceiptMaterialDetailService taskReceiptMaterialDetailService;
@Autowired
private IInOrderAbnormalService iInOrderAbnormalService;
@Autowired
private StockShelfOrderDomainService stockShelfOrderDomainService;
@@ -159,6 +169,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);
@@ -298,6 +309,11 @@ public class StockReceiptOrderDomainService {
if (materialBaseInfoId == null) {
return materialMoreDetailPOList;
}
// queryListChildren buildMaterialMoreDetailListByMaterialBinding 一致无商品规则或未绑 batch_id 不调 System
MaterialGoodsRulePO goodsRule = materialGoodsRuleService.getInfoByMaterialBaseInfoIds(materialBaseInfoId);
if (goodsRule == null || goodsRule.getBatchId() == null) {
return materialMoreDetailPOList;
}
try {
AjaxResult ajaxResult = systemServiceFeign.getBatchDetailListByMaterialBaseInfoId(materialBaseInfoId);
if (ajaxResult == null || !"200".equals(String.valueOf(ajaxResult.get("code")))) {
@@ -382,6 +398,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) {
@@ -408,13 +430,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
@@ -448,6 +524,8 @@ public class StockReceiptOrderDomainService {
genInventoryStandingReport(stockReceiptOrderPO, stockReceiptOrderDO);
//修改物料明细信息
receiptMaterialDetailService.batchReceiptUpdate(stockReceiptOrderDO);
// 与收货单明细一致同步更新已下发的收货入库作业单 task_receipt_material_detailPDA/PC 每次提交收货均刷新
syncTaskReceiptMaterialDetailsWithReceiptLines(stockReceiptOrderDO);
// 同步更新入库单明细的收货数量入库单 totalNetWeight/totalGrossWeight/totalVolume/totalArea 不因收货改库 sync 内注释
syncUpdateInMaterialDetailFromReceipt(stockReceiptOrderDO, stockReceiptOrderPO);
// 收货类入库作业单在任务下发时生成此处不再生成 type=1 作业单
@@ -462,6 +540,160 @@ public class StockReceiptOrderDomainService {
}
/**
* 收货保存后将收货单明细中的实收数量/状态同步到已生成的收货类入库作业单明细task_receipt_material_detail
* 关联键生成作业单时在 {@link com.mhd.wms.domain.stockInTaskOrder.repository.persistence.StockInTaskOrderImpl#genStockReceiptTaskOrder}
* 写入 remark {@value #TASK_RECEIPT_REMARK_RUID_PREFIX} + 收货行 business uniqueId
*/
private void syncTaskReceiptMaterialDetailsWithReceiptLines(StockReceiptOrderDO stockReceiptOrderDO) {
if (stockReceiptOrderDO == null || CollectionUtils.isEmpty(stockReceiptOrderDO.getMaterialDetailList())) {
return;
}
String receiptOrderNumber = stockReceiptOrderDO.getReceiptOrderNumber();
if (StringUtils.isBlank(receiptOrderNumber)) {
ReceiptMaterialDetailDO head = stockReceiptOrderDO.getMaterialDetailList().get(0);
if (head != null) {
receiptOrderNumber = head.getReceiptOrderNumber();
}
}
if (StringUtils.isBlank(receiptOrderNumber)) {
return;
}
String taskNumber = resolveReceiptTypeTaskNumber(receiptOrderNumber);
if (StringUtils.isBlank(taskNumber)) {
return;
}
List<TaskReceiptMaterialDetail> taskRows = taskReceiptMaterialDetailService.list(
new LambdaQueryWrapper<TaskReceiptMaterialDetail>()
.eq(TaskReceiptMaterialDetail::getTaskNumber, taskNumber)
.eq(TaskReceiptMaterialDetail::getDelFlag, 1));
if (CollectionUtils.isEmpty(taskRows)) {
return;
}
Map<Long, TaskReceiptMaterialDetail> taskByReceiptLineUid = new HashMap<>();
for (TaskReceiptMaterialDetail tr : taskRows) {
Long uid = extractReceiptLineUniqueIdFromTaskRemark(tr.getRemark());
if (uid != null && !taskByReceiptLineUid.containsKey(uid)) {
taskByReceiptLineUid.put(uid, tr);
}
}
LoginUser loginUser = SecurityUtils.getLoginUser();
Date now = new Date();
String userRealName = resolveUserRealNameForTaskSync(loginUser);
applyReceiptLineToTaskDetails(
stockReceiptOrderDO.getMaterialDetailList(), taskRows, taskByReceiptLineUid, loginUser, userRealName, now);
}
private static String resolveUserRealNameForTaskSync(LoginUser loginUser) {
if (loginUser == null) {
return null;
}
if (loginUser.getUserPo() != null && StringUtils.isNotBlank(loginUser.getUserPo().getUserName())) {
return loginUser.getUserPo().getUserName().trim();
}
if (StringUtils.isNotBlank(loginUser.getRealname())) {
return loginUser.getRealname().trim();
}
return loginUser.getUsername();
}
/**
* 本单收货类入库作业单type=1作业单号无则未下发或已删
*/
private String resolveReceiptTypeTaskNumber(String receiptOrderNumber) {
if (StringUtils.isBlank(receiptOrderNumber)) {
return null;
}
List<StockInTaskOrder> rows = stockInTaskOrderService.list(
new LambdaQueryWrapper<StockInTaskOrder>()
.eq(StockInTaskOrder::getReceiptOrderNumber, receiptOrderNumber)
.eq(StockInTaskOrder::getType, 1)
.eq(StockInTaskOrder::getDelFlag, 1)
.orderByDesc(StockInTaskOrder::getInTaskOrderId)
.last("LIMIT 1"));
if (CollectionUtils.isEmpty(rows)) {
return null;
}
return rows.get(0).getTaskNumber();
}
private void applyReceiptLineToTaskDetails(List<ReceiptMaterialDetailDO> lines,
List<TaskReceiptMaterialDetail> allTaskRows,
Map<Long, TaskReceiptMaterialDetail> taskByReceiptLineUid,
LoginUser loginUser, String userRealName, Date now) {
if (CollectionUtils.isEmpty(lines)) {
return;
}
for (ReceiptMaterialDetailDO line : lines) {
if (line == null) {
continue;
}
if (line.getUniqueId() != null) {
TaskReceiptMaterialDetail tr = taskByReceiptLineUid.get(line.getUniqueId());
if (tr == null && allTaskRows != null) {
long uid = line.getUniqueId();
for (TaskReceiptMaterialDetail row : allTaskRows) {
if (row != null && remarkContainsRuidToken(row.getRemark(), uid)) {
tr = row;
break;
}
}
}
if (tr != null && tr.getMaterialDetailId() != null) {
BigDecimal syncQty = line.getAlreadyReceiptQuantity() != null
? line.getAlreadyReceiptQuantity()
: line.getReceiptQuantity();
TaskReceiptMaterialDetail patch = new TaskReceiptMaterialDetail();
patch.setMaterialDetailId(tr.getMaterialDetailId());
patch.setReceiptQuantity(syncQty);
patch.setReceiptStatus(line.getReceiptStatus());
if (loginUser != null) {
patch.setUpdateBy(loginUser.getUserid());
}
patch.setUpdateByName(userRealName);
patch.setUpdateTime(now);
taskReceiptMaterialDetailService.updateById(patch);
}
}
if (!CollectionUtils.isEmpty(line.getChildren())) {
applyReceiptLineToTaskDetails(line.getChildren(), allTaskRows, taskByReceiptLineUid, loginUser, userRealName, now);
}
}
}
private static boolean remarkContainsRuidToken(String remark, long uid) {
if (remark == null) {
return false;
}
return Pattern.compile(TASK_RECEIPT_REMARK_RUID_PREFIX + uid + "(?!\\d)").matcher(remark).find();
}
/**
* 从作业单 remark 中解析首个__RUID__:数字对应的收货行 business id receipt_material_detail.unique_id 一致
*/
private static Long extractReceiptLineUniqueIdFromTaskRemark(String remark) {
if (StringUtils.isBlank(remark)) {
return null;
}
int i = remark.indexOf(TASK_RECEIPT_REMARK_RUID_PREFIX);
if (i < 0) {
return null;
}
int j = i + TASK_RECEIPT_REMARK_RUID_PREFIX.length();
int k = j;
while (k < remark.length() && Character.isDigit(remark.charAt(k))) {
k++;
}
if (k == j) {
return null;
}
try {
return Long.parseLong(remark.substring(j, k));
} catch (NumberFormatException e) {
return null;
}
}
private void saveAmount(StockReceiptOrderDO stockReceiptOrderDO) {
Long receiptOrderId = stockReceiptOrderDO.getReceiptOrderId();
receiptOrderAccountService.remove(new QueryWrapper<ReceiptOrderAccount>().lambda().eq(ReceiptOrderAccount::getOrderId, receiptOrderId));
@@ -1298,6 +1530,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);
//本次上架数量
@@ -1435,7 +1675,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;
}
/**
@@ -1456,6 +1702,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());
@@ -1904,6 +2153,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();
@@ -1912,18 +2167,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);
}
@@ -1,6 +1,8 @@
package com.mhd.wms.domain.stockShelfOrder.repository.facade;
import com.baomidou.mybatisplus.extension.service.IService;
import com.mhd.wms.domain.materialBaseInfo.entity.MaterialBaseInfo;
import com.mhd.wms.domain.materialInventory.repository.po.MaterialInventoryPO;
import com.mhd.wms.domain.stockShelfOrder.entity.StockShelfOrder;
import com.mhd.wms.domain.stockShelfOrder.repository.po.StockShelfOrderPO;
import com.mhd.wms.domain.stockShelfOrder.repository.todo.StockShelfOrderDO;
@@ -55,4 +57,8 @@ public interface IStockShelfOrderService extends IService<StockShelfOrder>
public void updateOmsHandover(BigDecimal checkQuantity, BigDecimal totalNetWeight, String outOrderNumber, Long uniqueId);
public void updateOmsDocumentLot(BigDecimal shelvesQuantity, BigDecimal totalNetWeight, String lotNumber);
void updateOmsInventoryQuantity(BigDecimal quantity, String lotNumber, String inOrderNumber);
void updateOmsInventorySynchronization(BigDecimal checkQuantity, String lotNo, String inOrderNumber);
}
@@ -29,4 +29,8 @@ public interface StockShelfOrderMapper extends BaseMapper<StockShelfOrder>
void updateOmsHandover(@Param("checkQuantity") BigDecimal checkQuantity, @Param("totalNetWeight") BigDecimal totalNetWeight, @Param("outOrderNumber") String outOrderNumber, @Param("uniqueId") Long uniqueId);
void updateOmsDocumentLot(@Param("shelvesQuantity") BigDecimal shelvesQuantity, @Param("totalNetWeight") BigDecimal totalNetWeight, @Param("lotNumber") String lotNumber);
void updateOmsInventoryQuantity(@Param("quantity") BigDecimal quantity, @Param("lotNumber")String lotNumber, @Param("inOrderNumber")String inOrderNumber);
void updateOmsInventorySynchronization(@Param("checkQuantity") BigDecimal checkQuantity, @Param("lotNo") String lotNo, @Param("inOrderNumber") String inOrderNumber);
}
@@ -7,6 +7,8 @@ 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.materialBaseInfo.entity.MaterialBaseInfo;
import com.mhd.wms.domain.materialInventory.repository.po.MaterialInventoryPO;
import com.mhd.wms.domain.stockShelfOrder.entity.StockShelfOrder;
import com.mhd.wms.domain.stockShelfOrder.repository.facade.IStockShelfOrderService;
import com.mhd.wms.domain.stockShelfOrder.repository.mapper.StockShelfOrderMapper;
@@ -128,6 +130,16 @@ public class StockShelfOrderImpl extends ServiceImpl<StockShelfOrderMapper, Stoc
stockShelfOrderMapper.updateOmsDocumentLot(shelvesQuantity, totalNetWeight, lotNumber);
}
@Override
public void updateOmsInventoryQuantity(BigDecimal quantity, String lotNumber, String inOrderNumber) {
stockShelfOrderMapper.updateOmsInventoryQuantity(quantity, lotNumber, inOrderNumber);
}
@Override
public void updateOmsInventorySynchronization(BigDecimal checkQuantity, String lotNo, String inOrderNumber) {
stockShelfOrderMapper.updateOmsInventorySynchronization(checkQuantity, lotNo, inOrderNumber);
}
/**
* @description 更新订单任务下发状态
* @author ZhouGY
@@ -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;
@@ -70,11 +71,14 @@ import com.mhd.wms.domain.stockInOrder.entity.StockInOrder;
import com.mhd.wms.domain.stockInOrder.repository.facade.IStockInOrderService;
import com.mhd.wms.domain.stockInTaskOrder.entity.StockInTaskOrder;
import com.mhd.wms.domain.stockInTaskOrder.repository.facade.IStockInTaskOrderService;
import com.mhd.wms.domain.stockInTaskOrder.repository.persistence.StockInTaskOrderImpl;
import com.mhd.wms.domain.stockInTaskOrder.repository.todo.StockInTaskOrderDO;
import com.mhd.wms.domain.stockShelfOrder.entity.StockShelfOrder;
import com.mhd.wms.domain.stockShelfOrder.repository.facade.IStockShelfOrderService;
import com.mhd.wms.domain.stockShelfOrder.repository.po.StockShelfOrderPO;
import com.mhd.wms.domain.stockShelfOrder.repository.todo.StockShelfOrderDO;
import com.mhd.wms.domain.taskShelfMaterialDetail.entity.TaskShelfMaterialDetail;
import com.mhd.wms.domain.taskShelfMaterialDetail.repository.facade.ITaskShelfMaterialDetailService;
import com.mhd.wms.domain.taskShelfMaterialDetail.repository.todo.TaskShelfMaterialDetailDO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
@@ -85,6 +89,7 @@ import org.springframework.util.CollectionUtils;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.util.*;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
/**
@@ -116,6 +121,8 @@ public class StockShelfOrderDomainService {
@Autowired
private IStockInTaskOrderService stockInTaskOrderService;
@Autowired
private ITaskShelfMaterialDetailService taskShelfMaterialDetailService;
@Autowired
private IInventoryStandingDetailService inventoryStandingDetailService;
@Autowired
private IDeliveTaskService deliveTaskService;
@@ -317,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)
@@ -359,6 +366,8 @@ public class StockShelfOrderDomainService {
userRealNameUpShelf);
//同步更新入库单明细的上架数量/上架状态
syncShelvesQuantityToInMaterialDetail(stockShelfOrderDO);
// 同步已下发的上架入库作业单明细 task_shelf_material_detail与收货侧回写 task_receipt 一致
syncTaskShelfMaterialDetailsWithShelfLines(stockShelfOrderDO);
// 上架类入库作业单 type=2PDA 已在收货完成时生成若尚未生成 PC 路径则在本环节补生成
if (countShelfTypeInTaskOrder(stockShelfOrderPO.getShelfOrderNumber()) == 0) {
genStockShelfTaskOrderByUpShelf(stockShelfOrderDO);
@@ -572,7 +581,154 @@ public class StockShelfOrderDomainService {
log.info("完成同步更新入库单【{}】的明细", inOrderNumber);
}
/**
* 上架每次提交/完成时 shelf_material_detail 的累计上架数量上架状态写回已下发的 type=2 作业单明细 task_shelf_material_detail
* 行关联{@link StockInTaskOrderImpl#genStockShelfTaskOrder} remark 中写入 <code>__RUID__:</code>+上架行 business uniqueId remark 的旧数据按 in_unique_id+receipt_unique_id+level+物料 匹配
*/
private void syncTaskShelfMaterialDetailsWithShelfLines(StockShelfOrderDO stockShelfOrderDO) {
if (stockShelfOrderDO == null || StringUtils.isBlank(stockShelfOrderDO.getShelfOrderNumber())) {
return;
}
String taskNumber = resolveShelfTypeTaskNumberByShelfOrderNumber(stockShelfOrderDO.getShelfOrderNumber());
if (StringUtils.isBlank(taskNumber)) {
return;
}
List<TaskShelfMaterialDetail> taskRows = taskShelfMaterialDetailService.list(
new LambdaQueryWrapper<TaskShelfMaterialDetail>()
.eq(TaskShelfMaterialDetail::getTaskNumber, taskNumber)
.eq(TaskShelfMaterialDetail::getDelFlag, 1));
if (CollectionUtils.isEmpty(taskRows)) {
return;
}
Map<Long, TaskShelfMaterialDetail> taskByShelfLineUid = new HashMap<>();
for (TaskShelfMaterialDetail tr : taskRows) {
Long uid = extractShelfLineUniqueIdFromTaskRemark(tr.getRemark());
if (uid != null && !taskByShelfLineUid.containsKey(uid)) {
taskByShelfLineUid.put(uid, tr);
}
}
ShelfMaterialDetailDO smq = new ShelfMaterialDetailDO();
smq.setShelfOrderNumber(stockShelfOrderDO.getShelfOrderNumber());
List<ShelfMaterialDetailPO> shelfLines = shelfMaterialDetailService.queryList(smq);
if (CollectionUtils.isEmpty(shelfLines)) {
return;
}
LoginUser loginUser = SecurityUtils.getLoginUser();
Date now = new Date();
String userRealName = resolveUserRealNameForShelf(loginUser);
for (ShelfMaterialDetailPO line : shelfLines) {
if (line == null) {
continue;
}
TaskShelfMaterialDetail tr = null;
if (line.getUniqueId() != null) {
tr = taskByShelfLineUid.get(line.getUniqueId());
if (tr == null) {
long uid = line.getUniqueId();
for (TaskShelfMaterialDetail row : taskRows) {
if (row != null && remarkContainsShelfRuidToken(row.getRemark(), uid)) {
tr = row;
break;
}
}
}
}
if (tr == null) {
tr = findTaskShelfMaterialDetailByFallback(taskRows, line);
}
if (tr == null || tr.getMaterialDetailId() == null) {
continue;
}
BigDecimal syncQty = line.getAlreadyShelvesQuantity() != null
? line.getAlreadyShelvesQuantity()
: line.getShelvesQuantity();
TaskShelfMaterialDetail patch = new TaskShelfMaterialDetail();
patch.setMaterialDetailId(tr.getMaterialDetailId());
patch.setShelvesQuantity(syncQty);
patch.setShelvesStatus(line.getShelvesStatus());
if (loginUser != null) {
patch.setUpdateBy(loginUser.getUserid());
}
patch.setUpdateByName(userRealName);
patch.setUpdateTime(now);
taskShelfMaterialDetailService.updateById(patch);
}
}
private String resolveShelfTypeTaskNumberByShelfOrderNumber(String shelfOrderNumber) {
if (StringUtils.isBlank(shelfOrderNumber)) {
return null;
}
List<StockInTaskOrder> rows = stockInTaskOrderService.list(
new LambdaQueryWrapper<StockInTaskOrder>()
.eq(StockInTaskOrder::getShelfOrderNumber, shelfOrderNumber)
.eq(StockInTaskOrder::getType, 2)
.eq(StockInTaskOrder::getDelFlag, 1)
.orderByDesc(StockInTaskOrder::getInTaskOrderId)
.last("LIMIT 1"));
if (CollectionUtils.isEmpty(rows)) {
return null;
}
return rows.get(0).getTaskNumber();
}
private static Long extractShelfLineUniqueIdFromTaskRemark(String remark) {
if (StringUtils.isBlank(remark)) {
return null;
}
int i = remark.indexOf(StockInTaskOrderImpl.TASK_RECEIPT_REMARK_RUID_PREFIX);
if (i < 0) {
return null;
}
int j = i + StockInTaskOrderImpl.TASK_RECEIPT_REMARK_RUID_PREFIX.length();
int k = j;
while (k < remark.length() && Character.isDigit(remark.charAt(k))) {
k++;
}
if (k == j) {
return null;
}
try {
return Long.parseLong(remark.substring(j, k));
} catch (NumberFormatException e) {
return null;
}
}
private static boolean remarkContainsShelfRuidToken(String remark, long uid) {
if (remark == null) {
return false;
}
return Pattern.compile(StockInTaskOrderImpl.TASK_RECEIPT_REMARK_RUID_PREFIX + uid + "(?!\\d)").matcher(remark).find();
}
private static TaskShelfMaterialDetail findTaskShelfMaterialDetailByFallback(
List<TaskShelfMaterialDetail> all, ShelfMaterialDetailPO line) {
if (CollectionUtils.isEmpty(all) || line == null) {
return null;
}
for (TaskShelfMaterialDetail tr : all) {
if (tr == null) {
continue;
}
if (!Objects.equals(tr.getInUniqueId(), line.getInUniqueId())) {
continue;
}
if (!Objects.equals(tr.getReceiptUniqueId(), line.getReceiptUniqueId())) {
continue;
}
if (!Objects.equals(tr.getLevel(), line.getLevel())) {
continue;
}
if (line.getMaterialBaseInfoId() != null && tr.getMaterialBaseInfoId() != null
&& !Objects.equals(tr.getMaterialBaseInfoId(), line.getMaterialBaseInfoId())) {
continue;
}
return tr;
}
return null;
}
/**
* @description 设置上架单上架需要更新的数据数据
@@ -700,6 +856,9 @@ public class StockShelfOrderDomainService {
}
String userRealNameComplete = resolveUserRealNameForShelf(loginUser);
updateShelfMaterialDetailShelvesStatusWhenOrderCompleted(stockShelfOrderPO, loginUser, userRealNameComplete);
StockShelfOrderDO taskDetailSync = new StockShelfOrderDO();
taskDetailSync.setShelfOrderNumber(stockShelfOrderPO.getShelfOrderNumber());
syncTaskShelfMaterialDetailsWithShelfLines(taskDetailSync);
markShelfTypeStockInTaskOrderOnComplete(stockShelfOrderPO.getShelfOrderNumber(), loginUser, userRealNameComplete);
//推送业务数据到BMS系统
// pushSyncBmsDomainService.pushInShelfOrder(stockShelfOrderPO.getInOrderNumber());
@@ -708,6 +867,27 @@ public class StockShelfOrderDomainService {
return true;
}
/**
* 上架单整单完成时回写上架类入库作业单type=2的作业人作业完成时间
* {@link com.mhd.wms.domain.stockReceiptOrder.service.StockReceiptOrderDomainService#markReceiptTypeStockInTaskOrderOnComplete} 对收货类作业单一致
*/
private void markShelfTypeStockInTaskOrderOnComplete(String shelfOrderNumber, LoginUser loginUser, String userRealName) {
if (StringUtils.isBlank(shelfOrderNumber) || loginUser == null) {
return;
}
Date now = new Date();
stockInTaskOrderService.update(null, new UpdateWrapper<StockInTaskOrder>().lambda()
.set(StockInTaskOrder::getOperatorsBy, loginUser.getUserid())
.set(StockInTaskOrder::getOperatorsName, userRealName)
.set(StockInTaskOrder::getOperatorsEndTime, now)
.set(StockInTaskOrder::getUpdateBy, loginUser.getUserid())
.set(StockInTaskOrder::getUpdateByName, userRealName)
.set(StockInTaskOrder::getUpdateTime, now)
.eq(StockInTaskOrder::getShelfOrderNumber, shelfOrderNumber)
.eq(StockInTaskOrder::getType, 2)
.eq(StockInTaskOrder::getDelFlag, 1));
}
/**
* 分批/单次上架提交后按主行+子行汇总累计已上架与主行计划量比较刷新各明细 shelves_status待上 1 / 上中 2 / 3 / 5
*/
@@ -920,26 +1100,6 @@ public class StockShelfOrderDomainService {
return loginUser.getUsername() != null ? loginUser.getUsername() : "";
}
/**
* 上架实际完成时回写上架类入库作业单type=2的作业人作业完成时间下发/生成时不下发填写
*/
private void markShelfTypeStockInTaskOrderOnComplete(String shelfOrderNumber, LoginUser loginUser, String userRealName) {
if (StringUtils.isBlank(shelfOrderNumber) || loginUser == null) {
return;
}
Date now = new Date();
stockInTaskOrderService.update(null, new UpdateWrapper<StockInTaskOrder>().lambda()
.set(StockInTaskOrder::getOperatorsBy, loginUser.getUserid())
.set(StockInTaskOrder::getOperatorsName, userRealName)
.set(StockInTaskOrder::getOperatorsEndTime, now)
.set(StockInTaskOrder::getUpdateBy, loginUser.getUserid())
.set(StockInTaskOrder::getUpdateByName, userRealName)
.set(StockInTaskOrder::getUpdateTime, now)
.eq(StockInTaskOrder::getShelfOrderNumber, shelfOrderNumber)
.eq(StockInTaskOrder::getType, 2)
.eq(StockInTaskOrder::getDelFlag, 1));
}
private synchronized void stockIn(List<ShelfMaterialDetail> shelfMaterialDetailDOList, StockShelfOrderDO stockReceiptOrderDO) {
for (ShelfMaterialDetail shelfMaterialDetail : shelfMaterialDetailDOList) {
Long materialBaseInfoId = shelfMaterialDetail.getMaterialBaseInfoId();
@@ -962,6 +1122,11 @@ public class StockShelfOrderDomainService {
List<MaterialInventoryPO> materialInventoryPOS = materialInventoryMapper.selectListByWhere(param);
MaterialBaseInfo materialBaseInfo = materialBaseInfoMapper.selectById(materialBaseInfoId);
LoginUser loginUser = SecurityUtils.getLoginUser();
//库存同步到oms
String inOrderNumber = stockReceiptOrderDO.getInOrderNumber();
String lotNumber = shelfMaterialDetail.getLotNumber();
BigDecimal quantity = shelfMaterialDetail.getShelvesQuantity();
stockShelfOrderService.updateOmsInventoryQuantity(quantity, lotNumber, inOrderNumber);
if (materialInventoryPOS.size() == 0) {
MaterialInventoryParamDO inventoryParamDO = new MaterialInventoryParamDO();
// MaterialInventory materialInventory = new MaterialInventory();
@@ -1455,102 +1620,73 @@ public class StockShelfOrderDomainService {
stockInTaskOrderDO.setSerialNumber(OrderSequence.getOrderCode("SHZYLS"));
stockInTaskOrderDO.setTaskNumber(OrderSequence.getOrderCode("SHZY"));
stockInTaskOrderDO.setType(2);//上架
stockInTaskOrderDO.setOperatorsBy(null);
stockInTaskOrderDO.setOperatorsName(null);
stockInTaskOrderDO.setOperatorsEndTime(null);
// 作业单作业数量对应 stock_in_task_order.actual_quantity上架单汇总在 receipt_quantity字段名不一致不会从 copyProperties 带入需按实际收货量赋值
BigDecimal workQty = stockInTaskOrderDO.getActualQuantity();
if (workQty == null || workQty.compareTo(BigDecimal.ZERO) == 0) {
workQty = stockShelfOrderDO.getReceiptQuantity();
}
if ((workQty == null || workQty.compareTo(BigDecimal.ZERO) == 0)
&& !CollectionUtils.isEmpty(stockShelfOrderDO.getMaterialDetailList())) {
workQty = sumShelfMaterialDetailQuantities(stockShelfOrderDO.getMaterialDetailList());
}
stockInTaskOrderDO.setActualQuantity(workQty != null ? workQty : BigDecimal.ZERO);
List<TaskShelfMaterialDetailDO> taskReceiptMaterialDetailDOList = stockShelfOrderDO.getMaterialDetailList().stream()
.map(shelfMaterialDetailDO -> JSONUtil.toBean(JSONUtil.toJsonStr(shelfMaterialDetailDO), TaskShelfMaterialDetailDO.class))
.collect(Collectors.toList());
for (TaskShelfMaterialDetailDO d : taskReceiptMaterialDetailDOList) {
if (d.getChildren() == null) {
d.setChildren(new ArrayList<>());
}
}
stockInTaskOrderDO.setTaskShelfMaterialDetailList(taskReceiptMaterialDetailDOList);
return stockInTaskOrderService.genStockShelfTaskOrder(Collections.singletonList(stockInTaskOrderDO));
}
/** 汇总上架明细计划数量(与收货实际量一致),含子行树 */
private static BigDecimal sumShelfMaterialDetailQuantities(List<ShelfMaterialDetailDO> lines) {
if (CollectionUtils.isEmpty(lines)) {
return BigDecimal.ZERO;
}
BigDecimal sum = BigDecimal.ZERO;
for (ShelfMaterialDetailDO line : lines) {
if (line == null) {
continue;
}
if (line.getQuantity() != null) {
sum = sum.add(line.getQuantity());
}
if (!CollectionUtils.isEmpty(line.getChildren())) {
sum = sum.add(sumShelfMaterialDetailQuantities(line.getChildren()));
}
}
return sum;
}
private long countShelfTypeInTaskOrder(String shelfOrderNumber) {
/**
* 该上架单下是否已存在 type=2上架入库作业单
*/
private int countShelfTypeInTaskOrder(String shelfOrderNumber) {
if (StringUtils.isBlank(shelfOrderNumber)) {
return 0L;
return 0;
}
return stockInTaskOrderService.count(new LambdaQueryWrapper<StockInTaskOrder>()
return (int) stockInTaskOrderService.count(new QueryWrapper<StockInTaskOrder>().lambda()
.eq(StockInTaskOrder::getShelfOrderNumber, shelfOrderNumber)
.eq(StockInTaskOrder::getType, 2)
.eq(StockInTaskOrder::getDelFlag, 1));
.eq(StockInTaskOrder::getType, 2));
}
/**
* PDA 收货完成已生成上架单后落库上架入库作业单type=2 {@link #genStockShelfTaskOrderByUpShelf} 同结构避免在上架操作时再生成一条上架环节仅在上尚未存在时补生成 PC 使用
* PDA 收货完成若该收货单对应上架单尚未生成 type=2 上架入库作业单则补生成 {@link #upShelf} 中补生成策略一致
*/
@Transactional(rollbackFor = Exception.class)
public void tryGenStockShelfInTaskOrderAfterPdaReceiptComplete(String receiptOrderNumber) {
if (StringUtils.isBlank(receiptOrderNumber)) {
return;
}
List<StockShelfOrder> rows = stockShelfOrderService.list(new LambdaQueryWrapper<StockShelfOrder>()
.eq(StockShelfOrder::getReceiptOrderNumber, receiptOrderNumber)
.eq(StockShelfOrder::getDelFlag, 1));
if (CollectionUtils.isEmpty(rows)) {
StockShelfOrderDO query = new StockShelfOrderDO();
query.setReceiptOrderNumber(receiptOrderNumber);
List<StockShelfOrderPO> shelfList = stockShelfOrderService.queryList(query);
if (CollectionUtils.isEmpty(shelfList)) {
log.warn("PDA 收货完成补生成上架作业单:未找到收货单号对应上架单,receiptOrderNumber={}", receiptOrderNumber);
return;
}
rows.sort(Comparator.comparing(StockShelfOrder::getShelfOrderId, Comparator.nullsLast(Comparator.naturalOrder())).reversed());
StockShelfOrder head = rows.get(0);
if (countShelfTypeInTaskOrder(head.getShelfOrderNumber()) > 0) {
return;
for (StockShelfOrderPO shelfPO : shelfList) {
if (shelfPO == null || StringUtils.isBlank(shelfPO.getShelfOrderNumber())) {
continue;
}
if (countShelfTypeInTaskOrder(shelfPO.getShelfOrderNumber()) > 0) {
continue;
}
StockShelfOrderDO shelfDO = buildStockShelfOrderDOForGenShelfTask(shelfPO);
if (shelfDO == null || CollectionUtils.isEmpty(shelfDO.getMaterialDetailList())) {
log.warn("PDA 收货完成补生成上架作业单:上架单无明细,shelfOrderNumber={}", shelfPO.getShelfOrderNumber());
continue;
}
genStockShelfTaskOrderByUpShelf(shelfDO);
}
StockShelfOrderPO full = getInfo(head.getShelfOrderId());
if (full == null || CollectionUtils.isEmpty(full.getMaterialDetailList())) {
return;
}
private StockShelfOrderDO buildStockShelfOrderDOForGenShelfTask(StockShelfOrderPO shelfPO) {
StockShelfOrderDO shelfDO = new StockShelfOrderDO();
BeanUtils.copyProperties(shelfPO, shelfDO);
ShelfMaterialDetailDO detailQuery = new ShelfMaterialDetailDO();
detailQuery.setShelfOrderNumber(shelfPO.getShelfOrderNumber());
List<ShelfMaterialDetailPO> detailPOs = shelfMaterialDetailService.queryList(detailQuery);
if (CollectionUtils.isEmpty(detailPOs)) {
return null;
}
StockShelfOrderDO d = new StockShelfOrderDO();
BeanUtils.copyProperties(full, d);
List<ShelfMaterialDetailDO> dlist = full.getMaterialDetailList().stream()
.map(po -> {
ShelfMaterialDetailDO m = JSONUtil.toBean(JSONUtil.toJsonStr(po), ShelfMaterialDetailDO.class);
if (m.getChildren() == null && !CollectionUtils.isEmpty(po.getChildren())) {
m.setChildren(po.getChildren().stream()
.map(c -> JSONUtil.toBean(JSONUtil.toJsonStr(c), ShelfMaterialDetailDO.class))
.collect(Collectors.toList()));
}
if (m.getChildren() == null) {
m.setChildren(new ArrayList<>());
}
return m;
})
.collect(Collectors.toList());
d.setMaterialDetailList(dlist);
genStockShelfTaskOrderByUpShelf(d);
List<ShelfMaterialDetailDO> detailDOs = new ArrayList<>();
for (ShelfMaterialDetailPO po : detailPOs) {
ShelfMaterialDetailDO d = new ShelfMaterialDetailDO();
BeanUtils.copyProperties(po, d);
detailDOs.add(d);
}
shelfDO.setMaterialDetailList(detailDOs);
return shelfDO;
}
/**
@@ -1593,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
@@ -1607,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());
@@ -1632,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
@@ -236,11 +236,11 @@ public class TaskPickingMaterialDetailPO extends BaseVOEntity {
@TableField(exist = false)
private BigDecimal workQuantity;
@ApiModelProperty("是否抄码: 1-是 2-否(与物料主数据一致,查询时回填)")
@ApiModelProperty("是否抄码: 1-是 2-否")
@TableField(exist = false)
private Integer copyCode;
@ApiModelProperty("待拣抄码克重明细(来自 copy_code_reference;顺序与库存抄码 id 列表一致,已按 pickingQuantity 去掉已拣件,仅余待扫)")
@ApiModelProperty("待拣抄码克重明细")
@TableField(exist = false)
private List<CopyCodeReferencePO> weightList;
@@ -33,19 +33,39 @@ public class TaskShelfMaterialDetailImpl extends ServiceImpl<TaskShelfMaterialDe
public List<TaskShelfMaterialDetailPO> queryList(TaskShelfMaterialDetailDO taskShelfMaterialDetailDO)
{
List<TaskShelfMaterialDetailPO> taskShelfMaterialDetailPOList = taskShelfMaterialDetailMapper.queryList(taskShelfMaterialDetailDO);
// 获取查询的层级
List<TaskShelfMaterialDetailPO> askShelfMaterialDetailPOParentList = taskShelfMaterialDetailPOList
.stream().filter(e -> 1 == e.getLevel()).collect(Collectors.toList());
if (CollectionUtils.isEmpty(taskShelfMaterialDetailPOList)) {
return taskShelfMaterialDetailPOList;
}
// 主行level=1 Integer(1) 比较避免 level null 时拆箱 NPE
List<TaskShelfMaterialDetailPO> askShelfMaterialDetailPOParentList = taskShelfMaterialDetailPOList.stream()
.filter(e -> e != null && Integer.valueOf(1).equals(e.getLevel()))
.collect(Collectors.toList());
if (CollectionUtils.isEmpty(askShelfMaterialDetailPOParentList)) {
// 无主行时以无父或 parent=0 为根仍无则整单平铺为根避免详情始终为空
askShelfMaterialDetailPOParentList = taskShelfMaterialDetailPOList.stream()
.filter(e -> e != null && (e.getParentUniqueId() == null || Long.valueOf(0L).equals(e.getParentUniqueId())))
.collect(Collectors.toList());
}
if (CollectionUtils.isEmpty(askShelfMaterialDetailPOParentList)) {
askShelfMaterialDetailPOParentList = new ArrayList<>(taskShelfMaterialDetailPOList);
}
// 递归查询子集
askShelfMaterialDetailPOParentList.forEach(materialDetailPO -> materialDetailPO.setChildren(getChildren(materialDetailPO.getUniqueId(), taskShelfMaterialDetailPOList, 2)));
askShelfMaterialDetailPOParentList.forEach(materialDetailPO -> materialDetailPO.setChildren(
getChildren(materialDetailPO.getUniqueId(), taskShelfMaterialDetailPOList, 2)));
return askShelfMaterialDetailPOParentList;
}
private List<TaskShelfMaterialDetailPO> getChildren(Long parentUniqueId, List<TaskShelfMaterialDetailPO> taskShelfMaterialDetailPOList, Integer maxLevel){
List<TaskShelfMaterialDetailPO> childrenCityList = taskShelfMaterialDetailPOList.stream().filter(materialDetailPO -> parentUniqueId.equals(materialDetailPO.getParentUniqueId())).collect(Collectors.toList());
if (!CollectionUtils.isEmpty(childrenCityList)){
private List<TaskShelfMaterialDetailPO> getChildren(Long parentUniqueId, List<TaskShelfMaterialDetailPO> taskShelfMaterialDetailPOList, Integer maxLevel) {
if (parentUniqueId == null) {
return new ArrayList<>();
}
List<TaskShelfMaterialDetailPO> childrenCityList = taskShelfMaterialDetailPOList.stream()
.filter(materialDetailPO -> parentUniqueId.equals(materialDetailPO.getParentUniqueId()))
.collect(Collectors.toList());
if (!CollectionUtils.isEmpty(childrenCityList)) {
childrenCityList.forEach(childrenCity -> {
if (childrenCity.getLevel() < maxLevel){
Integer level = childrenCity.getLevel();
if (level == null || level < maxLevel) {
childrenCity.setChildren(getChildren(childrenCity.getUniqueId(), taskShelfMaterialDetailPOList, maxLevel));
}
});
@@ -0,0 +1,204 @@
package com.mhd.wms.domain.waveOrder.service;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.mhd.common.core.constant.SecurityConstants;
import com.mhd.common.core.domain.entity.R;
import com.mhd.common.core.exception.ServiceException;
import com.mhd.common.core.utils.OrderSequence;
import com.mhd.common.core.utils.StringUtils;
import com.mhd.common.core.utils.bean.BeanUtils;
import com.mhd.common.security.utils.SecurityUtils;
import com.mhd.system.api.UserServiceFeign;
import com.mhd.system.api.model.LoginUser;
import com.mhd.wms.domain.outMaterialDetail.entity.OutMaterialDetail;
import com.mhd.wms.domain.outMaterialDetail.repository.facade.IOutMaterialDetailService;
import com.mhd.wms.domain.sowingDistributionDetails.repository.facade.ISowingDistributionDetailsService;
import com.mhd.wms.domain.stockOutOrder.entity.StockOutOrder;
import com.mhd.wms.domain.stockOutOrder.repository.facade.IStockOutOrderService;
import com.mhd.wms.domain.stockOutOrder.repository.po.StockOutOrderPO;
import com.mhd.wms.domain.stockOutOrder.repository.todo.StockOutOrderDO;
import com.mhd.wms.domain.waveMaterialDetail.repository.facade.IWaveMaterialDetailService;
import com.mhd.wms.domain.waveMaterialDetail.repository.todo.WaveMaterialDetailDO;
import com.mhd.wms.domain.waveOrder.abstracts.AbstractWaveOrderService;
import com.mhd.wms.domain.waveOrder.repository.facade.IWaveOrderService;
import com.mhd.wms.domain.waveOrder.repository.todo.WaveOrderDO;
import com.mhd.wms.domain.waveOutOrder.entity.WaveOutOrder;
import com.mhd.wms.domain.waveOutOrder.repository.facade.IWaveOutOrderService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import java.math.BigDecimal;
import java.util.*;
import java.util.stream.Collectors;
/**
* @author ZhouGY
* @title DirectGenerationImpl
* @description: TODO
* @date 2024/6/4 11:09
**/
@Service
public class RouteGenerationService extends AbstractWaveOrderService {
@Autowired
private IWaveOrderService waveOrderService;
@Autowired
private IStockOutOrderService stockOutOrderService;
@Autowired
private IOutMaterialDetailService outMaterialDetailService;
@Autowired
private IWaveMaterialDetailService waveMaterialDetailService;
@Autowired
private ISowingDistributionDetailsService sowingDistributionDetailsService;
@Autowired
private IWaveOutOrderService waveOutOrderService;
@Autowired
private UserServiceFeign userServiceFeign;
/**
* @description 核心业务逻辑 直接生成
* @author ZhouGY
* @date 2024/6/4 11:10
* @param stockOutOrderDO
* @return Boolean
*/
@Override
@Transactional(rollbackFor = Exception.class)
public Boolean handleWaveOrderDO(StockOutOrderDO stockOutOrderDO) {
//出库状态: 1-已创建 2-已审核 3-部分分配 4-已分配 5-波次中 6-拣货中 7-拣货完成 8-复核中 9-已出库 10-已取消 11-已关闭
stockOutOrderDO.setStatus(2);
List<StockOutOrderPO> stockOutOrderPOList = stockOutOrderService.queryList(stockOutOrderDO);
if (stockOutOrderDO.getWaveOrderTypeCode().equals("routeGeneration")){
routeGeneration(stockOutOrderPOList,stockOutOrderDO);//按照线路生成波次单
}else{
getABoolean(stockOutOrderPOList,stockOutOrderDO);
}
return true;
}
private void routeGeneration(List<StockOutOrderPO> stockOutOrderPOList,StockOutOrderDO stockOutOrderDO) {
//查询这些客户的路线 吧同一个路线的归入一个波次单 没有路线 创建一个波次单
List<LoginUser> userList = new ArrayList<>();//获取客户信息
for (StockOutOrderPO stockOutOrderPO : stockOutOrderPOList) {
R<LoginUser> userByUser = userServiceFeign.getUserByUserId(stockOutOrderPO.getCustomerId(), SecurityConstants.INNER);
LoginUser user = userByUser.getData();
if (StringUtils.isNotEmpty(user.getLineManagementId())){
stockOutOrderPO.setLineManagementId(user.getLineManagementId());
}
userList.add(userByUser.getData());
}
// null 值统一放到 "UNKNOWN" 分组
Map<String, List<StockOutOrderPO>> groupByLineManagementId = stockOutOrderPOList.stream()
.collect(Collectors.groupingBy(p -> p.getLineManagementId() == null ? "UNKNOWN" : p.getLineManagementId()));
for (String lineManagementId : groupByLineManagementId.keySet()){
List<StockOutOrderPO> orderList = groupByLineManagementId.get(lineManagementId);
getABoolean(orderList, stockOutOrderDO);
}
}
private void getABoolean(List<StockOutOrderPO> stockOutOrderPOList,StockOutOrderDO stockOutOrderDO) {
if (CollectionUtils.isEmpty(stockOutOrderPOList)){
throw new ServiceException("直接生成波次单,请选择已审核的出库单");
}
//判断是不是同一货主同一仓库下的订单
boolean flag = stockOutOrderPOList.stream().map(p -> p.getWarehouseId() + "_" + p.getShipperId()).distinct().count() == 1;
if (!flag){
throw new ServiceException("非同一个货主、同一仓库下的订单不能合并");
}
LoginUser loginUser = SecurityUtils.getLoginUser();
List<String> outOrderNumberList = stockOutOrderPOList.stream().map(StockOutOrderPO::getOutOrderNumber).collect(Collectors.toList());
List<OutMaterialDetail> outMaterialDetailList = outMaterialDetailService.list(new QueryWrapper<OutMaterialDetail>().lambda()
.in(OutMaterialDetail::getOutOrderNumber, outOrderNumberList));
Map<String, List<OutMaterialDetail>> outMaterialDetailListMap = outMaterialDetailList.stream().collect(Collectors.groupingBy(OutMaterialDetail::getMaterialCode));
int outOrderQuantity = stockOutOrderPOList.size();
int materialCategoryQuantity = outMaterialDetailListMap.size();
//统计总数量
BigDecimal materialTotalQuantity = BigDecimal.ZERO;
//统计总重量
BigDecimal weightTotalLimit = BigDecimal.ZERO;
//统计总体积
BigDecimal volumeTotalLimit = BigDecimal.ZERO;
if (!CollectionUtils.isEmpty(outMaterialDetailList)){
materialTotalQuantity = outMaterialDetailList.stream().map(OutMaterialDetail::getQuantity).reduce(BigDecimal.ZERO, BigDecimal::add);
weightTotalLimit = outMaterialDetailList.stream().map(OutMaterialDetail::getWeightLimit).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add);
volumeTotalLimit = outMaterialDetailList.stream().map(OutMaterialDetail::getVolumeLimit).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add);
}
StockOutOrderPO stockOutOrderPO = stockOutOrderPOList.get(0);
WaveOrderDO waveOrderDO = new WaveOrderDO();
waveOrderDO.setOrganizationId(stockOutOrderPO.getOrganizationId());
waveOrderDO.setOrganizationName(stockOutOrderPO.getOrganizationName());
waveOrderDO.setTopOrganizationId(stockOutOrderPO.getTopOrganizationId());
waveOrderDO.setStatus(1);
if (stockOutOrderDO.getWaveOrderTypeCode().equals("routeGeneration")){
waveOrderDO.setWaveOrderTypeCode("routeGeneration");
waveOrderDO.setWaveOrderTypeName("按线路生成");
}else {
waveOrderDO.setWaveOrderTypeCode("directGeneration");
waveOrderDO.setWaveOrderTypeName("直接生成");
}
waveOrderDO.setOutOrderQuantity(outOrderQuantity);
waveOrderDO.setMaterialCategoryQuantity(materialCategoryQuantity);
waveOrderDO.setQuantity(materialTotalQuantity);
waveOrderDO.setWeightLimit(weightTotalLimit);
waveOrderDO.setVolumeLimit(volumeTotalLimit);
waveOrderDO.setOrderTypeCode(stockOutOrderPO.getOrderTypeCode());
waveOrderDO.setOrderTypeName(stockOutOrderPO.getOrderTypeName());
waveOrderDO.setWaveOrderNumber(OrderSequence.getOrderCode("BC"));
waveOrderDO.setWarehouseId(stockOutOrderPO.getWarehouseId());
waveOrderDO.setWarehouseCode(stockOutOrderPO.getWarehouseCode());
waveOrderDO.setWarehouseName(stockOutOrderPO.getWarehouseName());
waveOrderDO.setShipperId(stockOutOrderPO.getShipperId());
waveOrderDO.setShipperCode(stockOutOrderPO.getShipperCode());
waveOrderDO.setShipperName(stockOutOrderPO.getShipperName());
waveOrderDO.setAllocationQuantity(stockOutOrderPO.getAllocationQuantity());
waveOrderDO.setCreateBy(loginUser.getUserid());
waveOrderDO.setCreateByName(loginUser.getUsername());
waveOrderDO.setCreateTime(new Date());
waveOrderService.insert(waveOrderDO);
List<WaveOutOrder> waveOutOrderList = new ArrayList<>();
for (StockOutOrderPO stockOutOrderPODb : stockOutOrderPOList){
WaveOutOrder waveOutOrder = new WaveOutOrder();
waveOutOrder.setWaveOrderNumber(waveOrderDO.getWaveOrderNumber());
waveOutOrder.setOutOrderNumber(stockOutOrderPODb.getOutOrderNumber());
waveOutOrder.setOrganizationId(loginUser.getUserPo().getOrganizationId());
waveOutOrder.setOrganizationName(loginUser.getUserPo().getOrganizationName());
waveOutOrder.setTopOrganizationId(loginUser.getUserPo().getTopOrganizationId());
waveOutOrder.setCreateBy(loginUser.getUserid());
waveOutOrder.setCreateByName(loginUser.getUsername());
waveOutOrder.setCreateTime(new Date());
waveOutOrderList.add(waveOutOrder);
}
// 批量插入明细
List<WaveMaterialDetailDO> waveMaterialDetailDOList = new ArrayList<>();
for (Map.Entry<String, List<OutMaterialDetail>> entry : outMaterialDetailListMap.entrySet()){
WaveMaterialDetailDO waveMaterialDetailDO = new WaveMaterialDetailDO();
OutMaterialDetail outMaterialDetail = entry.getValue().get(entry.getValue().size() - 1);
BeanUtils.copyProperties(outMaterialDetail, waveMaterialDetailDO,
"materialDetailId", "uniqueId", "noticeNumber", "outOrderNumber", "quantity",
"createBy", "createByName", "createTime",
"updateBy", "updateByName", "updateTime");
BigDecimal weightLimit = entry.getValue().stream().map(OutMaterialDetail::getWeightLimit).reduce(BigDecimal.ZERO, BigDecimal::add);
BigDecimal volumeLimit = entry.getValue().stream().map(OutMaterialDetail::getVolumeLimit).reduce(BigDecimal.ZERO, BigDecimal::add);
BigDecimal quantity = entry.getValue().stream().map(OutMaterialDetail::getQuantity).reduce(BigDecimal.ZERO, BigDecimal::add);
waveMaterialDetailDO.setQuantity(quantity);
waveMaterialDetailDO.setWeightLimit(weightLimit);
waveMaterialDetailDO.setVolumeLimit(volumeLimit);
waveMaterialDetailDOList.add(waveMaterialDetailDO);
}
//修改出库单状态为波次中
StockOutOrder stockOutOrder = new StockOutOrder();
stockOutOrder.setStatus(5);//波次中
stockOutOrder.setUpdateBy(loginUser.getUserid());
stockOutOrder.setUpdateByName(loginUser.getUsername());
stockOutOrder.setUpdateTime(new Date());
stockOutOrderService.update(stockOutOrder, new QueryWrapper<StockOutOrder>().lambda().in(StockOutOrder::getOutOrderNumber, outOrderNumberList));
//插入波次单出库单关联表
waveOutOrderService.saveBatch(waveOutOrderList);
//插入波次单播种分货明细
sowingDistributionDetailsService.batchInsert(waveOrderDO.getWaveOrderNumber(), outMaterialDetailList);
//插入波次单物料明细
waveMaterialDetailService.batchInsert(waveOrderDO.getWaveOrderNumber(), waveMaterialDetailDOList);
}
}
@@ -0,0 +1,24 @@
package com.mhd.wms.interfaces.assember.copyCodeReference;
import com.mhd.common.core.utils.bean.BeanUtils;
import com.mhd.wms.domain.copyCodeReference.repository.todo.CopyCodeReferenceDO;
import com.mhd.wms.domain.lineManagement.repository.todo.LineManagementDO;
import com.mhd.wms.interfaces.dto.LineManagement.LineManagementDTO;
import com.mhd.wms.interfaces.dto.copyCodeReference.CopyCodeReferenceDTO;
import org.springframework.stereotype.Component;
@Component
public class LineManagementAssembler {
public LineManagementDO toDO(LineManagementDTO lineManagementDTO){
if(lineManagementDTO == null){
return null;
}
LineManagementDO lineManagementDO = new LineManagementDO();
BeanUtils.copyProperties(lineManagementDTO,lineManagementDO);
return lineManagementDO;
}
}
@@ -0,0 +1,67 @@
package com.mhd.wms.interfaces.dto.LineManagement;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.mhd.common.core.annotation.Excel;
import com.mhd.common.core.web.domain.BaseVOEntity;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.math.BigDecimal;
import java.time.LocalTime;
import java.util.Date;
/**
* 线路管理对象 container
*
*/
@Data
public class LineManagementDTO extends BaseVOEntity{
private static final long serialVersionUID = 1L;
@ApiModelProperty("id")
@TableId(type = IdType.AUTO)
private Long id;
@ApiModelProperty("组织表ID")
@Excel(name = "组织表ID")
private Long organizationId;
@ApiModelProperty("组织名称")
@Excel(name = "组织名称")
private String organizationName;
@ApiModelProperty("一级组织表ID")
@Excel(name = "一级组织表ID")
private Long topOrganizationId;
@ApiModelProperty("仓库ID")
private Long warehouseId;
@ApiModelProperty("仓库名字")
private String warehouseName;
/**
* 路线编码
*/
@ApiModelProperty("路线编码")
private String routeCode;
/**
* 路线名称
*/
@ApiModelProperty("路线名称")
private String routeName;
/**
* 客户
*/
@ApiModelProperty("客户Json数据")
private String customerJson;
@ApiModelProperty("注册地址")
private String register;
}
@@ -93,7 +93,7 @@ public class StockInTaskOrderDTO extends BaseVOEntity {
private String operatorsName;
@ApiModelProperty("作业完成时间")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
@Excel(name = "作业完成时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
private Date operatorsEndTime;
@@ -136,7 +136,7 @@ public class StockOutTaskOrderDTO extends BaseVOEntity {
private String operatorsName;
@ApiModelProperty("作业完成时间")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
@Excel(name = "作业完成时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
private Date operatorsEndTime;
@@ -0,0 +1,96 @@
package com.mhd.wms.interfaces.facadeApi.lineManagement;
import com.mhd.common.core.web.controller.BaseController;
import com.mhd.common.core.web.domain.AjaxResult;
import com.mhd.common.core.web.page.TableDataInfo;
import com.mhd.wms.domain.lineManagement.repository.facade.ILineManagementService;
import com.mhd.wms.domain.lineManagement.repository.po.LineManagementPO;
import com.mhd.wms.domain.lineManagement.repository.todo.LineManagementDO;
import com.mhd.wms.interfaces.assember.copyCodeReference.LineManagementAssembler;
import com.mhd.wms.interfaces.dto.LineManagement.LineManagementDTO;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.util.List;
/**
* 路线管理Api
*/
@RestController
@RequestMapping("/lineManagementApi")
public class LineManagementApi extends BaseController{
@Autowired
private ILineManagementService lineManagementService;
@Resource
private LineManagementAssembler lineManagementAssembler;
/**
* 分页查询路线管理列表
*/
@ApiOperation("查询路线管理列表")
@GetMapping("/list")
public TableDataInfo list(LineManagementDTO lineManagementDTO)
{
//转换实体
LineManagementDO lineManagementDO = lineManagementAssembler.toDO(lineManagementDTO);
startPage();
List<LineManagementPO> list = lineManagementService.queryList(lineManagementDO);
return getDataTable(list);
}
/**
* 分页查询路线管理列表
*/
@ApiOperation("查询路线管理列表")
@GetMapping("/listByApp")
public AjaxResult listByApp(LineManagementDTO lineManagementDTO)
{
//转换实体
LineManagementDO lineManagementDO = lineManagementAssembler.toDO(lineManagementDTO);
List<LineManagementPO> list = lineManagementService.queryList(lineManagementDO);
return AjaxResult.success(list);
}
/**
* 编辑路线管理
*/
@ApiOperation("编辑路线管理")
@PostMapping("/edit")
public AjaxResult edit(@RequestBody LineManagementDTO lineManagementDTO)
{
//转换实体
LineManagementDO lineManagementDO = lineManagementAssembler.toDO(lineManagementDTO);
if(lineManagementDTO.getId() != null){
return toAjax(lineManagementService.update(lineManagementDO));
}else {
return toAjax(lineManagementService.insert(lineManagementDO));
}
}
/**
* 批量删除路线管理
*/
@ApiOperation("批量删除路线管理")
@DeleteMapping("/deleteByIds/{leaseIds}")
public AjaxResult delete(@PathVariable Long[] leaseIds)
{
return toAjax(lineManagementService.delete(leaseIds));
}
/**
* 获取路线管理详细信息
*/
@ApiOperation("获取路线管理")
@GetMapping(value = "/getInfo/{leaseId}")
public AjaxResult getInfo(@PathVariable("leaseId") Long leaseId)
{
return AjaxResult.success(lineManagementService.getInfo(leaseId));
}
}
@@ -74,9 +74,9 @@ public class SysTableConfigApi extends BaseController {
@RequestParam(name="key") String key) {
try {
SysTableConfig config = sysTableConfigService.getByOrgIdAndKey(organizationId, key, warehouseId);
if (config == null) {
return Result.ok("未找到对应配置");
}
// if (config == null) {
// return Result.ok("未找到对应配置");
// }
return Result.ok(config);
} catch (Exception e) {
log.error(e.getMessage(), e);
@@ -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")
@@ -48,7 +48,7 @@ public class ReviewOrderAppApi extends BaseController {
* 分页查询复核单列表仅已下发任务按当前用户仓库过滤
* <ul>
* <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>
*/
@ApiOperation("PDA 复核单列表(REVIEW_ORDER")
@@ -104,7 +104,7 @@ public class ReviewOrderAppApi extends BaseController {
}
/**
* 完成复核确认无待复核数量时可确认同步出库明细生成交接 PC checkConfirm 一致
* 完成复核确认同步出库明细生成交接作业单并自动下发交接类 PDA 任务 delive_task/taskType=7与拣货完成后自动复核下发对齐
*/
@ApiOperation("PDA 完成复核")
@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")
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">
@@ -0,0 +1,110 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.mhd.wms.domain.lineManagement.repository.mapper.LineManagementMapper">
<resultMap type="com.mhd.wms.domain.lineManagement.repository.po.LineManagementPO" id="LineManagementResult">
<!-- 租赁相关字段 -->
<result property="id" column="id" />
<result property="organizationId" column="organization_id" />
<result property="organizationName" column="organization_name" />
<result property="topOrganizationId" column="top_organization_id" />
<result property="warehouseId" column="warehouse_id" />
<result property="warehouseName" column="warehouse_name" />
<result property="routeCode" column="route_code" />
<result property="routeName" column="route_name" />
<result property="customerJson" column="customer_json" />
<result property="register" column="register" />
<!-- 继承自BaseVOEntity的字段 -->
<result property="createTime" column="create_time" />
<result property="createBy" column="create_by" />
<result property="createByName" column="create_by_name" />
<result property="updateTime" column="update_time" />
<result property="updateBy" column="update_by" />
<result property="updateByName" column="update_by_name" />
<result property="delFlag" column="del_flag" />
</resultMap>
<sql id="selectLineManagementPo">
select
a.id,
a.organization_id,
a.organization_name,
a.top_organization_id,
a.warehouse_id,
a.warehouse_name,
a.route_code,
a.route_name,
a.customer_json,
a.create_by,
a.create_by_name,
a.create_time,
a.update_by,
a.update_by_name,
a.update_time,
a.del_flag,
a.register
from line_management a
</sql>
<sql id="selectLineManagementPo1">
<where>
<!-- ID查询 -->
<if test="id != null">
and a.id = #{id}
</if>
<!-- 组织相关查询 -->
<if test="organizationId != null">
and a.organization_id = #{organizationId}
</if>
<if test="topOrganizationId != null">
and a.top_organization_id = #{topOrganizationId}
</if>
<if test="organizationName != null and organizationName != ''">
and a.organization_name like concat('%', #{organizationName}, '%')
</if>
<!-- 仓库相关查询 -->
<if test="warehouseId != null">
and a.warehouse_id = #{warehouseId}
</if>
<if test="warehouseName != null and warehouseName != ''">
and a.warehouse_name like concat('%', #{warehouseName}, '%')
</if>
<!-- 线路管理字段查询 -->
<if test="routeCode != null and routeCode != ''">
and a.route_code like concat('%', #{routeCode}, '%')
</if>
<if test="routeName != null and routeName != ''">
and a.route_name like concat('%', #{routeName}, '%')
</if>
<if test="customerJson != null and customerJson != ''">
and a.customer_json like concat('%', #{customerJson}, '%')
</if>
<!-- 创建和更新相关条件 -->
<if test="createByName != null and createByName != ''">
and a.create_by_name like concat('%', #{createByName}, '%')
</if>
<if test="updateByName != null and updateByName != ''">
and a.update_by_name like concat('%', #{updateByName}, '%')
</if>
<!-- 删除标记 -->
<choose>
<when test="delFlag != null">
and a.del_flag = #{delFlag}
</when>
<otherwise>
and a.del_flag = 1
</otherwise>
</choose>
</where>
</sql>
<!-- 查询列表 -->
<select id="queryList" parameterType="com.mhd.wms.domain.lineManagement.repository.po.LineManagementPO" resultMap="LineManagementResult">
<include refid="selectLineManagementPo"/>
<include refid="selectLineManagementPo1"/>
ORDER BY a.create_time DESC
</select>
</mapper>
@@ -165,6 +165,9 @@
<if test="receiveTimeEnd != null and receiveTimeEnd != ''">
and date_format(a.receive_time, '%Y-%m-%d') &lt;= #{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}
@@ -283,4 +286,4 @@
and d.del_flag = 1
order by d.review_material_detail_id asc
</select>
</mapper>
</mapper>
@@ -93,7 +93,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<where>
<include refid="selectStockInTaskOrderPo1"/>
</where>
-- 创建时间为空的排最后
order by a.create_time is null, a.create_time desc
-- 先按照作业时间来排序,创建时间为空的排最后
order by a.operators_end_time desc, a.create_time is null, a.create_time desc
</select>
</mapper>
@@ -141,4 +141,14 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
update "NGWL_TEST_OMS".RESERVATION_IN_MATERIAL_DETAIL set INBOUND_ITEMS = #{shelvesQuantity}, TOTAL_NET_WEIGHT= #{totalNetWeight},STORAGE_TIME = CURRENT_TIMESTAMP
where LOT_NO = #{lotNumber}
</update>
<update id="updateOmsInventoryQuantity">
update "NGWL_TEST_OMS".RESERVATION_MATERIAL_INVENTORY set INVENTORY_QUANTITY = #{quantity},
ALLOCATION_QUANTITY= #{quantity}
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 - #{checkQuantity},
ALLOCATION_QUANTITY= ALLOCATION_QUANTITY - #{checkQuantity}
where IN_ORDER_NUMBER = #{inOrderNumber} and LOT_NUMBER = #{lotNo}
</update>
</mapper>