Merge branch 'dev' into dev-ty1.2

# Conflicts:
#	mhd_wms/src/main/java/com/mhd/wms/domain/handoverTaskOrder/service/HandoverTaskOrderDomainService.java
#	mhd_wms/src/main/java/com/mhd/wms/domain/stockInOrder/repository/todo/StockInOrderDO.java
#	mhd_wms/src/main/java/com/mhd/wms/domain/stockOutOrder/repository/todo/StockOutOrderDO.java
#	mhd_wms/src/main/java/com/mhd/wms/interfaces/dto/stockInOrder/StockInOrderDTO.java
#	mhd_wms/src/main/java/com/mhd/wms/interfaces/dto/stockOutOrder/StockOutOrderDTO.java
This commit is contained in:
王奎兴
2026-08-13 16:46:09 +08:00
156 changed files with 6740 additions and 731 deletions
@@ -476,7 +476,8 @@ public class ReviewOrderApplicationService {
handoverTaskOrderDO.setShipperId(stockOutOrderPO.getShipperId());
handoverTaskOrderDO.setShipperName(stockOutOrderPO.getShipperName());
handoverTaskOrderDO.setSerialNumber(OrderSequence.getOrderCode("JJZYLS"));
handoverTaskOrderDO.setTaskNumber(OrderSequence.getOrderCode("JJZY"));
// handoverTaskOrderDO.setTaskNumber(OrderSequence.getOrderCode("JJZY"));
handoverTaskOrderDO.setTaskNumber("HD-"+stockOutOrderPO.getOutOrderNumber());
handoverTaskOrderDO.setStatus(1);
handoverTaskOrderDO.setOrderTypeCode(stockOutOrderPO.getOrderTypeCode());
handoverTaskOrderDO.setOrderTypeName(stockOutOrderPO.getOrderTypeName());
@@ -1302,4 +1303,4 @@ public class ReviewOrderApplicationService {
setter.accept(parsed);
}
}
}
}
@@ -0,0 +1,84 @@
package com.mhd.wms.application.service.signature;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.mhd.wms.domain.stockInOrder.entity.StockInOrder;
import com.mhd.wms.domain.stockInOrder.repository.facade.IStockInOrderService;
import com.mhd.wms.domain.stockOutOrder.entity.StockOutOrder;
import com.mhd.wms.domain.stockOutOrder.repository.facade.IStockOutOrderService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;
/**
* 签名自动任务:超过上架时间/出库交接时间 24 小时的订单自动设为已签名
*/
@Slf4j
@Service
public class SignatureAutoTaskService {
@Autowired
private IStockInOrderService stockInOrderService;
@Autowired
private IStockOutOrderService stockOutOrderService;
/** 每30分钟执行一次 */
@Scheduled(fixedDelay = 1800000)
public void autoSignature() {
Date cutoffTime = new Date(System.currentTimeMillis() - 24 * 60 * 60 * 1000L);
int inCount = autoSignInOrders(cutoffTime);
int outCount = autoSignOutOrders(cutoffTime);
if (inCount > 0 || outCount > 0) {
log.info("签名自动任务完成 - 入库签名:{}条,出库签名:{}条", inCount, outCount);
}
}
/**
* 入库单自动签名:completionTime 超过 24h 且 signatureStatus=1(待签名) 的设为已签名
*/
private int autoSignInOrders(Date cutoffTime) {
List<StockInOrder> list = stockInOrderService.list(
new LambdaQueryWrapper<StockInOrder>()
.eq(StockInOrder::getSignatureStatus, 1)
.eq(StockInOrder::getStatus, 5)
.lt(StockInOrder::getCompletionTime, cutoffTime)
.isNotNull(StockInOrder::getCompletionTime)
);
if (list.isEmpty()) return 0;
List<Long> ids = list.stream().map(StockInOrder::getInOrderId).collect(Collectors.toList());
stockInOrderService.update(new LambdaUpdateWrapper<StockInOrder>()
.in(StockInOrder::getInOrderId, ids)
.set(StockInOrder::getSignatureStatus, 2)
.set(StockInOrder::getSignatureTime, new Date())
.set(StockInOrder::getSignatureRemark, "系统自动签名:上架完成超过24小时")
);
return ids.size();
}
/**
* 出库单自动签名:completeTime 超过 24h 且 signatureStatus=1(待签名) 的设为已签名
*/
private int autoSignOutOrders(Date cutoffTime) {
List<StockOutOrder> list = stockOutOrderService.list(
new LambdaQueryWrapper<StockOutOrder>()
.eq(StockOutOrder::getSignatureStatus, 1)
.eq(StockOutOrder::getStatus, 9)
.lt(StockOutOrder::getCompleteTime, cutoffTime)
.isNotNull(StockOutOrder::getCompleteTime)
);
if (list.isEmpty()) return 0;
List<Long> ids = list.stream().map(StockOutOrder::getOutOrderId).collect(Collectors.toList());
stockOutOrderService.update(new LambdaUpdateWrapper<StockOutOrder>()
.in(StockOutOrder::getOutOrderId, ids)
.set(StockOutOrder::getSignatureStatus, 2)
.set(StockOutOrder::getSignatureTime, new Date())
.set(StockOutOrder::getSignatureRemark, "系统自动签名:出库交接完成超过24小时")
);
return ids.size();
}
}
@@ -160,7 +160,7 @@ public class StockInOrderApplicationService {
if (loginUser != null && loginUser.getUserPo() != null){
Long userOrganizationId = loginUser.getUserPo().getOrganizationId();
Long frontendOrganizationId = stockInOrderDO.getOrganizationId(); // 前端传递的 organizationId
// 数据权限:根据 organizationId 来设置查询权限
// 当前登录用户的 organizationId 为 2827 时,可查全部组织数据;其他组织只能查自己
if (userOrganizationId != null && userOrganizationId == 2827L) {
@@ -282,6 +282,94 @@ public class StockInOrderApplicationService {
return stockInOrderPOS;
}
/**
* PDA入库签名列表查询
*
* <p>参照简易模式快捷入库列表 {@link #queryList(StockInOrderDO)} 实现:
* 查询入库单状态为「已入库」(status=5) 的入库单列表,
* 支持按「作业任务人员」(workUserName) like 模糊查询以及其他常规查询条件。</p>
*/
public List<StockInOrderPO> querySignatureList(StockInOrderDO stockInOrderDO) {
LoginUser loginUser = SecurityUtils.getLoginUser();
if (loginUser != null && loginUser.getUserPo() != null) {
Long userOrganizationId = loginUser.getUserPo().getOrganizationId();
Long frontendOrganizationId = stockInOrderDO.getOrganizationId();
// 数据权限:与 queryList 保持一致
if (userOrganizationId != null && userOrganizationId == 2827L) {
if (frontendOrganizationId != null) {
stockInOrderDO.setOrganizationId(frontendOrganizationId);
stockInOrderDO.setTopOrganizationId(null);
} else {
stockInOrderDO.setOrganizationId(null);
stockInOrderDO.setTopOrganizationId(null);
}
} else {
if (frontendOrganizationId != null && userOrganizationId != null) {
if (!frontendOrganizationId.equals(userOrganizationId)) {
stockInOrderDO.setOrganizationId(userOrganizationId);
}
} else {
if (userOrganizationId != null) {
stockInOrderDO.setOrganizationId(userOrganizationId);
}
}
if (stockInOrderDO.getOrganizationId() == null) {
Long topOrganizationId = loginUser.getUserPo().getTopOrganizationId();
if (topOrganizationId != null && topOrganizationId != 1) {
stockInOrderDO.setTopOrganizationId(topOrganizationId);
}
} else {
stockInOrderDO.setTopOrganizationId(2827L);
}
}
// 默认仓库
if (stockInOrderDO.getWarehouseId() == null) {
AssociationWarehouseCacheDO associationWarehouseCacheDO =
SystemServiceCacheUtil.getAssociationWarehouseCache(loginUser.getUserid());
if (associationWarehouseCacheDO != null) {
stockInOrderDO.setWarehouseId(associationWarehouseCacheDO.getWarehouseId());
}
}
}
// 入库签名列表固定「已入库」状态过滤
// if (stockInOrderDO.getStatus() == null) {
// stockInOrderDO.setStatus(5);
// }
List<StockInOrderPO> stockInOrderPOS = stockInOrderDomainService.querySignatureList(stockInOrderDO);
// 状态/签名字段翻译,便于 PDA 端直接展示
for (StockInOrderPO stockInOrderPO : stockInOrderPOS) {
// 状态名称
Integer status = stockInOrderPO.getStatus();
if (status != null) {
if (status == 5) {
stockInOrderPO.setStatusName("已入库");
} else if (status == 4) {
stockInOrderPO.setStatusName("上架中");
} else if (status == 3) {
stockInOrderPO.setStatusName("收货中");
} else if (status == 2) {
stockInOrderPO.setStatusName("已审核");
} else if (status == 1) {
stockInOrderPO.setStatusName("已创建");
}
}
// 签名状态名称
Integer signatureStatus = stockInOrderPO.getSignatureStatus();
if (signatureStatus != null) {
if (signatureStatus == 1) {
stockInOrderPO.setSignatureStatusName("待签名");
} else if (signatureStatus == 2) {
stockInOrderPO.setSignatureStatusName("已签名");
}
}
}
return stockInOrderPOS;
}
/**
* 新增入库单
@@ -569,6 +657,11 @@ public class StockInOrderApplicationService {
/**
* 获取入库单详细信息
*
* <p>回显入库单基本信息、物料明细以及 PDA入库签名相关字段
* (签名状态、签名时间、签名图片、签名备注)。<br>
* 与 PDA入库签名列表({@link #querySignatureList(StockInOrderDO)})字段保持一致,
* 供 PDA 端「入库签名详情页 - 电子签名/物料明细」两个 tab 数据回显使用。</p>
*/
public StockInOrderPO getInfo(Long inOrderId)
{
@@ -646,6 +739,24 @@ public class StockInOrderApplicationService {
info.setMaterialDetailList(materialDetailList);
}
// PDA入库签名 - 签名状态名称翻译(待签名/已签名),便于 PDA 详情页直接展示
Integer signatureStatus = info.getSignatureStatus();
if (signatureStatus != null) {
if (signatureStatus == 1) {
info.setSignatureStatusName("待签名");
} else if (signatureStatus == 2) {
info.setSignatureStatusName("已签名");
}
}
// 入库单状态名称翻译
Integer status = info.getStatus();
if (status != null) {
if (status == 5) {
info.setStatusName("已入库");
}
}
return info;
}
@@ -668,6 +779,11 @@ public class StockInOrderApplicationService {
return b;
}
public Boolean remarkEasyMode(StockInOrderDO stockInOrderDO){
Boolean b = stockInOrderDomainService.remarkEasyMode(stockInOrderDO);
return b;
}
public Boolean updateQuantity( BigDecimal quantity, Long materialDetailId,BigDecimal area,
BigDecimal volume,BigDecimal weight){
Boolean result = false;
@@ -2807,4 +2923,31 @@ public class StockInOrderApplicationService {
}
stockInOrderService.updateById(entity);
}
/**
* PDA批量入库签名
*/
public AjaxResult batchSignature(com.mhd.wms.interfaces.dto.signature.BatchSignatureDTO dto) {
List<Long> inOrderIds = dto.getInOrderIds();
if (inOrderIds == null || inOrderIds.isEmpty()) {
return AjaxResult.error("请选择需要签名的入库单");
}
int success = 0;
Date now = new Date();
for (Long id : inOrderIds) {
StockInOrder entity = new StockInOrder();
entity.setInOrderId(id);
entity.setSignatureStatus(dto.getSignatureStatus() != null ? dto.getSignatureStatus() : 2);
entity.setSignatureTime(dto.getSignatureTime() != null ? dto.getSignatureTime() : now);
entity.setSignaturePic(dto.getSignaturePic());
if (dto.getEvidencePics() != null && !dto.getEvidencePics().isEmpty()) {
entity.setEvidencePics(String.join(",", dto.getEvidencePics()));
}
entity.setSignatureRemark(dto.getSignatureRemark());
stockInOrderService.updateById(entity);
success++;
}
return AjaxResult.success("批量签名成功,共" + success + "");
}
}
@@ -322,6 +322,60 @@ public class StockOutOrderApplicationService {
return stockOutOrderPOS;
}
/**
* PDA出库签名列表查询
*
* <p>参照简易模式快捷出库列表实现,默认 status=已出库(9),支持 workUserNameLike 模糊查询。</p>
*/
public List<StockOutOrderPO> querySignatureList(StockOutOrderDO stockOutOrderDO) {
LoginUser loginUser = SecurityUtils.getLoginUser();
if (loginUser != null && loginUser.getUserPo() != null) {
Long userOrganizationId = loginUser.getUserPo().getOrganizationId();
Long frontendOrganizationId = stockOutOrderDO.getOrganizationId();
if (userOrganizationId != null && userOrganizationId == 2827L) {
if (frontendOrganizationId != null) {
stockOutOrderDO.setOrganizationId(frontendOrganizationId);
stockOutOrderDO.setTopOrganizationId(null);
} else {
stockOutOrderDO.setOrganizationId(null);
stockOutOrderDO.setTopOrganizationId(null);
}
} else {
if (frontendOrganizationId != null && userOrganizationId != null) {
if (!frontendOrganizationId.equals(userOrganizationId)) {
stockOutOrderDO.setOrganizationId(userOrganizationId);
}
} else {
if (userOrganizationId != null) {
stockOutOrderDO.setOrganizationId(userOrganizationId);
}
}
if (stockOutOrderDO.getOrganizationId() == null) {
Long topOrganizationId = loginUser.getUserPo().getTopOrganizationId();
if (topOrganizationId != null && topOrganizationId != 1) {
stockOutOrderDO.setTopOrganizationId(topOrganizationId);
}
} else {
stockOutOrderDO.setTopOrganizationId(2827L);
}
}
}
if (stockOutOrderDO.getStatus() == null) {
stockOutOrderDO.setStatus(9);
}
List<StockOutOrderPO> list = stockOutOrderDomainService.querySignatureList(stockOutOrderDO);
for (StockOutOrderPO po : list) {
Integer ss = po.getSignatureStatus();
if (ss != null) {
po.setSignatureStatusName(ss == 1 ? "待签名" : ss == 2 ? "已签名" : null);
}
if (po.getStatus() != null && po.getStatus() == 9) {
po.setStatusName("已出库");
}
}
return list;
}
/**
* 新增出库单
@@ -430,6 +484,15 @@ public class StockOutOrderApplicationService {
List<DeliveryDetailsLink> list = deliveryDetailsLinkService.list(new LambdaQueryWrapper<DeliveryDetailsLink>().eq(DeliveryDetailsLink::getOrderNumber, stockOutOrderPO.getOutOrderNumber()));
stockOutOrderPO.setDeliveryDetailsLinkList(list);
// PDA出库签名 - 签名状态名称翻译
Integer signatureStatus = stockOutOrderPO.getSignatureStatus();
if (signatureStatus != null) {
stockOutOrderPO.setSignatureStatusName(signatureStatus == 1 ? "待签名" : signatureStatus == 2 ? "已签名" : null);
}
if (stockOutOrderPO.getStatus() != null && stockOutOrderPO.getStatus() == 9) {
stockOutOrderPO.setStatusName("已出库");
}
return stockOutOrderPO;
}
@@ -2047,4 +2110,30 @@ public class StockOutOrderApplicationService {
stockOutOrderService.updateById(entity);
}
/**
* PDA批量出库签名
*/
public AjaxResult batchSignature(com.mhd.wms.interfaces.dto.signature.BatchSignatureDTO dto) {
List<Long> outOrderIds = dto.getOutOrderIds();
if (outOrderIds == null || outOrderIds.isEmpty()) {
return AjaxResult.error("请选择需要签名的出库单");
}
int success = 0;
Date now = new Date();
for (Long id : outOrderIds) {
StockOutOrder entity = new StockOutOrder();
entity.setOutOrderId(id);
entity.setSignatureStatus(dto.getSignatureStatus() != null ? dto.getSignatureStatus() : 2);
entity.setSignatureTime(dto.getSignatureTime() != null ? dto.getSignatureTime() : now);
entity.setSignaturePic(dto.getSignaturePic());
if (dto.getEvidencePics() != null && !dto.getEvidencePics().isEmpty()) {
entity.setEvidencePics(String.join(",", dto.getEvidencePics()));
}
entity.setSignatureRemark(dto.getSignatureRemark());
stockOutOrderService.updateById(entity);
success++;
}
return AjaxResult.success("批量签名成功,共" + success + "");
}
}
@@ -328,7 +328,9 @@ public class HandoverTaskOrderDomainService {
if (soo != null && "1".equals(soo.getNeedDeclareFlag())) {
continue; // 需报关跳过
}
pushOms(handoverTaskOrderId);
if (soo != null && !"yang_pin_chu_ku".equals(soo.getBusinessType())) {
pushOms(handoverTaskOrderId);
}
}
HandoverTaskOrder handoverTaskOrder = handoverTaskOrderService.getById(handoverTaskOrderIds.get(0));
stockOutOrderService.update(null,new UpdateWrapper<StockOutOrder>().lambda().set(StockOutOrder::getBillingJson,handoverTaskOrderDO.getBillingJson()).eq(StockOutOrder::getOutOrderNumber,handoverTaskOrder.getOrderNumber()));
@@ -441,13 +443,17 @@ public class HandoverTaskOrderDomainService {
materialInventoryParamDO.setExpiryDate(materialInventoryPO.getExpiryDate());
materialInventoryParamDO.setType("4");
materialInventoryParamDO.setWarehouseId(materialInventoryPO.getWarehouseId());
materialInventoryService.kctzjl(materialInventoryParamDO, "出库", loginUser);
materialInventoryService.xgkc(materialInventoryParamDO);
MaterialInventoryOmsParamDO materialInventoryOmsParamDO = new MaterialInventoryOmsParamDO();
BeanUtils.copyProperties(materialInventoryParamDO, materialInventoryOmsParamDO);
materialInventoryOmsParamDO.setKctzType("出库");
materialInventoryOmsParamDO.setLoginUser(loginUser);
omsServiceFeign.omsEdit(materialInventoryOmsParamDO);
if (stockOutOrder != null && !"yang_pin_chu_ku".equals(stockOutOrder.getBusinessType())) {
materialInventoryService.kctzjl(materialInventoryParamDO,"出库",loginUser);
materialInventoryService.xgkc(materialInventoryParamDO);
//库存推送oms
omsServiceFeign.omsEdit(materialInventoryOmsParamDO);
}
}
}
}
@@ -399,6 +399,22 @@ public class InMaterialDetail extends BaseVOEntity {
@DateTimeFormat(pattern="yyyy-MM-dd")
private Date drinkDate;
@ApiModelProperty("来货验收是否合格;1 合格,0 不合格")
@Excel(name = "来货验收是否合格;1 合格,0 不合格")
private String arrivalAcceptQualified;
@ApiModelProperty("包装是否破损;1 破损,0 完好")
@Excel(name = "包装是否破损;1 破损,0 完好")
private String packageDamaged;
@ApiModelProperty("是否解冻 / 水渍;1 是,0 否")
@Excel(name = "是否解冻 / 水渍;1 是,0 否")
private String isThawWaterstain;
@ApiModelProperty("问题货是否已通知客户;1 已通知,0 未通知")
@Excel(name = "问题货是否已通知客户;1 已通知,0 未通知")
private String notifyCustomerAbnormal;
//订单行号
private String lineNumGw;
@@ -424,6 +424,22 @@ public class InMaterialDetailPO extends StockInOrderBasePO {
@DateTimeFormat(pattern="yyyy-MM-dd")
private Date drinkDate;
@ApiModelProperty("来货验收是否合格;1 合格,0 不合格")
@Excel(name = "来货验收是否合格;1 合格,0 不合格")
private String arrivalAcceptQualified;
@ApiModelProperty("包装是否破损;1 破损,0 完好")
@Excel(name = "包装是否破损;1 破损,0 完好")
private String packageDamaged;
@ApiModelProperty("是否解冻 / 水渍;1 是,0 否")
@Excel(name = "是否解冻 / 水渍;1 是,0 否")
private String isThawWaterstain;
@ApiModelProperty("问题货是否已通知客户;1 已通知,0 未通知")
@Excel(name = "问题货是否已通知客户;1 已通知,0 未通知")
private String notifyCustomerAbnormal;
//订单行号
private String lineNumGw;
//物料规格
@@ -390,6 +390,22 @@ public class InMaterialDetailDO extends StockInOrderBaseDO {
@DateTimeFormat(pattern="yyyy-MM-dd")
private Date drinkDate;
@ApiModelProperty("来货验收是否合格;1 合格,0 不合格")
@Excel(name = "来货验收是否合格;1 合格,0 不合格")
private String arrivalAcceptQualified;
@ApiModelProperty("包装是否破损;1 破损,0 完好")
@Excel(name = "包装是否破损;1 破损,0 完好")
private String packageDamaged;
@ApiModelProperty("是否解冻 / 水渍;1 是,0 否")
@Excel(name = "是否解冻 / 水渍;1 是,0 否")
private String isThawWaterstain;
@ApiModelProperty("问题货是否已通知客户;1 已通知,0 未通知")
@Excel(name = "问题货是否已通知客户;1 已通知,0 未通知")
private String notifyCustomerAbnormal;
//订单行号
private String lineNumGw;
//物料规格
@@ -405,7 +405,12 @@ public class OutMaterialDetailImpl extends ServiceImpl<OutMaterialDetailMapper,
stockOutOrderPO.setAlreadyAllocationQuantity(orderThisAssignIncrement);
stockOutOrderPO.setAllocationQuantity(totalAllocationQuantity);
//分配(修改库存)
xgkc(outMaterialDetailList,outOrderNumber,loginUser);
List<StockOutOrder> stockOutOrderList = stockOutOrderMapper.selectList(new QueryWrapper<StockOutOrder>().lambda()
.eq(StockOutOrder::getOutOrderNumber, outOrderNumber)
.eq(StockOutOrder::getDelFlag, 1));
if (!CollectionUtils.isEmpty(stockOutOrderList) && "yang_pin_chu_ku".equals(stockOutOrderList.get(0).getBusinessType())) {
xgkc(outMaterialDetailList,outOrderNumber,loginUser);
}
//保存物料明细信息
outMaterialDetailList.forEach(outMaterialDetail -> {
outMaterialDetail.setIsAllocated("1");
@@ -535,7 +540,12 @@ public class OutMaterialDetailImpl extends ServiceImpl<OutMaterialDetailMapper,
//保存物料明细信息
saveOrUpdateBatch(outMaterialDetailList);
//取消分配(修改库存)
qxfp(outMaterialDetailDOList,outOrderNumber,loginUser);
List<StockOutOrder> stockOutOrderList = stockOutOrderMapper.selectList(new QueryWrapper<StockOutOrder>().lambda()
.eq(StockOutOrder::getOutOrderNumber, outOrderNumber)
.eq(StockOutOrder::getDelFlag, 1));
if (!CollectionUtils.isEmpty(stockOutOrderList) && "yang_pin_chu_ku".equals(stockOutOrderList.get(0).getBusinessType())) {
qxfp(outMaterialDetailDOList,outOrderNumber,loginUser);
}
return stockOutOrderPO;
}
@@ -973,7 +983,14 @@ public class OutMaterialDetailImpl extends ServiceImpl<OutMaterialDetailMapper,
//保存物料明细信息
updateBatchById(outMaterialDetailList);
//取消分配
qxfp(outMaterialDetailDOList,outOrderNumber,loginUser);
List<StockOutOrder> stockOutOrderList = stockOutOrderMapper.selectList(new QueryWrapper<StockOutOrder>().lambda()
.eq(StockOutOrder::getOutOrderNumber, outOrderNumber)
.eq(StockOutOrder::getDelFlag, 1));
if (!CollectionUtils.isEmpty(stockOutOrderList) && "yang_pin_chu_ku".equals(stockOutOrderList.get(0).getBusinessType())) {
qxfp(outMaterialDetailDOList,outOrderNumber,loginUser);
}
return stockOutOrderPO;
}
@@ -1076,7 +1093,12 @@ public class OutMaterialDetailImpl extends ServiceImpl<OutMaterialDetailMapper,
List<OutMaterialDetailDO> children = outMaterialDetail.getChildren();
if (!CollectionUtils.isEmpty(children)) {
childrenqxfp(children,outOrderNumber,loginUser);
List<StockOutOrder> stockOutOrderList = stockOutOrderMapper.selectList(new QueryWrapper<StockOutOrder>().lambda()
.eq(StockOutOrder::getOutOrderNumber, outOrderNumber)
.eq(StockOutOrder::getDelFlag, 1));
if (!CollectionUtils.isEmpty(stockOutOrderList) && "yang_pin_chu_ku".equals(stockOutOrderList.get(0).getBusinessType())) {
childrenqxfp(children,outOrderNumber,loginUser);
}
}
}
}
@@ -870,7 +870,7 @@ public class PickingOrderDomainService {
handoverTaskOrderDO.setShipperId(pickingOrderPO.getShipperId());
handoverTaskOrderDO.setShipperName(pickingOrderPO.getShipperName());
handoverTaskOrderDO.setSerialNumber(OrderSequence.getOrderCode("JJZYLS"));
handoverTaskOrderDO.setTaskNumber(OrderSequence.getOrderCode("JJZY"));
handoverTaskOrderDO.setTaskNumber("HD-"+pickingOrderPO.getOutOrderNumber());
handoverTaskOrderDO.setStatus(1);
handoverTaskOrderDO.setOrderTypeCode(pickingOrderPO.getOrderTypeCode());
handoverTaskOrderDO.setOrderTypeName(pickingOrderPO.getOrderTypeName());
@@ -115,7 +115,8 @@ public class ReviewOrderDomainService {
Date now = new Date();
ReviewOrder header = new ReviewOrder();
header.setReviewOrderNumber(reviewOrderNumber);
// header.setReviewOrderNumber(reviewOrderNumber);
header.setReviewOrderNumber("RE-"+stockOutOrder.getOutOrderNumber());
header.setOutOrderId(stockOutOrder.getOutOrderId());
header.setOutOrderNumber(stockOutOrder.getOutOrderNumber());
header.setOrganizationId(stockOutOrder.getOrganizationId());
@@ -329,4 +330,4 @@ public class ReviewOrderDomainService {
}
return loginUser.getUsername();
}
}
}
@@ -2,6 +2,8 @@ package com.mhd.wms.domain.reviewOrder.repository.po;
import com.mhd.common.core.web.domain.BaseVOEntity;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@@ -18,24 +20,28 @@ import java.util.List;
@ApiModel(value = "复核单主表", description = "复核单主表展示")
public class ReviewOrderPO extends BaseVOEntity {
@JsonSerialize(using = ToStringSerializer.class)
@ApiModelProperty("复核单主键")
private Long reviewOrderId;
@ApiModelProperty("复核单号")
private String reviewOrderNumber;
@JsonSerialize(using = ToStringSerializer.class)
@ApiModelProperty("出库单ID")
private Long outOrderId;
@ApiModelProperty("出库单号")
private String outOrderNumber;
@JsonSerialize(using = ToStringSerializer.class)
@ApiModelProperty("组织ID")
private Long organizationId;
@ApiModelProperty("组织名称")
private String organizationName;
@JsonSerialize(using = ToStringSerializer.class)
@ApiModelProperty("一级组织ID")
private Long topOrganizationId;
@@ -50,6 +56,7 @@ public class ReviewOrderPO extends BaseVOEntity {
@ApiModelProperty("复核下发时间")
private Date issuedTime;
@JsonSerialize(using = ToStringSerializer.class)
@ApiModelProperty("仓库ID")
private Long warehouseId;
@@ -59,6 +66,7 @@ public class ReviewOrderPO extends BaseVOEntity {
@ApiModelProperty("仓库名称")
private String warehouseName;
@JsonSerialize(using = ToStringSerializer.class)
@ApiModelProperty("客户ID")
private Long customerId;
@@ -68,6 +76,7 @@ public class ReviewOrderPO extends BaseVOEntity {
@ApiModelProperty("客户名称")
private String customerName;
@JsonSerialize(using = ToStringSerializer.class)
@ApiModelProperty("货主ID")
private Long shipperId;
@@ -392,4 +392,22 @@ public class StockInOrder extends BaseVOEntity {
@ApiModelProperty("任务下发用户ID")
private String taskIssueUserId;
// ========== PDA入库签名字段 ==========
@ApiModelProperty("签名状态:1-待签名 2-已签名")
private Integer signatureStatus;
@ApiModelProperty("签名时间")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date signatureTime;
@ApiModelProperty("手写签名图片(base64/URL,单张)")
private String signaturePic;
@ApiModelProperty("拍照取证图片(逗号分隔多张OSS URL)")
private String evidencePics;
@ApiModelProperty("签名备注")
private String signatureRemark;
}
@@ -32,4 +32,14 @@ public interface StockInOrderMapper extends BaseMapper<StockInOrder>
StockInOrderPO selectByInOrderNumber(@Param("inOrderNumber") String inOrderNumber);
String queryWarehouseUserId(@Param("organizationId") Long organizationId, @Param("warehouseId") Long warehouseId, @Param("topOrganizationId") Long topOrganizationId);
void updateExecution(@Param("inOrderNumber") String inOrderNumber, @Param("remark") String remark);
/**
* 跨4张入库单表查询指定前缀+组织+仓库的所有入库单号用于取最大序号+1防止删单后单号重复
* 包含: reserve_stock_in_order, reservation_stock_in_order, execution_stock_in_order, WMS stock_in_order
*/
List<String> getMaxStockInOrderByPrefixAndOrgAndWarehouse(@Param("prefix") String prefix,
@Param("organizationId") Long organizationId,
@Param("warehouseId") Long warehouseId);
}
@@ -456,4 +456,25 @@ public class StockInOrderPO extends BaseVOEntity {
@ApiModelProperty("任务下发用户ID")
private String taskIssueUserId;
// ========== PDA入库签名字段 ==========
@ApiModelProperty("签名状态:1-待签名 2-已签名")
private Integer signatureStatus;
@ApiModelProperty("签名状态名称")
private String signatureStatusName;
@ApiModelProperty("签名时间")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date signatureTime;
@ApiModelProperty("手写签名图片(base64/URL")
private String signaturePic;
@ApiModelProperty("拍照取证图片(逗号分隔多张OSS URL)")
private String evidencePics;
@ApiModelProperty("签名备注")
private String signatureRemark;
}
@@ -449,6 +449,34 @@ public class StockInOrderDO extends BaseVOEntity {
@ApiModelProperty("任务移除用户ID")
private String removeUserId;
// ========== PDA入库签名字段 ==========
@ApiModelProperty("签名状态:1-待签名 2-已签名")
private Integer signatureStatus;
@ApiModelProperty("签名状态名称")
private String signatureStatusName;
@ApiModelProperty("签名时间")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date signatureTime;
@ApiModelProperty("手写签名图片(base64/URL")
private String signaturePic;
@ApiModelProperty("拍照取证图片(逗号分隔多张OSS URL)")
private String evidencePics;
@ApiModelProperty("签名备注")
private String signatureRemark;
/**
* PDA入库签名列表专用作业任务人员模糊查询字段 workUserName LIKE 同义
* 单独提供是为了避免和现有 workUserName精确/等值逻辑冲突
*/
@ApiModelProperty("作业任务人员模糊查询")
private String workUserNameLike;
@ApiModelProperty("是否返回物料明细(导出时传 true")
private Boolean needDetail;
}
@@ -1,5 +1,6 @@
package com.mhd.wms.domain.stockInOrder.service;
import cn.hutool.core.collection.CollectionUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import com.alibaba.fastjson2.JSONObject;
@@ -16,8 +17,11 @@ import com.mhd.common.core.utils.bean.BeanUtils;
import com.mhd.common.core.utils.uuid.IdGenerator;
import com.mhd.common.core.web.domain.AjaxResult;
import com.mhd.common.security.utils.SecurityUtils;
import com.mhd.system.api.OmsServiceFeign;
import com.mhd.system.api.SystemServiceFeign;
import com.mhd.system.api.domain.ElectronicSignatureSyncDTO;
import com.mhd.system.api.domain.PackDetailFeignPO;
import com.mhd.system.api.domain.WarehouseFeignPO;
import com.mhd.system.api.model.LoginUser;
import com.mhd.wms.domain.inMaterialDetail.entity.InMaterialDetail;
import com.mhd.wms.domain.inMaterialDetail.repository.facade.IInMaterialDetailService;
@@ -42,6 +46,7 @@ import com.mhd.wms.domain.shelfMaterialDetail.repository.po.ShelfMaterialDetailP
import com.mhd.wms.domain.shelfMaterialDetail.repository.todo.ShelfMaterialDetailDO;
import com.mhd.wms.domain.stockInOrder.entity.StockInOrder;
import com.mhd.wms.domain.stockInOrder.repository.facade.IStockInOrderService;
import com.mhd.wms.domain.stockInOrder.repository.mapper.StockInOrderMapper;
import com.mhd.wms.domain.stockInOrder.repository.po.StockInOrderPO;
import com.mhd.wms.domain.stockInOrder.repository.todo.StockInOrderDO;
import com.mhd.wms.domain.stockReceiptOrder.entity.StockReceiptOrder;
@@ -82,6 +87,8 @@ public class StockInOrderDomainService {
@Autowired
private IStockInOrderService stockInOrderService;
@Autowired
private StockInOrderMapper stockInOrderMapper;
@Autowired
private IInMaterialDetailService materialDetailService;
@Autowired
private StockReceiptOrderDomainService stockReceiptOrderDomainService;
@@ -97,6 +104,8 @@ public class StockInOrderDomainService {
private IMaterialWarehouseControlService materialWarehouseControlService;
@Resource
private SystemServiceFeign systemServiceFeign;
@Resource
private OmsServiceFeign omsServiceFeign;
@Autowired
private IReceiptMaterialDetailService receiptMaterialDetailService;
@Autowired
@@ -115,13 +124,99 @@ public class StockInOrderDomainService {
return stockInOrderService.queryList(stockInOrderDO);
}
/**
* PDA入库签名列表查询
*
* <p>参照简易模式快捷入库列表{@link #queryList(StockInOrderDO)}实现
* 默认查询 status=已入库(5) 的入库单同时支持作业任务人员模糊查询及其他业务字段</p>
*
* @param stockInOrderDO 查询条件
* @return 入库单列表
*/
public List<StockInOrderPO> querySignatureList(StockInOrderDO stockInOrderDO) {
// 入库签名列表固定按已入库状态过滤
if (stockInOrderDO.getStatus() == null) {
// stockInOrderDO.setStatus(5);
List<Integer> list = new ArrayList<>();
list.add(2);
list.add(3);
list.add(4);
list.add(5);
stockInOrderDO.setStatusList(list);
}
// 委托给 queryList复用 selectStockInOrderPo1 中现有的查询条件包括新加的 workUserNameLikesignatureStatus
return stockInOrderService.queryList(stockInOrderDO);
}
/**
* 从单号列表中提取最大序号
* 单号格式: prefix + 数字序号 RK260807001 prefix=RK260807, 序号=001
* 即使中间有删单也能保证序号递增不重复
*
* @param orderNumbers 匹配的单号列表
* @param prefixLength 前缀长度序号从该位置开始截取
* @return 最大序号值列表为空时返回0
*/
private int extractMaxSequenceNumber(List<String> orderNumbers, int prefixLength) {
if (orderNumbers == null || orderNumbers.isEmpty()) {
return 0;
}
int maxSeq = 0;
for (String orderNumber : orderNumbers) {
if (orderNumber != null && orderNumber.length() > prefixLength) {
try {
String seqStr = orderNumber.substring(prefixLength);
int seq = Integer.parseInt(seqStr);
if (seq > maxSeq) {
maxSeq = seq;
}
} catch (NumberFormatException e) {
// 序号部分非数字跳过
}
}
}
return maxSeq;
}
/**
* 新增入库单
*/
@Transactional(rollbackFor = Exception.class)
public Boolean insert(StockInOrderDO stockInOrderDO) {
stockInOrderDO.setInOrderNumber(OrderSequence.getOrderCode("RK"));
// stockInOrderDO.setInOrderNumber(OrderSequence.getOrderCode("RK"));
//设置入库单号
Long warehouseId = stockInOrderDO.getWarehouseId();
AjaxResult ajaxResult = systemServiceFeign.getWarehouseInfoByWarehouseId(warehouseId);
if (!"200".equals(String.valueOf(ajaxResult.get("code")))) {
throw new ServiceException("获取仓库信息失败");
}
//仓库信息
WarehouseFeignPO warehouseFeignPO = com.alibaba.fastjson.JSON.parseObject(com.alibaba.fastjson2.JSONObject.toJSONString(ajaxResult.get("data")), WarehouseFeignPO.class);
String orderNoGenerateRule = warehouseFeignPO.getOrderNoGenerateRule();
String prefix = warehouseFeignPO.getInOrderNoPrefix();
if (prefix == null || prefix.isEmpty()) {
prefix = "RK";
}
Long organizationId = stockInOrderDO.getOrganizationId();
Long warehouseIdForCount = stockInOrderDO.getWarehouseId();
if (orderNoGenerateRule != null && "0".equals(orderNoGenerateRule)) {
//日期累加: 前缀 + 当前日期yymmdd + 当天最大序号+1
String dateStr = new SimpleDateFormat("yyMMdd").format(new Date());
String datePrefix = prefix + dateStr;
List<String> orderNumbers = stockInOrderMapper.getMaxStockInOrderByPrefixAndOrgAndWarehouse(datePrefix, organizationId, warehouseIdForCount);
int maxSeq = extractMaxSequenceNumber(orderNumbers, datePrefix.length());
String seq = String.format("%03d", maxSeq + 1);
stockInOrderDO.setInOrderNumber(datePrefix + seq);
} else {
//历史累加: 前缀 + 历史最大序号+1
List<String> orderNumbers = stockInOrderMapper.getMaxStockInOrderByPrefixAndOrgAndWarehouse(prefix, organizationId, warehouseIdForCount);
int maxSeq = extractMaxSequenceNumber(orderNumbers, prefix.length());
String seq = String.format("%03d", maxSeq + 1);
stockInOrderDO.setInOrderNumber(prefix + seq);
}
// //设置默认值
// setDefaultValues(stockInOrderDO);
// //设置物料信息
@@ -146,8 +241,35 @@ public class StockInOrderDomainService {
*/
public Boolean batchInsert(List<StockInOrderDO> stockInOrderDOList) {
for (StockInOrderDO stockInOrderDO : stockInOrderDOList){
if (StringUtils.isBlank(stockInOrderDO.getInOrderNumber())){
stockInOrderDO.setInOrderNumber(OrderSequence.getOrderCode("RK"));
//设置入库单号
Long warehouseId = stockInOrderDO.getWarehouseId();
AjaxResult ajaxResult = systemServiceFeign.getWarehouseInfoByWarehouseId(warehouseId);
if (!"200".equals(String.valueOf(ajaxResult.get("code")))) {
throw new ServiceException("获取仓库信息失败");
}
//仓库信息
WarehouseFeignPO warehouseFeignPO = com.alibaba.fastjson.JSON.parseObject(com.alibaba.fastjson2.JSONObject.toJSONString(ajaxResult.get("data")), WarehouseFeignPO.class);
String orderNoGenerateRule = warehouseFeignPO.getOrderNoGenerateRule();
String prefix = warehouseFeignPO.getInOrderNoPrefix();
if (prefix == null || prefix.isEmpty()) {
prefix = "RK";
}
Long organizationId = stockInOrderDO.getOrganizationId();
Long warehouseIdForCount = stockInOrderDO.getWarehouseId();
if (orderNoGenerateRule != null && "0".equals(orderNoGenerateRule)) {
//日期累加: 前缀 + 当前日期yymmdd + 当天最大序号+1
String dateStr = new SimpleDateFormat("yyMMdd").format(new Date());
String datePrefix = prefix + dateStr;
List<String> orderNumbers = stockInOrderMapper.getMaxStockInOrderByPrefixAndOrgAndWarehouse(datePrefix, organizationId, warehouseIdForCount);
int maxSeq = extractMaxSequenceNumber(orderNumbers, datePrefix.length());
String seq = String.format("%03d", maxSeq + 1);
stockInOrderDO.setInOrderNumber(datePrefix + seq);
} else {
//历史累加: 前缀 + 历史最大序号+1
List<String> orderNumbers = stockInOrderMapper.getMaxStockInOrderByPrefixAndOrgAndWarehouse(prefix, organizationId, warehouseIdForCount);
int maxSeq = extractMaxSequenceNumber(orderNumbers, prefix.length());
String seq = String.format("%03d", maxSeq + 1);
stockInOrderDO.setInOrderNumber(prefix + seq);
}
// //设置物料信息
// setMaterialDetailInfo(stockInOrderDO);
@@ -403,6 +525,8 @@ public class StockInOrderDomainService {
if (StringUtils.isEmpty(inOrderNumber)) {
return;
}
StockInOrder stockInOrder = stockInOrderService.getOne(new QueryWrapper<StockInOrder>().lambda()
.eq(StockInOrder::getInOrderNumber, inOrderNumber)
.eq(StockInOrder::getDelFlag, 1)
@@ -410,6 +534,15 @@ public class StockInOrderDomainService {
if (stockInOrder == null || AUDIT_STATUS_PASS == stockInOrder.getAuditStatus()) {
return;
}
//生成电子签名
StockInOrderPO info = getInfo(stockInOrder.getInOrderId());
List<InMaterialDetail> materialDetails = materialDetailService.list(new QueryWrapper<InMaterialDetail>().lambda()
.eq(InMaterialDetail::getInOrderNumber, inOrderNumber)
.eq(InMaterialDetail::getDelFlag, 1));
genElectronicSignature(info,materialDetails);
StockInOrderDO auditDO = new StockInOrderDO();
auditDO.setInOrderIds(Collections.singletonList(stockInOrder.getInOrderId()));
auditDO.setAuditStatus(AUDIT_STATUS_PASS);
@@ -503,6 +636,52 @@ public class StockInOrderDomainService {
.in(StockInOrder::getInOrderId, stockInOrderDO.getInOrderIds()));
}
@Transactional(rollbackFor = Exception.class)
public Boolean remarkEasyMode(StockInOrderDO stockInOrderDO) {
LoginUser loginUser = SecurityUtils.getLoginUser();
String userRealName = loginUser.getUserPo() != null && loginUser.getUserPo().getUserName() != null
? loginUser.getUserPo().getUserName()
: (loginUser.getRealname() != null ? loginUser.getRealname() : loginUser.getUsername());
String inOrderNumber = stockInOrderDO.getInOrderNumber();
List<InMaterialDetailDO> materialDetailList = stockInOrderDO.getMaterialDetailList();
List<InMaterialDetailDO> receiptMaterialDetailList = materialDetailList.stream()
.filter(m -> m.getRemark() != null && m.getRemark() != "")
.collect(Collectors.toList());
String orderRemark = stockInOrderDO.getRemark();
if (receiptMaterialDetailList!=null && receiptMaterialDetailList.size()>0) {
for (InMaterialDetailDO inMaterialDetailDO : receiptMaterialDetailList) {
String notifyCustomerAbnormal = inMaterialDetailDO.getNotifyCustomerAbnormal();
String isThawWaterstain = inMaterialDetailDO.getIsThawWaterstain();
String packageDamaged = inMaterialDetailDO.getPackageDamaged();
String arrivalAcceptQualified = inMaterialDetailDO.getArrivalAcceptQualified();
String remark = inMaterialDetailDO.getRemark();
Long materialDetailId = inMaterialDetailDO.getMaterialDetailId();
InMaterialDetail inMaterialDetail = materialDetailService.getById(materialDetailId);
inMaterialDetail.setNotifyCustomerAbnormal(notifyCustomerAbnormal);
inMaterialDetail.setIsThawWaterstain(isThawWaterstain);
inMaterialDetail.setPackageDamaged(packageDamaged);
inMaterialDetail.setArrivalAcceptQualified(arrivalAcceptQualified);
inMaterialDetail.setRemark(remark);
orderRemark = orderRemark + "," + remark;
materialDetailService.updateById(inMaterialDetail);
}
}
if (orderRemark != null && !orderRemark.isEmpty()) {
String[] remarks = orderRemark.split(",");
List<String> list = Arrays.asList(remarks);
orderRemark = list.stream().distinct().collect(Collectors.joining(","));
stockInOrderService.update(null, new UpdateWrapper<StockInOrder>().lambda()
.set(StockInOrder::getRemark, orderRemark)
.eq(StockInOrder::getInOrderNumber, inOrderNumber)
.eq(StockInOrder::getDelFlag, 1));
stockInOrderMapper.updateExecution(inOrderNumber, orderRemark);
}
return true;
}
@Transactional(rollbackFor = Exception.class)
public Boolean receiptEasyMode(StockInOrderDO stockInOrderDO) {
LoginUser loginUser = SecurityUtils.getLoginUser();
@@ -592,7 +771,8 @@ public class StockInOrderDomainService {
stockShelfOrder = list.get(0);
} else {
BeanUtils.copyProperties(stockReceiptOrder, stockShelfOrder);
stockShelfOrder.setShelfOrderNumber(OrderSequence.getOrderCode("SJ"));
// stockShelfOrder.setShelfOrderNumber(OrderSequence.getOrderCode("SJ"));
stockShelfOrder.setShelfOrderNumber("SH-"+inOrderNumber);
stockShelfOrder.setBatchNo(batchNo);
stockShelfOrderService.save(stockShelfOrder);
}
@@ -861,7 +1041,8 @@ public class StockInOrderDomainService {
stockInOrderPOList.forEach(p -> {
StockReceiptOrderDO stockReceiptOrderDO = new StockReceiptOrderDO();
BeanUtils.copyProperties(p, stockReceiptOrderDO);
stockReceiptOrderDO.setReceiptOrderNumber(OrderSequence.getOrderCode("SH"));
stockReceiptOrderDO.setReceiptOrderNumber("RV-"+p.getInOrderNumber());
// stockReceiptOrderDO.setReceiptOrderNumber(OrderSequence.getOrderCode("SH"));
List<InMaterialDetailPO> inMaterialDetailPOs = inMaterialDetailListMap.get(p.getInOrderNumber());
if (!CollectionUtils.isEmpty(inMaterialDetailPOs)){
List<ReceiptMaterialDetailDO> receiptMaterialDetailDOList = new ArrayList<>();
@@ -1227,4 +1408,55 @@ public class StockInOrderDomainService {
public List<InMaterialDetailPO> queryNoticePrintDetail(StockInOrderDO stockInOrderDO) {
return stockInOrderService.queryNoticePrintDetail(stockInOrderDO);
}
/**
* 生成入库电子签名记录上架完成触发
*/
private void genElectronicSignature(StockInOrderPO stockShelfOrderPO, List<InMaterialDetail> shelfMaterialDetailList) {
try {
ElectronicSignatureSyncDTO dto = new ElectronicSignatureSyncDTO();
dto.setOrderId(stockShelfOrderPO.getInOrderId());
dto.setOrderNumber(stockShelfOrderPO.getInOrderNumber());
dto.setOrderType("IN");
dto.setOrganizationId(stockShelfOrderPO.getOrganizationId());
dto.setOrganizationName(stockShelfOrderPO.getOrganizationName());
dto.setTopOrganizationId(stockShelfOrderPO.getTopOrganizationId());
dto.setWarehouseId(stockShelfOrderPO.getWarehouseId());
dto.setWarehouseCode(stockShelfOrderPO.getWarehouseCode());
dto.setWarehouseName(stockShelfOrderPO.getWarehouseName());
List<ElectronicSignatureSyncDTO.MaterialDetailItem> items = new ArrayList<>();
if (CollectionUtil.isNotEmpty(shelfMaterialDetailList)) {
for (InMaterialDetail detail : shelfMaterialDetailList) {
ElectronicSignatureSyncDTO.MaterialDetailItem item = new ElectronicSignatureSyncDTO.MaterialDetailItem();
item.setMaterialBaseInfoId(detail.getMaterialBaseInfoId());
item.setMaterialCode(detail.getMaterialCode());
item.setMaterialName(detail.getMaterialName());
item.setQuantity(detail.getShelvesQuantity());
item.setUnitCode(detail.getUnitCode());
item.setUnitName(detail.getUnitName());
item.setBatchNumber(detail.getBatchNumber());
item.setLotNumber(detail.getLotNo());
item.setWarehouseId(detail.getWarehouseId());
item.setWarehouseCode(detail.getWarehouseCode());
item.setWarehouseName(detail.getWarehouseName());
item.setStorageSectionId(detail.getStorageSectionId());
item.setStorageSectionCode(detail.getStorageCode());
item.setStorageSectionName(detail.getStorageName());
item.setStorageLocationId(detail.getStorageLocationId());
item.setStorageLocationCode(detail.getStorageLocationCode());
item.setStorageLocationName(detail.getStorageLocationName());
item.setUniqueId(detail.getUniqueId());
items.add(item);
}
}
dto.setMaterialDetailList(items);
log.info("生成入库电子签名记录,订单号:{},物料条目数:{}", stockShelfOrderPO.getInOrderNumber(), items.size());
omsServiceFeign.saveSignature(dto);
} catch (Exception e) {
log.error("生成入库电子签名记录失败,订单号:{}", stockShelfOrderPO.getInOrderNumber(), e);
}
}
}
@@ -434,4 +434,22 @@ public class StockOutOrder extends BaseVOEntity {
@ApiModelProperty("任务下发用户ID")
private String taskIssueUserId;
// ========== PDA出库签名字段 ==========
@ApiModelProperty("签名状态:1-待签名 2-已签名")
private Integer signatureStatus;
@ApiModelProperty("签名时间")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date signatureTime;
@ApiModelProperty("手写签名图片(base64/URL,单张)")
private String signaturePic;
@ApiModelProperty("拍照取证图片(逗号分隔多张OSS URL)")
private String evidencePics;
@ApiModelProperty("签名备注")
private String signatureRemark;
}
@@ -46,4 +46,12 @@ public interface StockOutOrderMapper extends BaseMapper<StockOutOrder> {
public String getOpWhLoc(@Param("id") Long id);
public String getInLotNo(@Param("inOrderNumber") String inOrderNumber, @Param("baseId") Long baseId);
/**
* 跨4张入库单表查询指定前缀+组织+仓库的所有入库单号用于取最大序号+1防止删单后单号重复
* 包含: reserve_stock_in_order, reservation_stock_in_order, execution_stock_in_order, WMS stock_in_order
*/
List<String> getMaxStockOutOrderByPrefixAndOrgAndWarehouse(@Param("prefix") String prefix,
@Param("organizationId") Long organizationId,
@Param("warehouseId") Long warehouseId);
}
@@ -463,4 +463,28 @@ public class StockOutOrderPO extends BaseVOEntity {
@ApiModelProperty("任务下发用户ID")
private String taskIssueUserId;
// ========== PDA出库签名字段 ==========
@ApiModelProperty("签名状态:1-待签名 2-已签名")
private Integer signatureStatus;
@ApiModelProperty("签名状态名称")
private String signatureStatusName;
@ApiModelProperty("出库单状态名称")
private String statusName;
@ApiModelProperty("签名时间")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date signatureTime;
@ApiModelProperty("手写签名图片(base64/URL")
private String signaturePic;
@ApiModelProperty("拍照取证图片(逗号分隔多张OSS URL)")
private String evidencePics;
@ApiModelProperty("签名备注")
private String signatureRemark;
}
@@ -516,4 +516,26 @@ public class StockOutOrderDO extends BaseVOEntity {
@ApiModelProperty("是否返回物料明细(导出时传 true")
private Boolean needDetail;
// ========== PDA出库签名字段 ==========
@ApiModelProperty("签名状态:1-待签名 2-已签名")
private Integer signatureStatus;
@ApiModelProperty("签名时间")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date signatureTime;
@ApiModelProperty("手写签名图片(base64/URL")
private String signaturePic;
@ApiModelProperty("拍照取证图片(逗号分隔多张OSS URL)")
private String evidencePics;
@ApiModelProperty("签名备注")
private String signatureRemark;
/** PDA出库签名列表专用:作业任务人员模糊查询字段 */
@ApiModelProperty("作业任务人员模糊查询")
private String workUserNameLike;
}
@@ -1,5 +1,6 @@
package com.mhd.wms.domain.stockOutOrder.service;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.json.JSONUtil;
import com.alibaba.fastjson.JSON;
@@ -14,10 +15,9 @@ import com.mhd.common.core.utils.StringUtils;
import com.mhd.common.core.utils.bean.BeanUtils;
import com.mhd.common.core.web.domain.AjaxResult;
import com.mhd.common.security.utils.SecurityUtils;
import com.mhd.system.api.OmsServiceFeign;
import com.mhd.system.api.SystemServiceFeign;
import com.mhd.system.api.domain.BatchDetailFeignPO;
import com.mhd.system.api.domain.DeliveryDetailsLink;
import com.mhd.system.api.domain.PackDetailFeignPO;
import com.mhd.system.api.domain.*;
import com.mhd.system.api.model.LoginUser;
import com.mhd.wms.application.service.handoverTaskOrder.HandoverTaskOrderApplicationService;
import com.mhd.wms.application.service.pickingOrder.PickingOrderApplicationService;
@@ -88,6 +88,7 @@ import com.mhd.wms.domain.stockInOrder.repository.todo.StockInOrderDO;
import com.mhd.wms.domain.stockInOrder.service.StockInOrderDomainService;
import com.mhd.wms.domain.stockOutOrder.entity.StockOutOrder;
import com.mhd.wms.domain.stockOutOrder.repository.facade.IStockOutOrderService;
import com.mhd.wms.domain.stockOutOrder.repository.mapper.StockOutOrderMapper;
import com.mhd.wms.domain.stockOutOrder.repository.po.StockOutOrderPO;
import com.mhd.wms.domain.stockOutOrder.repository.todo.StockOutOrderDO;
import com.mhd.wms.domain.waveOrder.factorys.WaveOrderServiceFactory;
@@ -168,6 +169,8 @@ public class StockOutOrderDomainService {
@Autowired
private StockInOrderMapper stockInOrderMapper;
@Autowired
private StockOutOrderMapper stockOutOrderMapper;
@Autowired
private PickingOrderApplicationService pickingOrderApplicationService;
@Autowired
private HandoverTaskOrderApplicationService handoverTaskOrderApplicationService;
@@ -177,6 +180,8 @@ public class StockOutOrderDomainService {
private ReviewOrderMapper reviewOrderMapper;
@Autowired
private ReviewMaterialDetailMapper reviewMaterialDetailMapper;
@Autowired
private OmsServiceFeign omsServiceFeign;
/**
* 分页查询出库单列表
@@ -185,13 +190,89 @@ public class StockOutOrderDomainService {
return stockOutOrderService.queryList(stockOutOrderDO);
}
/**
* PDA出库签名列表查询默认 status=已出库(9)
*/
public List<StockOutOrderPO> querySignatureList(StockOutOrderDO stockOutOrderDO) {
if (stockOutOrderDO.getStatus() == null) {
stockOutOrderDO.setStatus(9);
}
return stockOutOrderService.queryList(stockOutOrderDO);
}
/**
* 从单号列表中提取最大序号
* 单号格式: prefix + 数字序号 RK260807001 prefix=RK260807, 序号=001
* 即使中间有删单也能保证序号递增不重复
*
* @param orderNumbers 匹配的单号列表
* @param prefixLength 前缀长度序号从该位置开始截取
* @return 最大序号值列表为空时返回0
*/
private int extractMaxSequenceNumber(List<String> orderNumbers, int prefixLength) {
if (orderNumbers == null || orderNumbers.isEmpty()) {
return 0;
}
int maxSeq = 0;
for (String orderNumber : orderNumbers) {
if (orderNumber != null && orderNumber.length() > prefixLength) {
try {
String seqStr = orderNumber.substring(prefixLength);
int seq = Integer.parseInt(seqStr);
if (seq > maxSeq) {
maxSeq = seq;
}
} catch (NumberFormatException e) {
// 序号部分非数字跳过
}
}
}
return maxSeq;
}
/**
* 新增出库单
*/
@Transactional(rollbackFor = Exception.class)
public Boolean insert(StockOutOrderDO stockOutOrderDO) {
stockOutOrderDO.setOutOrderNumber(OrderSequence.getOrderCode("CK"));
// stockOutOrderDO.setOutOrderNumber(OrderSequence.getOrderCode("CK"));
//设置单号
Long warehouseId = stockOutOrderDO.getWarehouseId();
AjaxResult ajaxResult = systemServiceFeign.getWarehouseInfoByWarehouseId(warehouseId);
if (!"200".equals(String.valueOf(ajaxResult.get("code")))) {
throw new ServiceException("获取仓库信息失败");
}
//仓库信息
WarehouseFeignPO warehouseFeignPO = com.alibaba.fastjson.JSON.parseObject(com.alibaba.fastjson2.JSONObject.toJSONString(ajaxResult.get("data")), WarehouseFeignPO.class);
String orderNoGenerateRule = warehouseFeignPO.getOrderNoGenerateRule();
String prefix = warehouseFeignPO.getOutOrderNoPrefix();
if ("yang_pin_chu_ku".equals(stockOutOrderDO.getBusinessType())) {
prefix = warehouseFeignPO.getSampleOutOrderNoPrefix();
}
if (prefix == null || prefix.isEmpty()) {
prefix = "CK";
}
Long organizationId = stockOutOrderDO.getOrganizationId();
Long warehouseIdForCount = stockOutOrderDO.getWarehouseId();
if (orderNoGenerateRule != null && "0".equals(orderNoGenerateRule)) {
//日期累加: 前缀 + 当前日期yymmdd + 当天最大序号+1
String dateStr = new SimpleDateFormat("yyMMdd").format(new Date());
String datePrefix = prefix + dateStr;
List<String> orderNumbers = stockOutOrderMapper.getMaxStockOutOrderByPrefixAndOrgAndWarehouse(datePrefix, organizationId, warehouseIdForCount);
int maxSeq = extractMaxSequenceNumber(orderNumbers, datePrefix.length());
String seq = String.format("%03d", maxSeq + 1);
stockOutOrderDO.setOutOrderNumber(datePrefix + seq);
} else {
//历史累加: 前缀 + 历史最大序号+1
List<String> orderNumbers = stockOutOrderMapper.getMaxStockOutOrderByPrefixAndOrgAndWarehouse(prefix, organizationId, warehouseIdForCount);
int maxSeq = extractMaxSequenceNumber(orderNumbers, prefix.length());
String seq = String.format("%03d", maxSeq + 1);
stockOutOrderDO.setOutOrderNumber(prefix + seq);
}
//设置物料信息
//setMaterialDetailInfo(stockOutOrderDO);
//统计种类
@@ -219,8 +300,38 @@ public class StockOutOrderDomainService {
@Transactional(rollbackFor = Exception.class)
public Boolean batchInsert(List<StockOutOrderDO> stockOutOrderDOList) {
for (StockOutOrderDO stockOutOrderDO : stockOutOrderDOList){
if (StringUtils.isBlank(stockOutOrderDO.getOutOrderNumber())){
stockOutOrderDO.setOutOrderNumber(OrderSequence.getOrderCode("CK"));
//设置单号
Long warehouseId = stockOutOrderDO.getWarehouseId();
AjaxResult ajaxResult = systemServiceFeign.getWarehouseInfoByWarehouseId(warehouseId);
if (!"200".equals(String.valueOf(ajaxResult.get("code")))) {
throw new ServiceException("获取仓库信息失败");
}
//仓库信息
WarehouseFeignPO warehouseFeignPO = com.alibaba.fastjson.JSON.parseObject(com.alibaba.fastjson2.JSONObject.toJSONString(ajaxResult.get("data")), WarehouseFeignPO.class);
String orderNoGenerateRule = warehouseFeignPO.getOrderNoGenerateRule();
String prefix = warehouseFeignPO.getOutOrderNoPrefix();
if ("yang_pin_chu_ku".equals(stockOutOrderDO.getBusinessType())) {
prefix = warehouseFeignPO.getSampleOutOrderNoPrefix();
}
if (prefix == null || prefix.isEmpty()) {
prefix = "CK";
}
Long organizationId = stockOutOrderDO.getOrganizationId();
Long warehouseIdForCount = stockOutOrderDO.getWarehouseId();
if (orderNoGenerateRule != null && "0".equals(orderNoGenerateRule)) {
//日期累加: 前缀 + 当前日期yymmdd + 当天最大序号+1
String dateStr = new SimpleDateFormat("yyMMdd").format(new Date());
String datePrefix = prefix + dateStr;
List<String> orderNumbers = stockOutOrderMapper.getMaxStockOutOrderByPrefixAndOrgAndWarehouse(datePrefix, organizationId, warehouseIdForCount);
int maxSeq = extractMaxSequenceNumber(orderNumbers, datePrefix.length());
String seq = String.format("%03d", maxSeq + 1);
stockOutOrderDO.setOutOrderNumber(datePrefix + seq);
} else {
//历史累加: 前缀 + 历史最大序号+1
List<String> orderNumbers = stockOutOrderMapper.getMaxStockOutOrderByPrefixAndOrgAndWarehouse(prefix, organizationId, warehouseIdForCount);
int maxSeq = extractMaxSequenceNumber(orderNumbers, prefix.length());
String seq = String.format("%03d", maxSeq + 1);
stockOutOrderDO.setOutOrderNumber(prefix + seq);
}
//设置物料信息
setMaterialDetailInfo(stockOutOrderDO);
@@ -785,7 +896,8 @@ public class StockOutOrderDomainService {
PickingOrderDO pickingOrderDO = new PickingOrderDO();
BeanUtils.copyProperties(p, pickingOrderDO);
pickingOrderDO.setOrderNumber(p.getOutOrderNumber());
pickingOrderDO.setPickingOrderNumber(OrderSequence.getOrderCode("JH"));
// pickingOrderDO.setPickingOrderNumber(OrderSequence.getOrderCode("JH"));
pickingOrderDO.setPickingOrderNumber("PK-"+p.getOutOrderNumber());
pickingOrderDO.setQuantity(p.getAllocationQuantity());
if (pickingOrderDO.getWarehouseId() == null && p.getWarehouseId() != null) {
pickingOrderDO.setWarehouseId(p.getWarehouseId());
@@ -1089,6 +1201,8 @@ public class StockOutOrderDomainService {
handoverTaskOrderDO.setHandoverTaskOrderIds(handoverTaskOrderId);
handoverTaskOrderDomainService.completeHandover(handoverTaskOrderDO);
}
//出库交接后生成电子签名记录
genElectronicSignature(stockOutOrder);
return Boolean.TRUE;
}
@@ -1122,7 +1236,7 @@ public class StockOutOrderDomainService {
PickingOrderDO pickingOrderDO = new PickingOrderDO();
BeanUtils.copyProperties(p, pickingOrderDO);
pickingOrderDO.setOrderNumber(p.getOutOrderNumber());
pickingOrderDO.setPickingOrderNumber(OrderSequence.getOrderCode("JH"));
pickingOrderDO.setPickingOrderNumber("PK-"+p.getOutOrderNumber());
pickingOrderDO.setQuantity(p.getAllocationQuantity());
if (pickingOrderDO.getWarehouseId() == null && p.getWarehouseId() != null) {
pickingOrderDO.setWarehouseId(p.getWarehouseId());
@@ -2038,7 +2152,7 @@ public class StockOutOrderDomainService {
handoverTaskOrderDO.setShipperId(stockOutOrderPO.getShipperId());
handoverTaskOrderDO.setShipperName(stockOutOrderPO.getShipperName());
handoverTaskOrderDO.setSerialNumber(OrderSequence.getOrderCode("JJZYLS"));
handoverTaskOrderDO.setTaskNumber(OrderSequence.getOrderCode("JJZY"));
handoverTaskOrderDO.setTaskNumber("HD-"+stockOutOrderPO.getOutOrderNumber());
handoverTaskOrderDO.setStatus(1);
handoverTaskOrderDO.setOrderTypeCode(stockOutOrderPO.getOrderTypeCode());
handoverTaskOrderDO.setOrderTypeName(stockOutOrderPO.getOrderTypeName());
@@ -2373,4 +2487,106 @@ public class StockOutOrderDomainService {
public List<OutMaterialDetailPO> queryOutStockNoticePrintDetailGF(StockOutOrderDTO stockOutOrderDTO) {
return stockOutOrderService.queryOutStockNoticePrintDetailGF(stockOutOrderDTO);
}
/**
* 生成出库电子签名记录出库交接触发StockOutOrder实体入口
*/
private void genElectronicSignature(StockOutOrder stockOutOrder) {
try {
StockOutOrderDO queryDO = new StockOutOrderDO();
queryDO.setOutOrderNumber(stockOutOrder.getOutOrderNumber());
List<StockOutOrderPO> poList = stockOutOrderService.queryList(queryDO);
if (CollectionUtil.isEmpty(poList)) {
log.warn("生成出库电子签名记录失败,未查到出库单:{}", stockOutOrder.getOutOrderNumber());
return;
}
genElectronicSignature(poList.get(0));
} catch (Exception e) {
log.error("生成出库电子签名记录失败,订单号:{}", stockOutOrder.getOutOrderNumber(), e);
}
}
/**
* 生成出库电子签名记录
*/
private void genElectronicSignature(StockOutOrderPO stockOutOrderPO) {
try {
// 查询出库物料明细
List<OutMaterialDetail> detailList = outMaterialDetailService.list(
new LambdaQueryWrapper<OutMaterialDetail>()
.eq(OutMaterialDetail::getOutOrderNumber, stockOutOrderPO.getOutOrderNumber()));
ElectronicSignatureSyncDTO dto = new ElectronicSignatureSyncDTO();
dto.setOrderId(stockOutOrderPO.getOutOrderId());
dto.setOrderNumber(stockOutOrderPO.getOutOrderNumber());
dto.setOrderType("OUT");
dto.setOrganizationId(stockOutOrderPO.getOrganizationId());
dto.setOrganizationName(stockOutOrderPO.getOrganizationName());
dto.setTopOrganizationId(stockOutOrderPO.getTopOrganizationId());
dto.setWarehouseId(stockOutOrderPO.getWarehouseId());
dto.setWarehouseCode(stockOutOrderPO.getWarehouseCode());
dto.setWarehouseName(stockOutOrderPO.getWarehouseName());
List<ElectronicSignatureSyncDTO.MaterialDetailItem> items = new ArrayList<>();
if (org.springframework.util.CollectionUtils.isEmpty(detailList)) {
// 回退直接通过 IOutMaterialDetailService 查询 PO 列表
OutMaterialDetailDO queryDO = new OutMaterialDetailDO();
queryDO.setOutOrderNumber(stockOutOrderPO.getOutOrderNumber());
List<OutMaterialDetailPO> poList = outMaterialDetailService.queryList(queryDO);
if (!org.springframework.util.CollectionUtils.isEmpty(poList)) {
for (OutMaterialDetailPO detail : poList) {
ElectronicSignatureSyncDTO.MaterialDetailItem item = new ElectronicSignatureSyncDTO.MaterialDetailItem();
item.setMaterialBaseInfoId(detail.getMaterialBaseInfoId());
item.setMaterialCode(detail.getMaterialCode());
item.setMaterialName(detail.getMaterialName());
item.setQuantity(detail.getCheckQuantity());
item.setUnitCode(detail.getUnitCode());
item.setUnitName(detail.getUnitName());
item.setBatchNumber(detail.getBatchNumber());
item.setLotNumber(detail.getLotNo());
item.setWarehouseId(detail.getWarehouseId());
item.setWarehouseCode(detail.getWarehouseCode());
item.setWarehouseName(detail.getWarehouseName());
item.setStorageSectionId(detail.getStorageSectionId());
item.setStorageSectionCode(detail.getStorageCode());
item.setStorageSectionName(detail.getStorageName());
item.setStorageLocationId(detail.getStorageLocationId());
item.setStorageLocationCode(detail.getStorageLocationCode());
item.setStorageLocationName(detail.getStorageLocationName());
item.setUniqueId(detail.getUniqueId());
items.add(item);
}
}
} else {
for (OutMaterialDetail detail : detailList) {
ElectronicSignatureSyncDTO.MaterialDetailItem item = new ElectronicSignatureSyncDTO.MaterialDetailItem();
item.setMaterialBaseInfoId(detail.getMaterialBaseInfoId());
item.setMaterialCode(detail.getMaterialCode());
item.setMaterialName(detail.getMaterialName());
item.setQuantity(detail.getCheckQuantity());
item.setUnitCode(detail.getUnitCode());
item.setUnitName(detail.getUnitName());
item.setBatchNumber(detail.getBatchNumber());
item.setLotNumber(detail.getLotNo());
item.setWarehouseId(detail.getWarehouseId());
item.setWarehouseCode(detail.getWarehouseCode());
item.setWarehouseName(detail.getWarehouseName());
item.setStorageSectionId(detail.getStorageSectionId());
item.setStorageSectionCode(detail.getStorageCode());
item.setStorageSectionName(detail.getStorageName());
item.setStorageLocationId(detail.getStorageLocationId());
item.setStorageLocationCode(detail.getStorageLocationCode());
item.setStorageLocationName(detail.getStorageLocationName());
item.setUniqueId(detail.getUniqueId());
items.add(item);
}
}
dto.setMaterialDetailList(items);
log.info("生成出库电子签名记录,订单号:{},物料条目数:{}", stockOutOrderPO.getOutOrderNumber(), items.size());
omsServiceFeign.saveSignature(dto);
} catch (Exception e) {
log.error("生成出库电子签名记录失败,订单号:{}", stockOutOrderPO.getOutOrderNumber(), e);
}
}
}
@@ -173,7 +173,7 @@ public class StockReceiptOrderDomainService {
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.setReceiptOrderNumber("RV-"+stockReceiptOrderDO.getInOrderNumber());
stockReceiptOrder.setCreateBy(loginUser.getUserid());
stockReceiptOrder.setCreateByName(userRealName);
stockReceiptOrder.setCreateTime(new Date());
@@ -1583,7 +1583,7 @@ public class StockReceiptOrderDomainService {
} else {
stockShelfOrderDO.setTaskDistributionTime(null);
}
stockShelfOrderDO.setShelfOrderNumber(OrderSequence.getOrderCode("SJ"));
stockShelfOrderDO.setShelfOrderNumber("SH-"+stockReceiptOrderPO.getInOrderNumber());
stockShelfOrderDO.setStatus(1);
//本次上架数量
BigDecimal receiptQuantity = BigDecimal.ZERO;
@@ -22,6 +22,7 @@ import com.mhd.common.core.web.domain.AjaxResult;
import com.mhd.common.security.utils.SecurityUtils;
import com.mhd.system.api.OmsServiceFeign;
import com.mhd.system.api.SystemServiceFeign;
import com.mhd.system.api.domain.ElectronicSignatureSyncDTO;
import com.mhd.system.api.domain.ContainerFeignPO;
import com.mhd.system.api.domain.MaterialInventoryOmsParamDO;
import com.mhd.system.api.model.LoginUser;
@@ -186,7 +187,8 @@ public class StockShelfOrderDomainService {
BeanUtils.copyProperties(stockShelfOrderDO, stockShelfOrder, "createBy","createByName","createTime",
"updateBy","updateByName","updateTime");
if (StringUtils.isBlank(stockShelfOrder.getShelfOrderNumber())){
stockShelfOrder.setShelfOrderNumber(OrderSequence.getOrderCode("SJ"));
// stockShelfOrder.setShelfOrderNumber(OrderSequence.getOrderCode("SJ"));
stockShelfOrder.setShelfOrderNumber("SH-"+stockShelfOrder.getInOrderNumber());
}
// PDA收货完成=是否下发是(1)PC收货完成/无单收货/整单收货=是否下发否(2)DO未设置时默认2
stockShelfOrder.setTaskDistribution(stockShelfOrderDO.getTaskDistribution() != null ? stockShelfOrderDO.getTaskDistribution() : 2);
@@ -877,6 +879,8 @@ public class StockShelfOrderDomainService {
}
if (businessOrderNumber != null) stockShelfOrderService.updateOmsReserveOrder(businessOrderNumber,
shelvesQuantity == null ? null : shelvesQuantity);
//生成电子签名记录
// genElectronicSignature(stockShelfOrderPO, shelfMaterialDetailList);
return true;
}
@@ -2016,4 +2020,54 @@ public class StockShelfOrderDomainService {
}
}
}
/**
* 生成入库电子签名记录上架完成触发
*/
private void genElectronicSignature(StockShelfOrderPO stockShelfOrderPO, List<ShelfMaterialDetail> shelfMaterialDetailList) {
try {
ElectronicSignatureSyncDTO dto = new ElectronicSignatureSyncDTO();
dto.setOrderId(stockShelfOrderPO.getShelfOrderId());
dto.setOrderNumber(stockShelfOrderPO.getShelfOrderNumber());
dto.setOrderType("IN");
dto.setOrganizationId(stockShelfOrderPO.getOrganizationId());
dto.setOrganizationName(stockShelfOrderPO.getOrganizationName());
dto.setTopOrganizationId(stockShelfOrderPO.getTopOrganizationId());
dto.setWarehouseId(stockShelfOrderPO.getWarehouseId());
dto.setWarehouseCode(stockShelfOrderPO.getWarehouseCode());
dto.setWarehouseName(stockShelfOrderPO.getWarehouseName());
List<ElectronicSignatureSyncDTO.MaterialDetailItem> items = new ArrayList<>();
if (CollectionUtil.isNotEmpty(shelfMaterialDetailList)) {
for (ShelfMaterialDetail detail : shelfMaterialDetailList) {
ElectronicSignatureSyncDTO.MaterialDetailItem item = new ElectronicSignatureSyncDTO.MaterialDetailItem();
item.setMaterialBaseInfoId(detail.getMaterialBaseInfoId());
item.setMaterialCode(detail.getMaterialCode());
item.setMaterialName(detail.getMaterialName());
item.setQuantity(detail.getShelvesQuantity());
item.setUnitCode(detail.getUnitCode());
item.setUnitName(detail.getUnitName());
item.setBatchNumber(detail.getBatchNumber());
item.setLotNumber(detail.getLotNumber());
item.setWarehouseId(detail.getWarehouseId());
item.setWarehouseCode(detail.getWarehouseCode());
item.setWarehouseName(detail.getWarehouseName());
item.setStorageSectionId(detail.getStorageSectionId());
item.setStorageSectionCode(detail.getStorageCode());
item.setStorageSectionName(detail.getStorageName());
item.setStorageLocationId(detail.getStorageLocationId());
item.setStorageLocationCode(detail.getStorageLocationCode());
item.setStorageLocationName(detail.getStorageLocationName());
item.setUniqueId(detail.getUniqueId());
items.add(item);
}
}
dto.setMaterialDetailList(items);
log.info("生成入库电子签名记录,订单号:{},物料条目数:{}", stockShelfOrderPO.getShelfOrderNumber(), items.size());
omsServiceFeign.saveSignature(dto);
} catch (Exception e) {
log.error("生成入库电子签名记录失败,订单号:{}", stockShelfOrderPO.getShelfOrderNumber(), e);
}
}
}
@@ -211,7 +211,7 @@ public class WaveOrderDomainService {
PickingOrderDO pickingOrderDO = new PickingOrderDO();
BeanUtils.copyProperties(p, pickingOrderDO);
pickingOrderDO.setOrderNumber(p.getWaveOrderNumber());
pickingOrderDO.setPickingOrderNumber(OrderSequence.getOrderCode("JH"));
pickingOrderDO.setPickingOrderNumber("PK-"+p.getWaveOrderNumber());
pickingOrderDO.setQuantity(p.getAllocationQuantity());
pickingOrderDO.setWeightLimit(p.getWeightLimit());
pickingOrderDO.setVolumeLimit(p.getVolumeLimit());
@@ -329,4 +329,4 @@ public class WaveOrderDomainService {
}
return result;
}
}
}
@@ -387,6 +387,23 @@ public class InMaterialDetailDTO extends BaseVOEntity {
@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd")
@DateTimeFormat(pattern="yyyy-MM-dd")
private Date drinkDate;
@ApiModelProperty("来货验收是否合格;1 合格,0 不合格")
@Excel(name = "来货验收是否合格;1 合格,0 不合格")
private String arrivalAcceptQualified;
@ApiModelProperty("包装是否破损;1 破损,0 完好")
@Excel(name = "包装是否破损;1 破损,0 完好")
private String packageDamaged;
@ApiModelProperty("是否解冻 / 水渍;1 是,0 否")
@Excel(name = "是否解冻 / 水渍;1 是,0 否")
private String isThawWaterstain;
@ApiModelProperty("问题货是否已通知客户;1 已通知,0 未通知")
@Excel(name = "问题货是否已通知客户;1 已通知,0 未通知")
private String notifyCustomerAbnormal;
//订单行号
private String lineNumGw;
//物料规格
@@ -0,0 +1,44 @@
package com.mhd.wms.interfaces.dto.signature;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.util.Date;
import java.util.List;
/**
* PDA批量签名请求DTO
*
* <p>支持四种签名方式电子签名附件上传扫二维码系统自动</p>
*/
@Data
public class BatchSignatureDTO {
@ApiModelProperty("入库单ID列表")
private List<Long> inOrderIds;
@ApiModelProperty("出库单ID列表")
private List<Long> outOrderIds;
@ApiModelProperty("签名状态:2-已签名(PDA端直接传2表示签完)")
private Integer signatureStatus;
@ApiModelProperty("签名时间(PDA端可传当前时间)")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date signatureTime;
@ApiModelProperty("手写签名图片(base64或URL,单张)")
private String signaturePic;
@ApiModelProperty("拍照取证图片列表(base64或URL,多张)")
private List<String> evidencePics;
@ApiModelProperty("签名备注")
private String signatureRemark;
@ApiModelProperty("签名方式:1-扫描二维码 2-电子签名 3-打印手写签名 4-超时自动签名")
private Integer signatureMode;
}
@@ -448,4 +448,24 @@ public class StockInOrderDTO extends StockInOrderBaseDTO {
@ApiModelProperty("是否返回物料明细(导出时传 true")
private Boolean needDetail;
// ========== PDA入库签名字段 ==========
@ApiModelProperty("签名状态:1-待签名 2-已签名")
private Integer signatureStatus;
@ApiModelProperty("签名时间起")
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date signatureTimeFrom;
@ApiModelProperty("签名时间止")
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date signatureTimeTo;
/**
* PDA入库签名列表专用作业任务人员模糊查询字段
*/
@ApiModelProperty("作业任务人员(模糊查询)")
private String workUserNameLike;
}
@@ -505,4 +505,12 @@ public class StockOutOrderDTO extends StockOutOrderBaseDTO {
@ApiModelProperty("是否返回物料明细(导出时传 true")
private Boolean needDetail;
// ========== PDA出库签名字段 ==========
@ApiModelProperty("签名状态:1-待签名 2-已签名")
private Integer signatureStatus;
/** PDA出库签名列表专用:作业任务人员模糊查询字段 */
@ApiModelProperty("作业任务人员(模糊查询)")
private String workUserNameLike;
}
@@ -64,6 +64,25 @@ public class StockInOrderApi extends BaseController {
return getDataTable(list);
}
/**
* PDA入库签名列表查询
*
* <p>查询入库单状态已入库(status=5) 的入库单列表
* 同时支持作业任务人员(workUserName) like 模糊查询
* 参照简易模式快捷入库列表实现响应中包含签名相关字段签名状态签名时间签名图片签名备注</p>
*/
@ApiOperation("PDA入库签名列表查询")
@GetMapping("/signatureList")
public TableDataInfo signatureList(StockInOrderDTO stockInOrderDTO) {
//转换实体
StockInOrderDO stockInOrderDO = stockInOrderAssembler.toDO(stockInOrderDTO);
startPage();
List<StockInOrderPO> list = stockInOrderApplicationService.querySignatureList(stockInOrderDO);
return getDataTable(list);
}
/**
* 编辑入库单
*/
@@ -219,6 +238,28 @@ public class StockInOrderApi extends BaseController {
return AjaxResult.success(stockInOrderApplicationService.receiptEasyMode(stockInOrderDO));
}
/**
* 审核入库单
*/
@ApiOperation("pda简易模式调整备注")
@PostMapping(value = "/remarkEasyMode")
public AjaxResult remarkEasyMode(@RequestBody StockInOrderDTO stockInOrderDTO) {
StockInOrderDO stockInOrderDO = stockInOrderAssembler.toDO(stockInOrderDTO);
List<InMaterialDetailDTO> materialDetailList = stockInOrderDTO.getMaterialDetailList();
if (materialDetailList != null && !materialDetailList.isEmpty()) {
List<InMaterialDetailDO> inMaterialDetailDOList = new ArrayList<>();
for (InMaterialDetailDTO dto : materialDetailList) {
InMaterialDetailDO detailDO = new InMaterialDetailDO();
BeanUtils.copyProperties(dto, detailDO);
inMaterialDetailDOList.add(detailDO);
}
stockInOrderDO.setMaterialDetailList(inMaterialDetailDOList);
}
return AjaxResult.success(stockInOrderApplicationService.remarkEasyMode(stockInOrderDO));
}
@ApiOperation("pda简易模式修改计划数量")
@GetMapping(value = "/updateQuantity")
public AjaxResult updateQuantity(@RequestParam BigDecimal quantity,
@@ -295,4 +336,15 @@ public class StockInOrderApi extends BaseController {
return stockInOrderApplicationService.batchPush(idList);
}
/**
* PDA批量入库签名
*
* <p>勾选多条入库记录批量签名更新入库表的签名状态签名时间签名图片签名备注</p>
*/
@ApiOperation("PDA批量入库签名")
@PostMapping("/batchSignature")
public AjaxResult batchSignature(@RequestBody com.mhd.wms.interfaces.dto.signature.BatchSignatureDTO dto) {
return stockInOrderApplicationService.batchSignature(dto);
}
}
@@ -116,6 +116,22 @@ public class StockOutOrderApi extends BaseController {
return handoverTaskOrderDomainService.customsConfirmOut(outOrderNumbers);
}
/**
* PDA出库签名列表查询
*
* <p>查询出库单状态已出库(status=9) 的出库单列表
* 支持作业任务人员(workUserName) like 模糊查询
* 参照简易模式快捷出库列表实现</p>
*/
@ApiOperation("PDA出库签名列表查询")
@GetMapping("/signatureList")
public TableDataInfo signatureList(StockOutOrderDTO stockOutOrderDTO) {
StockOutOrderDO stockOutOrderDO = stockOutOrderAssembler.toDO(stockOutOrderDTO);
startPage();
List<StockOutOrderPO> list = stockOutOrderApplicationService.querySignatureList(stockOutOrderDO);
return getDataTable(list);
}
/**
* 上传并解析出仓委托单Excel
*/
@@ -582,4 +598,15 @@ public class StockOutOrderApi extends BaseController {
}
return stockOutOrderApplicationService.batchPush(idList);
}
/**
* PDA批量出库签名
*
* <p>勾选多条出库记录批量签名更新出库表的签名状态签名时间签名图片签名备注</p>
*/
@ApiOperation("PDA批量出库签名")
@PostMapping("/batchSignature")
public AjaxResult batchSignature(@RequestBody com.mhd.wms.interfaces.dto.signature.BatchSignatureDTO dto) {
return stockOutOrderApplicationService.batchSignature(dto);
}
}
@@ -0,0 +1,85 @@
package com.mhd.wms.interfaces.facadeApi.stockSignature;
import com.mhd.common.core.web.controller.BaseController;
import com.mhd.common.core.web.domain.AjaxResult;
import com.mhd.system.api.domain.SignatureBatchFeignDTO;
import com.mhd.wms.application.service.stockInOrder.StockInOrderApplicationService;
import com.mhd.wms.application.service.stockOutOrder.StockOutOrderApplicationService;
import com.mhd.wms.interfaces.dto.signature.BatchSignatureDTO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* 库存签名API供OMS端Feign调用统一更新WMS入/出库单签名字段
*
* <p>OMS端批量签名后通过Feign调用此API
* 更新WMS stock_in_order / stock_out_order 表的签名状态签名时间签名图片签名备注</p>
*/
@Slf4j
@RestController
@RequestMapping("/stockSignatureApi")
@Api(tags = "库存签名(OMS→WMS")
public class StockSignatureApi extends BaseController {
@Autowired
private StockInOrderApplicationService stockInOrderApplicationService;
@Autowired
private StockOutOrderApplicationService stockOutOrderApplicationService;
/**
* 批量签名OMSWMS
*
* <p>接收SignatureBatchFeignDTO映射为BatchSignatureDTO后分别调用
* StockInOrderApplicationService.batchSignature
* StockOutOrderApplicationService.batchSignature</p>
*/
@ApiOperation("OMS批量签名-更新WMS入/出库单签名字段")
@PostMapping("/batchSign")
public AjaxResult batchSign(@RequestBody SignatureBatchFeignDTO dto) {
if (dto == null) {
return AjaxResult.error("请求参数不能为空");
}
boolean hasIn = dto.getInOrderIds() != null && !dto.getInOrderIds().isEmpty();
boolean hasOut = dto.getOutOrderIds() != null && !dto.getOutOrderIds().isEmpty();
if (!hasIn && !hasOut) {
return AjaxResult.error("请指定入库单ID列表或出库单ID列表");
}
// 映射 SignatureBatchFeignDTO BatchSignatureDTO
BatchSignatureDTO batchDTO = new BatchSignatureDTO();
batchDTO.setInOrderIds(dto.getInOrderIds());
batchDTO.setOutOrderIds(dto.getOutOrderIds());
batchDTO.setSignatureStatus(dto.getSignatureStatus() != null ? dto.getSignatureStatus() : 2);
batchDTO.setSignatureTime(dto.getSignatureTime());
batchDTO.setSignaturePic(dto.getSignaturePic());
batchDTO.setSignatureRemark(dto.getSignatureRemark());
// evidencePics: Feign DTO中是comma-separated String List<String>
if (dto.getEvidencePics() != null && !dto.getEvidencePics().isEmpty()) {
batchDTO.setEvidencePics(java.util.Arrays.asList(dto.getEvidencePics().split(",")));
}
String msg = "";
if (hasIn) {
AjaxResult inResult = stockInOrderApplicationService.batchSignature(batchDTO);
log.info("OMS→WMS批量入库签名完成:{}条,结果:{}", dto.getInOrderIds().size(),
inResult != null ? inResult.get("msg") : "OK");
msg += "入库签名完成";
}
if (hasOut) {
AjaxResult outResult = stockOutOrderApplicationService.batchSignature(batchDTO);
log.info("OMS→WMS批量出库签名完成:{}条,结果:{}", dto.getOutOrderIds().size(),
outResult != null ? outResult.get("msg") : "OK");
if (!msg.isEmpty()) msg += "";
msg += "出库签名完成";
}
return AjaxResult.success(msg);
}
}