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:
@@ -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) {
|
||||
|
||||
+3
-2
@@ -47,9 +47,10 @@ public class DeliveTaskApplicationService {
|
||||
if (topOrganizationId != null && topOrganizationId != 1){
|
||||
deliveTaskDO.setTopOrganizationId(loginUser.getUserPo().getTopOrganizationId());
|
||||
}
|
||||
// 只查询下发给当前登录用户的任务
|
||||
deliveTaskDO.setOperatorsBy(loginUser.getUserid());
|
||||
// 只查询下发给当前登录用户的任务(对应 task_distribution_id = 当前用户)
|
||||
deliveTaskDO.setTaskDistributionId(loginUser.getUserid());
|
||||
}
|
||||
// 不按 task_status 默认过滤;若请求传入 taskStatus 则仍可按状态筛选
|
||||
return deliveTaskDomainService.queryListApp(deliveTaskDO);
|
||||
}
|
||||
|
||||
|
||||
+14
-6
@@ -22,6 +22,7 @@ import com.mhd.wms.domain.deliveTask.repository.todo.DeliveTaskDO;
|
||||
import com.mhd.wms.domain.handoverTaskOrder.entity.HandoverTaskOrder;
|
||||
import com.mhd.wms.domain.handoverTaskOrder.repository.facade.IHandoverTaskOrderService;
|
||||
import com.mhd.wms.domain.handoverTaskOrder.repository.todo.HandoverTaskOrderDO;
|
||||
import com.mhd.wms.domain.handoverTaskOrder.service.HandoverTaskOrderDomainService;
|
||||
import com.mhd.wms.domain.outMaterialDetail.entity.OutMaterialDetail;
|
||||
import com.mhd.wms.domain.outMaterialDetail.repository.mapper.OutMaterialDetailMapper;
|
||||
import com.mhd.wms.domain.outOrderAbnormal.repository.facade.IOutOrderAbnormalService;
|
||||
@@ -87,6 +88,9 @@ public class ReviewOrderApplicationService {
|
||||
@Autowired
|
||||
private IHandoverTaskOrderService handoverTaskOrderService;
|
||||
|
||||
@Autowired
|
||||
private HandoverTaskOrderDomainService handoverTaskOrderDomainService;
|
||||
|
||||
@Autowired
|
||||
private OutMaterialDetailMapper outMaterialDetailMapper;
|
||||
@Autowired
|
||||
@@ -117,6 +121,8 @@ public class ReviewOrderApplicationService {
|
||||
query.setReviewStatus(3);
|
||||
} else {
|
||||
query.setLtReviewStatus(3);
|
||||
// 待办仅展示已在下发任务中「接收」的复核单(receive_time 由接收 delive_task 回写);否则会出现未接收仍出现在列表
|
||||
query.setOnlyReceived(1);
|
||||
}
|
||||
query.setIssuedFlag("1");
|
||||
if (query.getDelFlag() == null) {
|
||||
@@ -464,7 +470,10 @@ public class ReviewOrderApplicationService {
|
||||
}
|
||||
handoverTaskOrderDO.setCreateByName(userRealName);
|
||||
handoverTaskOrderDO.setCreateTime(new Date());
|
||||
handoverTaskOrderService.insert(handoverTaskOrderDO);
|
||||
Boolean inserted = handoverTaskOrderService.insert(handoverTaskOrderDO);
|
||||
if (Boolean.TRUE.equals(inserted) && StringUtils.isNotEmpty(handoverTaskOrderDO.getTaskNumber())) {
|
||||
handoverTaskOrderDomainService.autoDistributeHandoverAfterInsertByTaskNumber(handoverTaskOrderDO.getTaskNumber(), loginUser);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -519,9 +528,8 @@ public class ReviewOrderApplicationService {
|
||||
if (header == null || !"0".equals(header.getIssuedFlag())) {
|
||||
return;
|
||||
}
|
||||
// 与入库收货自动下发一致:不在下发时预填作业人,仅在 PDA/PC「接收任务」后写入 delive_task
|
||||
ReviewOrderDO cmd = new ReviewOrderDO();
|
||||
cmd.setCheckOperatorsBy(loginUser.getUserid());
|
||||
cmd.setCheckOperatorsName(resolveLoginDisplayName(loginUser));
|
||||
applyReviewTaskDistribution(Collections.singletonList(header), cmd, loginUser);
|
||||
}
|
||||
|
||||
@@ -572,11 +580,11 @@ public class ReviewOrderApplicationService {
|
||||
deliveTaskDO.setTaskDistributionId(loginUser.getUserid());
|
||||
deliveTaskDO.setTaskDistributionName(userRealName);
|
||||
deliveTaskDO.setTaskDistributionTime(new Date());
|
||||
// PC 复核下发可传 checkOperatorsBy/Name 预指派人;未传则留空,与收货/上架类任务一致,接收时再赋值
|
||||
Long operatorsBy = reviewOrderDO != null ? reviewOrderDO.getCheckOperatorsBy() : null;
|
||||
String operatorsName = reviewOrderDO != null ? reviewOrderDO.getCheckOperatorsName() : null;
|
||||
if (operatorsBy == null || operatorsBy == 0) {
|
||||
operatorsBy = loginUser.getUserid();
|
||||
operatorsName = (operatorsName != null && !operatorsName.isEmpty()) ? operatorsName : userRealName;
|
||||
if (operatorsBy != null && operatorsBy == 0L) {
|
||||
operatorsBy = null;
|
||||
}
|
||||
deliveTaskDO.setOperatorsBy(operatorsBy);
|
||||
deliveTaskDO.setOperatorsName(operatorsName);
|
||||
|
||||
+12
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
+8
@@ -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<>();
|
||||
|
||||
+3
@@ -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(),
|
||||
|
||||
+4
-1
@@ -29,7 +29,7 @@ public class DeliveTaskServiceFactory {
|
||||
*/
|
||||
public IDeliveTaskTypeService getDeliveTaskTypeService(Integer taskType) {
|
||||
String deliveTaskType = "";
|
||||
//任务类型 0-无 1-收货 2-上架 3-拣货 4-复核 5-移位 6-盘点
|
||||
//任务类型 0-无 1-收货 2-上架 3-拣货 4-复核 5-移位 6-盘点 7-交接作业单
|
||||
switch (taskType){
|
||||
case 1:
|
||||
deliveTaskType = "stockReceiptOrderImpl";
|
||||
@@ -49,6 +49,9 @@ public class DeliveTaskServiceFactory {
|
||||
case 6:
|
||||
deliveTaskType = "investigationManageImpl";
|
||||
break;
|
||||
case 7:
|
||||
deliveTaskType = "handoverTaskOrderImpl";
|
||||
break;
|
||||
default:
|
||||
throw new ServiceException("任务类型不存在");
|
||||
}
|
||||
|
||||
+5
@@ -52,6 +52,11 @@ public interface IDeliveTaskService extends IService<DeliveTask>
|
||||
|
||||
public int refuse(Long deliverTaskId);
|
||||
|
||||
/**
|
||||
* 更新下发任务作业人(接收时写入当前用户)
|
||||
*/
|
||||
int updateOperatorsBy(Long deliverTaskId, Long operatorsBy, String operatorsName);
|
||||
|
||||
/**
|
||||
* 查询列表表头数量
|
||||
*/
|
||||
|
||||
+6
-8
@@ -99,14 +99,7 @@ public class DeliveTaskImpl extends ServiceImpl<DeliveTaskMapper, DeliveTask> im
|
||||
@Override
|
||||
public List<DeliveTaskPO> queryListApp(DeliveTaskDO deliveTaskDO)
|
||||
{
|
||||
LoginUser loginUser = SecurityUtils.getLoginUser();
|
||||
if (null != deliveTaskDO.getTabType()) {
|
||||
if (deliveTaskDO.getTabType() == 1) {
|
||||
deliveTaskDO.setOperatorsBy(loginUser.getUserid());
|
||||
} else if (deliveTaskDO.getTabType() == 2) {
|
||||
deliveTaskDO.setOperatorsBy(null);
|
||||
}
|
||||
}
|
||||
// App 列表条件见 DeliveTaskMapper.queryListApp / selectDeliveTaskPoApp1(不按 tabType、operators_by 过滤)
|
||||
List<DeliveTaskPO> deliveTaskPOS = deliveTaskMapper.queryListApp(deliveTaskDO);
|
||||
if (deliveTaskDO.getTaskType() == 7){
|
||||
statistics(deliveTaskPOS);
|
||||
@@ -277,6 +270,11 @@ public class DeliveTaskImpl extends ServiceImpl<DeliveTaskMapper, DeliveTask> im
|
||||
public int receive(Long deliverTaskId) {
|
||||
return deliveTaskMapper.receive(deliverTaskId,1);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int updateOperatorsBy(Long deliverTaskId, Long operatorsBy, String operatorsName) {
|
||||
return deliveTaskMapper.updateOperatorsBy(deliverTaskId, operatorsBy, operatorsName);
|
||||
}
|
||||
/**
|
||||
* 拒绝操作
|
||||
*/
|
||||
|
||||
+30
-2
@@ -2,6 +2,8 @@ package com.mhd.wms.domain.deliveTask.service;
|
||||
|
||||
import com.mhd.common.core.exception.ServiceException;
|
||||
import com.mhd.common.core.utils.bean.BeanUtils;
|
||||
import com.mhd.common.security.utils.SecurityUtils;
|
||||
import com.mhd.system.api.model.LoginUser;
|
||||
import com.mhd.wms.domain.deliveTask.entity.DeliveTask;
|
||||
import com.mhd.wms.domain.deliveTask.factorys.DeliveTaskServiceFactory;
|
||||
import com.mhd.wms.domain.deliveTask.repository.facade.IDeliveTaskService;
|
||||
@@ -12,6 +14,7 @@ import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
import org.springframework.util.StringUtils;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@@ -85,17 +88,42 @@ public class DeliveTaskDomainService {
|
||||
if (deliveTask.getTaskStatus() > 0){
|
||||
throw new ServiceException("任务已处理,请勿重复处理");
|
||||
}
|
||||
LoginUser loginUser = SecurityUtils.getLoginUser();
|
||||
if (loginUser == null) {
|
||||
throw new ServiceException("用户未登录");
|
||||
}
|
||||
int count = deliveTaskService.receive(deliverTaskId);
|
||||
if (count == 0) {
|
||||
throw new ServiceException("接受任务失败");
|
||||
}
|
||||
|
||||
String operatorsName = resolveLoginDisplayName(loginUser);
|
||||
if (!StringUtils.hasText(operatorsName)) {
|
||||
operatorsName = loginUser.getUsername() != null ? loginUser.getUsername() : "";
|
||||
}
|
||||
deliveTaskService.updateOperatorsBy(deliverTaskId, loginUser.getUserid(), operatorsName);
|
||||
|
||||
DeliveTaskDO deliveTaskDO = new DeliveTaskDO();
|
||||
deliveTaskDO.setTrackingNumber(deliveTask.getTrackingNumber());
|
||||
deliveTaskDO.setOperatorsBy(deliveTask.getOperatorsBy());
|
||||
deliveTaskDO.setOperatorsName(deliveTask.getOperatorsName());
|
||||
deliveTaskDO.setOperatorsBy(loginUser.getUserid());
|
||||
deliveTaskDO.setOperatorsName(operatorsName);
|
||||
deliveTaskServiceFactory.getDeliveTaskTypeService(deliveTask.getTaskType()).handleDeliveTask(deliveTaskDO);
|
||||
return count;
|
||||
}
|
||||
|
||||
/** 与复核等模块一致:优先 UserPo 真实姓名,其次 realname,最后登录账号 */
|
||||
private static String resolveLoginDisplayName(LoginUser loginUser) {
|
||||
if (loginUser == null) {
|
||||
return null;
|
||||
}
|
||||
if (loginUser.getUserPo() != null && StringUtils.hasText(loginUser.getUserPo().getUserName())) {
|
||||
return loginUser.getUserPo().getUserName();
|
||||
}
|
||||
if (StringUtils.hasText(loginUser.getRealname())) {
|
||||
return loginUser.getRealname();
|
||||
}
|
||||
return loginUser.getUsername();
|
||||
}
|
||||
/**
|
||||
* 拒绝操作
|
||||
*/
|
||||
|
||||
+20
-1
@@ -1,9 +1,12 @@
|
||||
package com.mhd.wms.domain.handoverTaskOrder.repository.persistence;
|
||||
|
||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
|
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||
import com.mhd.common.security.utils.SecurityUtils;
|
||||
import com.mhd.system.api.model.LoginUser;
|
||||
import com.mhd.wms.domain.deliveTask.repository.facade.IDeliveTaskTypeService;
|
||||
import com.mhd.wms.domain.deliveTask.repository.todo.DeliveTaskDO;
|
||||
import com.mhd.wms.domain.handoverTaskOrder.entity.HandoverTaskOrder;
|
||||
import com.mhd.wms.domain.handoverTaskOrder.repository.facade.IHandoverTaskOrderService;
|
||||
import com.mhd.wms.domain.handoverTaskOrder.repository.mapper.HandoverTaskOrderMapper;
|
||||
@@ -27,7 +30,7 @@ import java.util.stream.Collectors;
|
||||
* @date 2024-05-28
|
||||
*/
|
||||
@Service
|
||||
public class HandoverTaskOrderImpl extends ServiceImpl<HandoverTaskOrderMapper, HandoverTaskOrder> implements IHandoverTaskOrderService {
|
||||
public class HandoverTaskOrderImpl extends ServiceImpl<HandoverTaskOrderMapper, HandoverTaskOrder> implements IHandoverTaskOrderService, IDeliveTaskTypeService {
|
||||
@Autowired
|
||||
private HandoverTaskOrderMapper handoverTaskOrderMapper;
|
||||
|
||||
@@ -118,4 +121,20 @@ public class HandoverTaskOrderImpl extends ServiceImpl<HandoverTaskOrderMapper,
|
||||
return i > 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* PDA 接收交接下发任务(taskType=7)后,按交接作业单号回写作业人(trackingNumber = task_number)
|
||||
*/
|
||||
@Override
|
||||
public Boolean handleDeliveTask(DeliveTaskDO deliveTaskDO) {
|
||||
LoginUser loginUser = SecurityUtils.getLoginUser();
|
||||
return update(null, new UpdateWrapper<HandoverTaskOrder>().lambda()
|
||||
.set(HandoverTaskOrder::getOperatorsBy, deliveTaskDO.getOperatorsBy())
|
||||
.set(HandoverTaskOrder::getOperatorsName, deliveTaskDO.getOperatorsName())
|
||||
.set(HandoverTaskOrder::getUpdateBy, loginUser != null ? loginUser.getUserid() : null)
|
||||
.set(HandoverTaskOrder::getUpdateByName, loginUser != null ? loginUser.getUsername() : null)
|
||||
.set(HandoverTaskOrder::getUpdateTime, new Date())
|
||||
.eq(HandoverTaskOrder::getTaskNumber, deliveTaskDO.getTrackingNumber())
|
||||
.eq(HandoverTaskOrder::getDelFlag, 1));
|
||||
}
|
||||
|
||||
}
|
||||
+71
-6
@@ -14,6 +14,7 @@ import com.mhd.system.api.model.LoginUser;
|
||||
import com.mhd.wms.domain.copyCodeReference.entity.CopyCodeReference;
|
||||
import com.mhd.wms.domain.copyCodeReference.repository.facade.ICopyCodeReferenceService;
|
||||
import com.mhd.wms.domain.copyCodeReference.service.CopyCodeReferenceDomainService;
|
||||
import com.mhd.wms.domain.deliveTask.entity.DeliveTask;
|
||||
import com.mhd.wms.domain.deliveTask.repository.facade.IDeliveTaskService;
|
||||
import com.mhd.wms.domain.deliveTask.repository.todo.DeliveTaskDO;
|
||||
import com.mhd.wms.domain.handoverTaskOrder.entity.HandoverTaskOrder;
|
||||
@@ -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=7,trackingNumber=交接作业单号),与 PC「交接任务下发」一致。
|
||||
*/
|
||||
private void insertDeliveTasksForHandoverOrders(List<HandoverTaskOrder> handoverTaskOrders, Long operatorsBy, String operatorsName, LoginUser loginUser) {
|
||||
if (CollectionUtils.isEmpty(handoverTaskOrders) || loginUser == null || loginUser.getUserPo() == null) {
|
||||
return;
|
||||
}
|
||||
final String userRealName = (loginUser.getUserPo().getUserName() != null
|
||||
&& !loginUser.getUserPo().getUserName().trim().isEmpty())
|
||||
? loginUser.getUserPo().getUserName()
|
||||
: (loginUser.getRealname() != null && !loginUser.getRealname().trim().isEmpty())
|
||||
? loginUser.getRealname()
|
||||
@@ -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;
|
||||
}
|
||||
+45
@@ -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);
|
||||
}
|
||||
+21
@@ -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);
|
||||
|
||||
}
|
||||
+156
@@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
+62
@@ -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;
|
||||
|
||||
}
|
||||
+42
@@ -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;
|
||||
}
|
||||
+61
@@ -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;
|
||||
}
|
||||
+88
@@ -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));
|
||||
}
|
||||
}
|
||||
+7
-4
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
+60
-2
@@ -71,6 +71,7 @@ import java.util.ArrayList;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
import java.util.function.Function;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
@@ -189,6 +190,62 @@ public class PickingOrderDomainService {
|
||||
return pickingMaterialDetailService.saveBatch(pickingMaterialDetailList);
|
||||
}
|
||||
|
||||
/**
|
||||
* 出库单「生成拣货单」后自动下发:生成拣货作业单 + delive_task(taskType=3),与入库审核后
|
||||
* {@link com.mhd.wms.domain.stockReceiptOrder.service.StockReceiptOrderDomainService#autoTaskDistributionAfterStockInAudit} 一致;
|
||||
* 作业人仅在接收任务时写入 delive_task / 拣货作业单(拣货单主表实体未映射作业人字段,不在此更新)。
|
||||
*/
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public void autoTaskDistributionAfterGenPickingOrders(List<String> pickingOrderNumbers) {
|
||||
if (CollectionUtils.isEmpty(pickingOrderNumbers)) {
|
||||
return;
|
||||
}
|
||||
LoginUser loginUser = SecurityUtils.getLoginUser();
|
||||
if (loginUser == null || loginUser.getUserPo() == null) {
|
||||
return;
|
||||
}
|
||||
final String userRealName = (loginUser.getUserPo().getUserName() != null
|
||||
&& !loginUser.getUserPo().getUserName().trim().isEmpty())
|
||||
? loginUser.getUserPo().getUserName()
|
||||
: (loginUser.getRealname() != null && !loginUser.getRealname().trim().isEmpty())
|
||||
? loginUser.getRealname()
|
||||
: loginUser.getUsername();
|
||||
List<PickingOrder> rows = pickingOrderService.list(new LambdaQueryWrapper<PickingOrder>()
|
||||
.in(PickingOrder::getPickingOrderNumber, pickingOrderNumbers)
|
||||
.eq(PickingOrder::getDelFlag, 1)
|
||||
.and(w -> w.isNull(PickingOrder::getTaskDistribution)
|
||||
.or()
|
||||
.eq(PickingOrder::getTaskDistribution, 2)));
|
||||
if (CollectionUtils.isEmpty(rows)) {
|
||||
return;
|
||||
}
|
||||
List<PickingOrderPO> pickingOrderPODbList = rows.stream().map(r -> {
|
||||
PickingOrderPO po = new PickingOrderPO();
|
||||
BeanUtils.copyProperties(r, po);
|
||||
return po;
|
||||
}).collect(Collectors.toList());
|
||||
PickingOrderDO ctx = new PickingOrderDO();
|
||||
ctx.setOperatorsBy(null);
|
||||
ctx.setOperatorsName(null);
|
||||
genStockOutTaskOrderByAllDistribution(ctx, pickingOrderPODbList);
|
||||
List<Long> ids = rows.stream()
|
||||
.map(PickingOrder::getPickingOrderId)
|
||||
.filter(Objects::nonNull)
|
||||
.collect(Collectors.toList());
|
||||
if (CollectionUtils.isEmpty(ids)) {
|
||||
return;
|
||||
}
|
||||
Date now = new Date();
|
||||
// picking_order 表若存在作业人字段,当前实体 PickingOrder 未映射,不在此回写;作业人以 delive_task / 拣货作业单为准
|
||||
pickingOrderService.update(null, new UpdateWrapper<PickingOrder>().lambda()
|
||||
.set(PickingOrder::getTaskDistribution, 1)
|
||||
.set(PickingOrder::getTaskDistributionTime, now)
|
||||
.set(PickingOrder::getUpdateBy, loginUser.getUserid())
|
||||
.set(PickingOrder::getUpdateByName, userRealName)
|
||||
.set(PickingOrder::getUpdateTime, now)
|
||||
.in(PickingOrder::getPickingOrderId, ids));
|
||||
}
|
||||
|
||||
/**
|
||||
* @description 生成物料明细实体
|
||||
* @author ZhouGY
|
||||
@@ -889,8 +946,9 @@ public class PickingOrderDomainService {
|
||||
deliveTaskDO.setTaskDistributionId(loginUser.getUserid());
|
||||
deliveTaskDO.setTaskDistributionName(userRealName);
|
||||
deliveTaskDO.setTaskDistributionTime(new Date());
|
||||
deliveTaskDO.setOperatorsBy(pickingOrderDO.getOperatorsBy());
|
||||
deliveTaskDO.setOperatorsName(pickingOrderDO.getOperatorsName());
|
||||
// 作业人仅在 PDA/PC「接收任务」后写入,与入库审核自动下发的收货类 delive_task 一致
|
||||
deliveTaskDO.setOperatorsBy(null);
|
||||
deliveTaskDO.setOperatorsName(null);
|
||||
deliveTaskDO.setCreateBy(loginUser.getUserid());
|
||||
deliveTaskDO.setCreateByName(userRealName);
|
||||
deliveTaskDO.setCreateTime(new Date());
|
||||
|
||||
+17
@@ -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")))) {
|
||||
|
||||
+6
@@ -80,4 +80,10 @@ public class ReviewOrderDO extends BaseVOEntity {
|
||||
|
||||
@ApiModelProperty("复核状态小于该值(查询用,如待办 review_status < 3)")
|
||||
private Integer ltReviewStatus;
|
||||
|
||||
/**
|
||||
* PDA 待办:1 表示仅查已在任务中心「接收」的复核单(receive_time 非空),与 delive_task 接收后回写一致
|
||||
*/
|
||||
@ApiModelProperty("仅已接收:1-是(receive_time 非空)")
|
||||
private Integer onlyReceived;
|
||||
}
|
||||
|
||||
+1
-1
@@ -517,7 +517,7 @@ public class StockInOrderDomainService {
|
||||
if (!batchInsertResult) {
|
||||
throw new ServiceException("生成收货单失败");
|
||||
}
|
||||
// 入库作业单(收货 type=1)在「收货任务下发」时生成,审核通过仅生成收货单与质检等,此处不再落 stock_in_task_order
|
||||
// 收货任务不随审核自动下发,需在收货单侧手动「任务下发」(delive_task 等)
|
||||
return batchInsertResult;
|
||||
}
|
||||
|
||||
|
||||
+64
-16
@@ -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));
|
||||
});
|
||||
|
||||
+1
-1
@@ -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;
|
||||
|
||||
|
||||
+19
-7
@@ -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;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取入库收货作业单详细信息
|
||||
|
||||
+12
@@ -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;
|
||||
}
|
||||
+3
-1
@@ -720,7 +720,9 @@ public class StockOutOrderDomainService {
|
||||
}
|
||||
pickingOrderDOList.add(pickingOrderDO);
|
||||
});
|
||||
return pickingOrderDomainService.batchInsert(pickingOrderDOList);
|
||||
Boolean inserted = pickingOrderDomainService.batchInsert(pickingOrderDOList);
|
||||
// 拣货任务不随生成拣货单自动下发,需在拣货单侧「整单下发/明细下发」
|
||||
return inserted;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
+1
-1
@@ -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;
|
||||
|
||||
|
||||
+17
@@ -770,6 +770,23 @@ public class StockOutTaskOrderDomainService {
|
||||
outOrderAbnormalService.genOutOrderAbnormal(outOrderAbnormalBaseDO, 1);
|
||||
//设置拣货单拣货需要更新的数据数据
|
||||
updateStockOutTaskOrder(null, stockOutTaskOrderPODb, 3);
|
||||
// 与 PickingOrderDomainService.completePicking 对齐:PDA 完成拣货后确保生成复核单并自动下发(delive_task taskType=4,作业人待接收)
|
||||
PickingOrder pickingOrderRow = pickingOrderService.getOne(new QueryWrapper<PickingOrder>().lambda()
|
||||
.eq(PickingOrder::getPickingOrderNumber, stockOutTaskOrderPODb.getPickingOrderNumber())
|
||||
.eq(PickingOrder::getDelFlag, 1));
|
||||
if (pickingOrderRow != null && Integer.valueOf(1).equals(pickingOrderRow.getType())) {
|
||||
PickingOrderPO pickingOrderPO = pickingOrderService.getInfoByIdAndType(
|
||||
pickingOrderRow.getPickingOrderId(), pickingOrderRow.getType());
|
||||
StockOutOrder stockOutOrder = stockOutOrderService.getOne(new LambdaQueryWrapper<StockOutOrder>()
|
||||
.eq(StockOutOrder::getOutOrderNumber, stockOutTaskOrderPODb.getOrderNumber())
|
||||
.eq(StockOutOrder::getDelFlag, 1));
|
||||
if (pickingOrderPO != null && stockOutOrder != null) {
|
||||
Long newReviewId = reviewOrderDomainService.tryGenerateReviewOrderAfterPickingComplete(pickingOrderPO, stockOutOrder);
|
||||
if (newReviewId != null) {
|
||||
reviewOrderApplicationService.autoDistributeReviewAfterPickingComplete(newReviewId);
|
||||
}
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
+20
@@ -1,6 +1,7 @@
|
||||
package com.mhd.wms.domain.stockReceiptOrder.entity;
|
||||
|
||||
import com.baomidou.mybatisplus.annotation.IdType;
|
||||
import com.baomidou.mybatisplus.annotation.TableField;
|
||||
import com.baomidou.mybatisplus.annotation.TableId;
|
||||
import com.fasterxml.jackson.annotation.JsonFormat;
|
||||
import com.mhd.common.core.annotation.Excel;
|
||||
@@ -40,6 +41,25 @@ public class StockReceiptOrder extends BaseVOEntity {
|
||||
@Excel(name = "一级组织表ID")
|
||||
private Long topOrganizationId;
|
||||
|
||||
/**
|
||||
* 与入库单一致,列表/业务可从 stock_in_order 关联取;多数库表 stock_receipt_order 无此列,不参与持久化。
|
||||
* 若库表已执行 alter_stock_receipt_order_warehouse_dm.sql,可去掉 exist=false 以落库。
|
||||
*/
|
||||
@TableField(exist = false)
|
||||
@ApiModelProperty("仓库id")
|
||||
@Excel(name = "仓库id")
|
||||
private Long warehouseId;
|
||||
|
||||
@TableField(exist = false)
|
||||
@ApiModelProperty("仓库编码")
|
||||
@Excel(name = "仓库编码")
|
||||
private String warehouseCode;
|
||||
|
||||
@TableField(exist = false)
|
||||
@ApiModelProperty("仓库名称")
|
||||
@Excel(name = "仓库名称")
|
||||
private String warehouseName;
|
||||
|
||||
@ApiModelProperty("入库单号")
|
||||
@Excel(name = "入库单号")
|
||||
private String inOrderNumber;
|
||||
|
||||
+278
-9
@@ -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_detail(PDA/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);
|
||||
}
|
||||
|
||||
+6
@@ -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);
|
||||
}
|
||||
+4
@@ -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);
|
||||
}
|
||||
+12
@@ -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
|
||||
|
||||
+306
-105
@@ -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=2:PDA 已在收货完成时生成;若尚未生成(如 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
|
||||
|
||||
+2
-2
@@ -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;
|
||||
|
||||
|
||||
+28
-8
@@ -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));
|
||||
}
|
||||
});
|
||||
|
||||
+204
@@ -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);
|
||||
}
|
||||
}
|
||||
+24
@@ -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;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
+67
@@ -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;
|
||||
}
|
||||
+1
-1
@@ -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;
|
||||
|
||||
|
||||
+1
-1
@@ -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;
|
||||
|
||||
|
||||
+96
@@ -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));
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
+3
-3
@@ -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);
|
||||
|
||||
+3
-2
@@ -31,8 +31,9 @@ public class DeliveTaskAppApi extends BaseController {
|
||||
private DeliveTaskAssembler deliveTaskAssembler;
|
||||
|
||||
/**
|
||||
* 分页查询下发任务列表
|
||||
* @return
|
||||
* 分页查询下发任务列表。条件:del_flag=1、当前一级组织、请求参数 warehouseId、
|
||||
* task_distribution_id=当前登录用户;不按 task_status 过滤(入参传入 taskStatus 时可选筛状态)。
|
||||
* 与 PC 列表不同,不按 tabType/operators_by 过滤。
|
||||
*/
|
||||
@ApiOperation("查询下发任务列表")
|
||||
@GetMapping("/list")
|
||||
|
||||
+2
-2
@@ -48,7 +48,7 @@ public class ReviewOrderAppApi extends BaseController {
|
||||
* 分页查询复核单列表(仅已下发任务,按当前用户仓库过滤)
|
||||
* <ul>
|
||||
* <li>{@code tabType=2}:历史({@code review_status=3} 已复核)</li>
|
||||
* <li>其它:待办({@code review_status < 3},待复核/复核中)</li>
|
||||
* <li>其它:待办({@code review_status < 3},待复核/复核中),且仅 {@code receive_time} 非空(已在下发任务中接收)</li>
|
||||
* </ul>
|
||||
*/
|
||||
@ApiOperation("PDA 复核单列表(REVIEW_ORDER)")
|
||||
@@ -104,7 +104,7 @@ public class ReviewOrderAppApi extends BaseController {
|
||||
}
|
||||
|
||||
/**
|
||||
* 完成复核确认(无待复核数量时可确认,同步出库明细并生成交接等,与 PC checkConfirm 一致)
|
||||
* 完成复核确认(同步出库明细、生成交接作业单,并自动下发交接类 PDA 任务 delive_task/taskType=7,与拣货完成后自动复核下发对齐)
|
||||
*/
|
||||
@ApiOperation("PDA 完成复核")
|
||||
@PostMapping("/completeCheck")
|
||||
|
||||
+4
-3
@@ -132,16 +132,17 @@ public class StockReceiptOrderAppApi extends BaseController {
|
||||
}
|
||||
|
||||
/**
|
||||
* 完成收货
|
||||
* 完成收货:生成上架单后自动创建上架类下发任务(delive_task.task_type=2,tracking_number=上架单号),
|
||||
* 作业人 operators_by/operators_name 默认为空;作业人在 {@code DeliveTaskAppApi#receive} 接收任务后写入。
|
||||
*/
|
||||
@ApiOperation("完成收货")
|
||||
@ApiOperation("完成收货(自动生成上架单及上架 delive_task,作业人须接收任务后才有)")
|
||||
@PostMapping("/completeReceipt")
|
||||
public AjaxResult completeReceipt(@RequestBody StockReceiptOrderDTO stockReceiptOrderDTO) {
|
||||
stockReceiptOrderApplicationService.updateInOrder(stockReceiptOrderDTO);
|
||||
return toAjax(stockReceiptOrderApplicationService.completeReceiptByApp(stockReceiptOrderDTO.getReceiptOrderId()));
|
||||
}
|
||||
|
||||
@ApiOperation("生成上架单")
|
||||
@ApiOperation("生成上架单(PDA 路径同完成收货:自动上架 delive_task,作业人接收后赋值)")
|
||||
@PostMapping("/genStockShelfOrder")
|
||||
public AjaxResult genStockShelfOrder(@RequestBody StockReceiptOrderDTO stockReceiptOrderDTO) {
|
||||
return toAjax(stockReceiptOrderApplicationService.genStockShelfOrder(stockReceiptOrderDTO.getReceiptOrderId()));
|
||||
|
||||
@@ -138,6 +138,78 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||
</if>
|
||||
</where>
|
||||
</sql>
|
||||
<!-- PDA 下发任务列表:与 del_flag、top_organization_id、warehouse_id、task_status、task_distribution_id 为主条件,不按 operators_by/tabType 过滤 -->
|
||||
<sql id="selectDeliveTaskPoApp1">
|
||||
<where>
|
||||
del_flag = 1
|
||||
<if test="taskNumber != null and taskNumber != ''">
|
||||
and task_number = #{taskNumber}
|
||||
</if>
|
||||
<if test="trackingNumber != null and trackingNumber != ''">
|
||||
and tracking_number = #{trackingNumber}
|
||||
</if>
|
||||
<if test="organizationId != null ">
|
||||
and organization_id = #{organizationId}
|
||||
</if>
|
||||
<if test="organizationIdList != null and organizationIdList.size() > 0">
|
||||
and organization_id in
|
||||
<foreach collection="organizationIdList" item="item" open="(" separator="," close=")">
|
||||
#{item}
|
||||
</foreach>
|
||||
</if>
|
||||
<if test="organizationName != null and organizationName != ''">
|
||||
and organization_name like concat('%', #{organizationName}, '%')
|
||||
</if>
|
||||
<if test="topOrganizationId != null ">
|
||||
and top_organization_id = #{topOrganizationId}
|
||||
</if>
|
||||
<if test="warehouseId != null ">
|
||||
and warehouse_id = #{warehouseId}
|
||||
</if>
|
||||
<if test="warehouseCode != null and warehouseCode != ''">
|
||||
and warehouse_code = #{warehouseCode}
|
||||
</if>
|
||||
<if test="warehouseName != null and warehouseName != ''">
|
||||
and warehouse_name like concat('%', #{warehouseName}, '%')
|
||||
</if>
|
||||
<if test="taskType != null and taskType != 0 ">
|
||||
and task_type = #{taskType}
|
||||
</if>
|
||||
<if test="taskType != null and taskType == 7 and (handoverQueryType == null or handoverQueryType == 1)">
|
||||
and EXISTS (SELECT 1 FROM handover_task_order hto WHERE hto.task_number = delive_task.tracking_number AND hto.del_flag = 1 AND hto.status = 1)
|
||||
</if>
|
||||
<if test="taskType != null and taskType == 7 and handoverQueryType == 2">
|
||||
and EXISTS (SELECT 1 FROM handover_task_order hto WHERE hto.task_number = delive_task.tracking_number AND hto.del_flag = 1 AND hto.status = 2)
|
||||
</if>
|
||||
<if test="taskStatus != null ">
|
||||
and task_status = #{taskStatus}
|
||||
</if>
|
||||
<if test="taskDistribution != null ">
|
||||
and task_distribution = #{taskDistribution}
|
||||
</if>
|
||||
<if test="taskDistributionTime != null ">
|
||||
and task_distribution_time = #{taskDistributionTime}
|
||||
</if>
|
||||
<if test="taskDistributionId != null ">
|
||||
and task_distribution_id = #{taskDistributionId}
|
||||
</if>
|
||||
<if test="taskDistributionName != null and taskDistributionName != ''">
|
||||
and task_distribution_name like concat('%', #{taskDistributionName}, '%')
|
||||
</if>
|
||||
<if test="operatorsName != null and operatorsName != ''">
|
||||
and operators_name like concat('%', #{operatorsName}, '%')
|
||||
</if>
|
||||
<if test="reassignTime != null ">
|
||||
and reassign_time = #{reassignTime}
|
||||
</if>
|
||||
<if test="reassignById != null ">
|
||||
and reassign_by_id = #{reassignById}
|
||||
</if>
|
||||
<if test="reassignByName != null and reassignByName != ''">
|
||||
and reassign_by_name like concat('%', #{reassignByName}, '%')
|
||||
</if>
|
||||
</where>
|
||||
</sql>
|
||||
<sql id="selectDeliveTaskPo2">
|
||||
<if test="organizationId != null ">
|
||||
and organization_id = #{organizationId}
|
||||
@@ -208,7 +280,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||
</select>
|
||||
<select id="queryListApp" parameterType="com.mhd.wms.domain.deliveTask.repository.todo.DeliveTaskDO" resultMap="DeliveTaskResult">
|
||||
<include refid="selectDeliveTaskPo"/>
|
||||
<include refid="selectDeliveTaskPo1"/>
|
||||
<include refid="selectDeliveTaskPoApp1"/>
|
||||
order by create_time desc
|
||||
</select>
|
||||
<select id="workbenchQuery" parameterType="java.lang.Long" resultMap="DeliveTaskResultSum">
|
||||
|
||||
@@ -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') <= #{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>
|
||||
Reference in New Issue
Block a user