|
@@ -8,7 +8,7 @@ import cn.hutool.core.util.ObjectUtil;
|
|
|
import com.alibaba.fastjson.JSONArray;
|
|
|
import com.baomidou.mybatisplus.core.toolkit.IdWorker;
|
|
|
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
|
|
-import com.ruoyi.ams.asn.dto.UnbindWmsBoxDTO;
|
|
|
+import com.ruoyi.ams.asn.dto.UnbindDTO;
|
|
|
import com.ruoyi.ams.asn.service.IWmsDocAsnHeaderService;
|
|
|
import com.ruoyi.ams.box.domain.WmsBoxInfo;
|
|
|
import com.ruoyi.ams.box.mapper.WmsBoxInfoMapper;
|
|
@@ -37,8 +37,7 @@ import com.ruoyi.ams.order.domain.ActAllocationDetails;
|
|
|
import com.ruoyi.ams.order.domain.PalletMatchLog;
|
|
|
import com.ruoyi.ams.order.domain.WmsDocOrderDetails;
|
|
|
import com.ruoyi.ams.order.domain.WmsDocOrderHeader;
|
|
|
-import com.ruoyi.ams.order.dto.PalletMatchLogDTO;
|
|
|
-import com.ruoyi.ams.order.dto.PdaGroupDiskDTO;
|
|
|
+import com.ruoyi.ams.order.dto.*;
|
|
|
import com.ruoyi.ams.order.form.*;
|
|
|
import com.ruoyi.ams.order.mapper.WmsDocOrderDetailsMapper;
|
|
|
import com.ruoyi.ams.order.mapper.WmsDocOrderHeaderMapper;
|
|
@@ -2735,54 +2734,312 @@ public class WmsDocOrderHeaderServiceImpl implements IWmsDocOrderHeaderService {
|
|
|
|
|
|
/**
|
|
|
* PDA解绑物料并发控制
|
|
|
- * @param unbindWmsBoxDTO
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public synchronized AjaxResult syncPdaUnbind(UnbindDTO unbindDTO){
|
|
|
+ return pdaUnbind(unbindDTO);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * PDA理货备货并发控制
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public synchronized AjaxResult syncPdaGroupDisk(PdaGroupDiskDTO pdaGroupDiskDTO){
|
|
|
+ return pdaGroupDisk(pdaGroupDiskDTO);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * PDA反拣组盘并发控制
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public synchronized AjaxResult syncPdaReversePickGroupDisk(ReversePickGroupDiskDTO reversePickGroupDiskDTO){
|
|
|
+ return pdaReversePickGroupDisk(reversePickGroupDiskDTO);
|
|
|
+ }
|
|
|
+ /**
|
|
|
+ * PDA库存匹配并发控制
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public synchronized Boolean syncInventoryMatch(String orderNos){
|
|
|
+ return inventoryMatch(orderNos);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * PDA反拣出库并发控制
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public synchronized Boolean syncPdaReversePickInventoryMatch(String orderNos){
|
|
|
+ return reversePickInventoryMatch(orderNos);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 库存匹配
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ @Transactional(propagation = Propagation.REQUIRES_NEW)
|
|
|
+ public Boolean inventoryMatch(String orderNos) {
|
|
|
+ List<String> orderList = JSONArray.parseArray(orderNos, String.class);
|
|
|
+ List<PalletMatchLog> palletMatchLogList = palletMatchLogService.checkOrderNoAndGetPalletMatchLogList(orderList);
|
|
|
+ List<InvLotAttPalletTotalDTO> result = buildInventoryMatchList(orderList, palletMatchLogList);
|
|
|
+ return palletMatchLogService.insertBatch(buildPalletMatchLogList(result, orderList));
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 反拣出库
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ @Transactional(propagation = Propagation.REQUIRES_NEW)
|
|
|
+ public Boolean reversePickInventoryMatch(String orderNos) {
|
|
|
+ List<String> orderList = JSONArray.parseArray(orderNos, String.class);
|
|
|
+ List<PalletMatchLog> palletMatchLogList = palletMatchLogService.checkOrderNoAndGetPalletMatchLogList(orderList);
|
|
|
+ LinkedList<Object> reversePickInventoryMatchList = buildReversePickInventoryMatchList(orderList, palletMatchLogList);
|
|
|
+ Boolean flag = (Boolean) reversePickInventoryMatchList.pop();
|
|
|
+ List<InvLotAttPalletTotalDTO> result = (List<InvLotAttPalletTotalDTO>) reversePickInventoryMatchList.pop();
|
|
|
+ if (flag) result.addAll(buildInventoryMatchList(orderList, palletMatchLogList));
|
|
|
+ return palletMatchLogService.insertBatch(buildPalletMatchLogList(result, orderList));
|
|
|
+ }
|
|
|
+
|
|
|
+ private List<InvLotAttPalletTotalDTO> buildInventoryMatchList(List<String> orderList, List<PalletMatchLog> palletMatchLogList){
|
|
|
+ //根据erp单号获取出库单头列表
|
|
|
+ List<WmsDocOrderHeader> wmsDocOrderHeaderList = wmsDocOrderHeaderMapper.selectList(Wrappers.<WmsDocOrderHeader>lambdaQuery().in(WmsDocOrderHeader::getSoReference1, orderList).orderByDesc(WmsDocOrderHeader::getCreateTime));
|
|
|
+ if (CollectionUtil.isEmpty(wmsDocOrderHeaderList)) {
|
|
|
+ throw new BaseException("请扫描正确的出库单号");
|
|
|
+ }
|
|
|
+ List<WmsDocOrderHeader> wmsDocOrderHeaderFilterList = wmsDocOrderHeaderList.stream().filter(item -> item.getOrderStatus().equals(Constant.ORDER_STS.STS00.getValue())
|
|
|
+ || item.getOrderStatus().equals(Constant.ORDER_STS.STS10.getValue()) || item.getOrderStatus().equals(Constant.ORDER_STS.STS22.getValue())).collect(Collectors.toList());
|
|
|
+ if (CollectionUtil.isEmpty(wmsDocOrderHeaderFilterList)) {
|
|
|
+ throw new BaseException("出库单状态不可进行库存匹配!");
|
|
|
+ }
|
|
|
+ List<WmsDocOrderDetails> wmsDocOrderDetailsList = wmsDocOrderDetailsService.queryWmsDocOrderDetails(
|
|
|
+ wmsDocOrderHeaderFilterList.stream().filter(item -> StringUtils.isNotBlank(item.getOrderNo()))
|
|
|
+ .map(WmsDocOrderHeader::getOrderNo).collect(Collectors.toList()));
|
|
|
+ if (CollectionUtil.isEmpty(wmsDocOrderDetailsList)) {
|
|
|
+ throw new BaseException("出库单明细为空!");
|
|
|
+ }
|
|
|
+ Map<String, List<WmsDocOrderDetails>> wmsDocOrderDetailsGroupBySkuMap = wmsDocOrderDetailsList.stream().filter(item -> StringUtils.isNotBlank(item.getSku())).collect(Collectors.groupingBy(WmsDocOrderDetails::getSku));
|
|
|
+ if (CollectionUtil.isEmpty(wmsDocOrderDetailsGroupBySkuMap)) {
|
|
|
+ throw new BaseException("出库单明细绑定sku为空!");
|
|
|
+ }
|
|
|
+
|
|
|
+ Map<String, List<InvLotAttPalletTotalDTO>> invLotAttPalletTotalMap = invLotAttService.buildInvLotAttPalletTotalMap(ListUtil.toList(wmsDocOrderDetailsGroupBySkuMap.keySet()));
|
|
|
+ if (CollectionUtil.isEmpty(invLotAttPalletTotalMap)) {
|
|
|
+ throw new BaseException("所选出库单绑定sku无库存!");
|
|
|
+ }
|
|
|
+ //所需出库托盘
|
|
|
+ List<InvLotAttPalletTotalDTO> result = new ArrayList<>();
|
|
|
+ for (Map.Entry<String, List<WmsDocOrderDetails>> wmsDocOrderDetailsGroupBySkuMapEntry : wmsDocOrderDetailsGroupBySkuMap.entrySet()) {
|
|
|
+ //扫描出库单各sku需求总数
|
|
|
+ BigDecimal total = wmsDocOrderDetailsGroupBySkuMapEntry.getValue().stream().filter(item -> ObjectUtil.isNotNull(item.getQtyOrdered())).map(item -> ObjectUtil.isNotNull(item.getQtyAllocated())
|
|
|
+ ? item.getQtyOrdered().subtract(item.getQtyAllocated()) : item.getQtyOrdered()).reduce(BigDecimal.ZERO, BigDecimal::add);
|
|
|
+ if (CompareUtil.compare(total, BigDecimal.ZERO) <= 0) continue;
|
|
|
+ List<InvLotAttPalletTotalDTO> skuPalletTotalList = invLotAttPalletTotalMap.get(wmsDocOrderDetailsGroupBySkuMapEntry.getKey());
|
|
|
+ if (CollectionUtil.isEmpty(skuPalletTotalList)) continue;
|
|
|
+ List<InvLotAttPalletTotalDTO> invLotAttPalletTotalList = buildInvLotAttPalletTotalList(skuPalletTotalList, total, palletMatchLogList);
|
|
|
+ result.addAll(invLotAttPalletTotalList);
|
|
|
+ }
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
+ private LinkedList<Object> buildReversePickInventoryMatchList(List<String> orderList, List<PalletMatchLog> palletMatchLogList){
|
|
|
+ //根据erp单号获取出库单头列表
|
|
|
+ List<WmsDocOrderHeader> wmsDocOrderHeaderList = wmsDocOrderHeaderMapper.selectList(Wrappers.<WmsDocOrderHeader>lambdaQuery().in(WmsDocOrderHeader::getSoReference1, orderList).orderByDesc(WmsDocOrderHeader::getCreateTime));
|
|
|
+ if (CollectionUtil.isEmpty(wmsDocOrderHeaderList)) {
|
|
|
+ throw new BaseException("请扫描正确的出库单号");
|
|
|
+ }
|
|
|
+ List<WmsDocOrderDetails> wmsDocOrderDetailsList = wmsDocOrderDetailsService.queryWmsDocOrderDetails(
|
|
|
+ wmsDocOrderHeaderList.stream().filter(item -> StringUtils.isNotBlank(item.getOrderNo()))
|
|
|
+ .map(WmsDocOrderHeader::getOrderNo).collect(Collectors.toList()));
|
|
|
+ if (CollectionUtil.isEmpty(wmsDocOrderDetailsList)) {
|
|
|
+ throw new BaseException("出库单明细为空!");
|
|
|
+ }
|
|
|
+ //所需出库托盘
|
|
|
+ List<InvLotAttPalletTotalDTO> invLotAttPalletTotalDTOList = new ArrayList<>();
|
|
|
+ Boolean flag = Boolean.FALSE;
|
|
|
+ Map<String, List<WmsDocOrderDetails>> wmsDocOrderDetailsGroupByOrderNoMap = wmsDocOrderDetailsList.stream().collect(Collectors.groupingBy(WmsDocOrderDetails::getOrderNo));
|
|
|
+ List<ReversePickInventoryMatchDTO> reversePickInventoryMatchDTOList = new ArrayList<>();
|
|
|
+ for (Map.Entry<String, List<WmsDocOrderDetails>> wmsDocOrderDetailsGroupByOrderNoEntry : wmsDocOrderDetailsGroupByOrderNoMap.entrySet()) {
|
|
|
+ List<String> skuList = wmsDocOrderDetailsGroupByOrderNoEntry.getValue().stream().map(WmsDocOrderDetails::getSku).distinct().collect(Collectors.toList());
|
|
|
+ for (String sku : skuList) {
|
|
|
+ //判断反拣类型为解绑还是扩容 如果大于零则为该解绑得数量
|
|
|
+ BigDecimal qty = judgeReversePickType(sku, wmsDocOrderDetailsGroupByOrderNoEntry.getKey());
|
|
|
+ if (CompareUtil.compare(qty, BigDecimal.ZERO) < 0) {
|
|
|
+ flag = Boolean.TRUE;
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ //解绑情况下 推荐已绑定该出库单号的库存托盘 小的先出
|
|
|
+ ReversePickInventoryMatchDTO reversePickInventoryMatchDTO = new ReversePickInventoryMatchDTO();
|
|
|
+ reversePickInventoryMatchDTO.setOrderNo(wmsDocOrderDetailsGroupByOrderNoEntry.getKey());
|
|
|
+ reversePickInventoryMatchDTO.setQty(qty);
|
|
|
+ reversePickInventoryMatchDTO.setSku(sku);
|
|
|
+ reversePickInventoryMatchDTOList.add(reversePickInventoryMatchDTO);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ Map<String, List<InvLotAttPalletTotalDTO>> invLotAttPalletTotalMap = invLotAttService.buildReversePickInvLotAttPalletTotalMap(reversePickInventoryMatchDTOList);
|
|
|
+ if (CollectionUtil.isEmpty(invLotAttPalletTotalMap)) {
|
|
|
+ throw new BaseException("所选出库单无分配库存!");
|
|
|
+ }
|
|
|
+ //所需出库托盘
|
|
|
+ for (ReversePickInventoryMatchDTO reversePickInventoryMatchDTO : reversePickInventoryMatchDTOList) {
|
|
|
+ List<InvLotAttPalletTotalDTO> skuPalletTotalList = invLotAttPalletTotalMap.get(reversePickInventoryMatchDTO.getSku());
|
|
|
+ if (CollectionUtil.isEmpty(skuPalletTotalList)) continue;
|
|
|
+ List<InvLotAttPalletTotalDTO> palletTotalFilterByOrderNoList = skuPalletTotalList.stream().filter(item -> reversePickInventoryMatchDTO.getOrderNo().equals(item.getOrderNo())).collect(Collectors.toList());
|
|
|
+ List<InvLotAttPalletTotalDTO> invLotAttPalletTotalList = buildInvLotAttPalletTotalList(palletTotalFilterByOrderNoList, reversePickInventoryMatchDTO.getQty(), palletMatchLogList);
|
|
|
+ invLotAttPalletTotalDTOList.addAll(invLotAttPalletTotalList);
|
|
|
+ }
|
|
|
+ LinkedList<Object> result = ListUtil.toLinkedList(flag, invLotAttPalletTotalDTOList);
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ private List<InvLotAttPalletTotalDTO> buildInvLotAttPalletTotalList(List<InvLotAttPalletTotalDTO> lotAttPalletTotalDTOList, BigDecimal qty, List<PalletMatchLog> palletMatchLogList){
|
|
|
+ //所需出库托盘
|
|
|
+ List<InvLotAttPalletTotalDTO> result = new ArrayList<>();
|
|
|
+ //sku出库单需求总数
|
|
|
+ if (CollectionUtil.isNotEmpty(palletMatchLogList)){
|
|
|
+ List<InvLotAttPalletTotalDTO> invLotAttMatchPalletTotalList = lotAttPalletTotalDTOList.stream().filter(item -> !palletMatchLogList.stream().map(PalletMatchLog::getPalletNo).collect(Collectors.toList()).contains(item.getPalletNo())).collect(Collectors.toList());
|
|
|
+ if (CollectionUtil.isEmpty(invLotAttMatchPalletTotalList)) {
|
|
|
+ result.addAll(lotAttPalletTotalDTOList);
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+ lotAttPalletTotalDTOList = invLotAttMatchPalletTotalList;
|
|
|
+ }
|
|
|
+
|
|
|
+ for (InvLotAttPalletTotalDTO invLotAttPalletTotalDTO : lotAttPalletTotalDTOList) {
|
|
|
+ BigDecimal palletTotal = new BigDecimal(invLotAttPalletTotalDTO.getTotalQty());
|
|
|
+ if (CompareUtil.compare(qty, palletTotal) <= 0) {
|
|
|
+ result.add(invLotAttPalletTotalDTO);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ qty = qty.subtract(palletTotal);
|
|
|
+ result.add(invLotAttPalletTotalDTO);
|
|
|
+ }
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 托盘出库回显推荐列表
|
|
|
+ * @param orderNos
|
|
|
* @return
|
|
|
*/
|
|
|
@Override
|
|
|
- public synchronized AjaxResult syncUnbindWmsBox(UnbindWmsBoxDTO unbindWmsBoxDTO){
|
|
|
- return unbindWmsBox(unbindWmsBoxDTO);
|
|
|
+ public List<PalletMatchLogDTO> queryPalletMatchInfoList(String orderNos) {
|
|
|
+ List<String> orderList = JSONArray.parseArray(orderNos, String.class);
|
|
|
+ String order = String.join(",", orderList);
|
|
|
+ List<PalletMatchLog> palletMatchLogList = palletMatchLogService.queryPalletMatchLogByOrderNos(order);
|
|
|
+ List<BaseLocationInfo> baseLocationInfoList = baseLocationInfoService.selectBaseLocationInfoList(palletMatchLogList.stream().map(PalletMatchLog::getLocationId).collect(Collectors.toList()));
|
|
|
+
|
|
|
+ return palletMatchLogList.stream().map(item -> {
|
|
|
+ PalletMatchLogDTO palletMatchLogDTO = ConvertUtils.sourceToTarget(item, PalletMatchLogDTO.class);
|
|
|
+ BaseLocationInfo locationInfo = baseLocationInfoList.stream().filter(baseLocationInfo -> baseLocationInfo.getId().equals(Long.parseLong(item.getLocationId()))).findFirst().orElseThrow(() -> new BaseException("库位信息有误"));
|
|
|
+ palletMatchLogDTO.setLocationNo(locationInfo.getLocationNo());
|
|
|
+ return palletMatchLogDTO;
|
|
|
+ }).collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(PalletMatchLogDTO::getPalletNo))), ArrayList::new));
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * PDA理货备货/分拣组盘(不传出库单号)
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ @Transactional(propagation = Propagation.REQUIRES_NEW)
|
|
|
+ public AjaxResult pdaGroupDisk(PdaGroupDiskDTO pdaGroupDiskDTO) {
|
|
|
+ GroupDiskConvertDTO groupDiskConvertDTO = buildGroupDiskConvertDTO(pdaGroupDiskDTO);
|
|
|
+ String locationId = invLotLocGroupDisk(groupDiskConvertDTO);
|
|
|
+ BigDecimal palletTotal = invLotAttService.queryPalletTotal(groupDiskConvertDTO.getPalletTo());
|
|
|
+ if (StringUtils.isBlank(groupDiskConvertDTO.getWmsOrderNo())) return AjaxResult.success("组盘成功!托盘数量: " + palletTotal);
|
|
|
+ groupDiskConvertDTO.setLocationId(locationId);
|
|
|
+ wmsDocOrderGroupDisk(groupDiskConvertDTO);
|
|
|
+ return AjaxResult.success("当前托盘备货成功!托盘数量: " + palletTotal);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * PDA反拣组盘
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ @Transactional(propagation = Propagation.REQUIRES_NEW)
|
|
|
+ public AjaxResult pdaReversePickGroupDisk(ReversePickGroupDiskDTO reversePickGroupDiskDTO){
|
|
|
+ ReversePickConvertDTO reversePickConvertDTO = buildReversePickConvertDTO(reversePickGroupDiskDTO);
|
|
|
+ //判断反拣类型为解绑还是扩容
|
|
|
+ BigDecimal qty = judgeReversePickType(reversePickConvertDTO.getSku(), reversePickConvertDTO.getOrderNo());
|
|
|
+ //1. 理货备货
|
|
|
+ if (CompareUtil.compare(qty, BigDecimal.ZERO) < 0){
|
|
|
+ PdaGroupDiskDTO pdaGroupDiskDTO = ConvertUtils.sourceToTarget(reversePickConvertDTO, PdaGroupDiskDTO.class);
|
|
|
+ return pdaGroupDisk(pdaGroupDiskDTO);
|
|
|
+ }
|
|
|
+ //2. 解绑当前物料
|
|
|
+ //反拣情况下原托盘为目标解绑托盘 新托盘为目标绑定托盘
|
|
|
+ Long locationId = unbindWmsBox(reversePickConvertDTO.getPalletFrom(), reversePickConvertDTO.getPalletTo());
|
|
|
+ List<InvLotAtt> invLotAttList = invLotAttService.queryInvLotAtt(reversePickConvertDTO.getPalletFrom(), reversePickConvertDTO.getSn(), reversePickConvertDTO.getOrderNo());
|
|
|
+ unbindInvLotLoc(invLotAttList.stream().map(InvLotAtt::getLotnum).collect(Collectors.toList()), locationId, reversePickConvertDTO.getPalletTo(), reversePickConvertDTO.getSku());
|
|
|
+ //删除条码扫描记录
|
|
|
+ erpBarcodesService.untieRecordErpBarcodeListAsnSo(reversePickConvertDTO.getErpNo(), null, reversePickConvertDTO.getSn());
|
|
|
+ return AjaxResult.success("条码:" + reversePickConvertDTO.getSn() + "与出库单:" + reversePickGroupDiskDTO.getErpNo() + "解绑成功!");
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * PDA解绑物料
|
|
|
+ */
|
|
|
@Transactional(propagation = Propagation.REQUIRES_NEW)
|
|
|
- public AjaxResult unbindWmsBox(UnbindWmsBoxDTO unbindWmsBoxDTO) {
|
|
|
- WmsBoxInfo wmsBoxToInfo = wmsBoxInfoService.selectWmsBoxInfoByBoxNo(unbindWmsBoxDTO.getPalletTo());
|
|
|
+ public AjaxResult pdaUnbind(UnbindDTO unbindDTO) {
|
|
|
+ InvLotLocId invLotLocId = invLotLocIdService.queryInvLotLocIdByLotnum(unbindDTO.getLotnum());
|
|
|
+ Long locationId = unbindWmsBox(unbindDTO.getPalletTo(), unbindDTO.getPalletFrom());
|
|
|
+ unbindInvLotLoc(unbindDTO.getLotnum(), locationId, unbindDTO.getPalletFrom(), unbindDTO.getSku());
|
|
|
+ if (StringUtils.isBlank(unbindDTO.getErpNo())) return AjaxResult.success("托盘:" + unbindDTO.getPalletTo() + "解绑成功!托盘数量: " + invLotAttService.queryPalletTotal(unbindDTO.getPalletTo()));
|
|
|
+ // 删除条码扫描记录
|
|
|
+ erpBarcodesService.untieRecordErpBarcodeListAsnSo(unbindDTO.getErpNo(), null, unbindDTO.getSn());
|
|
|
+ unbindWmsDocOrder(unbindDTO.getErpNo(), invLotLocId.getQty());
|
|
|
+ return AjaxResult.success("托盘:" + unbindDTO.getPalletTo() + "解绑成功!托盘数量: " + invLotAttService.queryPalletTotal(unbindDTO.getPalletTo()));
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 解绑托盘
|
|
|
+ * @param palletTo 目标解绑托盘
|
|
|
+ * @param palletFrom 目标绑定托盘
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ private Long unbindWmsBox(String palletTo, String palletFrom){
|
|
|
+ WmsBoxInfo wmsBoxToInfo = wmsBoxInfoService.selectWmsBoxInfoByBoxNo(palletTo);
|
|
|
if (ObjectUtil.isNull(wmsBoxToInfo)) {
|
|
|
- throw new BaseException("查询不到目标托盘:" + unbindWmsBoxDTO.getPalletTo());
|
|
|
+ throw new BaseException("查询不到目标托盘:" + palletTo);
|
|
|
}
|
|
|
- WmsBoxInfo wmsBoxFromInfo = wmsBoxInfoService.selectWmsBoxInfoByBoxNo(unbindWmsBoxDTO.getPalletFrom());
|
|
|
+ WmsBoxInfo wmsBoxFromInfo = wmsBoxInfoService.selectWmsBoxInfoByBoxNo(palletFrom);
|
|
|
if (ObjectUtil.isNull(wmsBoxFromInfo)){
|
|
|
- throw new BaseException("查询不到起始托盘:" + unbindWmsBoxDTO.getPalletFrom());
|
|
|
+ throw new BaseException("查询不到起始托盘:" + palletFrom);
|
|
|
}
|
|
|
- Long locationId = Optional.ofNullable(wmsBoxFromInfo.getLocationId()).orElseThrow(() -> new BaseException("起始托盘库位信息被清空:" + unbindWmsBoxDTO.getPalletFrom()));
|
|
|
+ Long locationId = Optional.ofNullable(wmsBoxFromInfo.getLocationId()).orElseThrow(() -> new BaseException("起始托盘库位信息被清空:" + palletFrom));
|
|
|
//把目标托盘设置成非满拖
|
|
|
wmsBoxToInfo.setIsFull("N");
|
|
|
wmsBoxInfoService.updateWmsBoxInfo(wmsBoxToInfo);
|
|
|
+ return locationId;
|
|
|
+ }
|
|
|
|
|
|
- List<InvLotLocId> invLotLocIdList = invLotLocIdService.selectInvLotLocIdByLotnum(unbindWmsBoxDTO.getLotnum());
|
|
|
- if (CollectionUtil.isEmpty(invLotLocIdList)) {
|
|
|
- throw new BaseException("该托盘不存在库存:" + unbindWmsBoxDTO.getPalletTo());
|
|
|
- }
|
|
|
- InvLotLocId invLotLocId = invLotLocIdList.stream().findFirst().get();
|
|
|
- InvLotAtt invLotAtt = invLotAttService.selectInvLotAttByLotnum(invLotLocId.getLotnum());
|
|
|
+ private void unbindInvLotLoc(List<String> lotNumList, Long locationId, String palletNo, String sku){
|
|
|
+ List<InvLotLocId> invLotLocIdList = invLotLocIdService.queryInvLotLocIdByLotnum(lotNumList);
|
|
|
+ InvLotLocId invLotLocId = invLotLocIdList.stream().findFirst().orElseThrow(() -> new BaseException("库位库存信息丢失!"));
|
|
|
+ unbindInvLotLoc(invLotLocId.getLotnum(), locationId, palletNo, sku);
|
|
|
+ }
|
|
|
+
|
|
|
+ private void unbindInvLotLoc(String lotNum, Long locationId, String palletNo, String sku){
|
|
|
+ InvLotAtt invLotAtt = invLotAttService.selectInvLotAttByLotnum(lotNum);
|
|
|
//创建新批次
|
|
|
- String lotNum = IdWorker.getIdStr();
|
|
|
- invLotAttService.insertInvLotAtt(buildInvLotAtt(lotNum, unbindWmsBoxDTO.getPalletFrom(), null, invLotAtt.getLotatt02()
|
|
|
- , unbindWmsBoxDTO.getSku(), StringUtils.isNotBlank(invLotAtt.getLotatt08()) ? invLotAtt.getLotatt08() : null));
|
|
|
+ String newLotNum = IdWorker.getIdStr();
|
|
|
+ invLotAttService.insertInvLotAtt(buildInvLotAtt(newLotNum, palletNo, null, invLotAtt.getLotatt02()
|
|
|
+ , sku, StringUtils.isNotBlank(invLotAtt.getLotatt08()) ? invLotAtt.getLotatt08() : null));
|
|
|
//修改库存
|
|
|
- invLotLocIdService.updateInvLotLocIdLotNum(invLotLocId.getLotnum(), lotNum, String.valueOf(locationId), BigDecimal.ZERO);
|
|
|
- if (StringUtils.isBlank(unbindWmsBoxDTO.getErpNo())) return AjaxResult.success("托盘:" + unbindWmsBoxDTO.getPalletTo() + "解绑成功!");
|
|
|
+ invLotLocIdService.updateInvLotLocIdLotNum(lotNum, newLotNum, String.valueOf(locationId), BigDecimal.ZERO);
|
|
|
+ }
|
|
|
|
|
|
- WmsDocOrderHeader wmsDocOrderHeader = selectWmsDocOrderHeaderByErpNo(unbindWmsBoxDTO.getErpNo());
|
|
|
+ private void unbindWmsDocOrder(String erpNo, BigDecimal qty){
|
|
|
+ WmsDocOrderHeader wmsDocOrderHeader = selectWmsDocOrderHeaderByErpNo(erpNo);
|
|
|
if (ObjectUtil.isNull(wmsDocOrderHeader)) throw new BaseException("出库单号错误!");
|
|
|
String orderNo = wmsDocOrderHeader.getOrderNo();
|
|
|
- List<WmsDocOrderDetails> wmsDocOrderDetailsList = wmsDocOrderDetailsService.queryWmsDocOrderDetailsByOrderNo(orderNo);
|
|
|
+ List<WmsDocOrderDetails> wmsDocOrderDetailsList = wmsDocOrderDetailsService.queryWmsDocOrderDetails(orderNo);
|
|
|
if (CollectionUtil.isEmpty(wmsDocOrderDetailsList)) throw new BaseException("出库单明细为空!");
|
|
|
wmsDocOrderDetailsList = ListUtil.reverse(wmsDocOrderDetailsList.stream().filter(item -> ObjectUtil.isNotNull(item.getQtyAllocated())
|
|
|
|| !NumberUtil.equals(item.getQtyAllocated(), BigDecimal.ZERO)).collect(Collectors.toList()));
|
|
|
- BigDecimal qty = invLotLocId.getQty();
|
|
|
|
|
|
for (WmsDocOrderDetails wmsDocOrderDetails : wmsDocOrderDetailsList) {
|
|
|
- Boolean flag = CompareUtil.compare(qty, wmsDocOrderDetails.getQtyAllocated()) >= 0;
|
|
|
+ boolean flag = CompareUtil.compare(qty, wmsDocOrderDetails.getQtyAllocated()) >= 0;
|
|
|
wmsDocOrderDetails.setQtyAllocated(flag ? BigDecimal.ZERO : wmsDocOrderDetails.getQtyAllocated().subtract(qty));
|
|
|
wmsDocOrderDetails.setQtyAllocatedEach(wmsDocOrderDetails.getQtyAllocated());
|
|
|
wmsDocOrderDetails.setLineStatus(flag ? Constant.ORDER_STS.STS00.getValue() : Constant.ORDER_STS.STS10.getValue());
|
|
@@ -2793,75 +3050,92 @@ public class WmsDocOrderHeaderServiceImpl implements IWmsDocOrderHeaderService {
|
|
|
//修改出库单单据状态
|
|
|
wmsDocOrderHeaderMapper.update(new WmsDocOrderHeader(), Wrappers.<WmsDocOrderHeader>lambdaUpdate()
|
|
|
.set(WmsDocOrderHeader::getOrderStatus, Constant.ORDER_STS.STS22.getValue()).eq(WmsDocOrderHeader::getOrderNo, orderNo));
|
|
|
+ }
|
|
|
|
|
|
- // 删除条码扫描记录
|
|
|
- erpBarcodesService.untieRecordErpBarcodeListAsnSo(unbindWmsBoxDTO.getErpNo(), null, invLotAtt.getLotatt02());
|
|
|
- return AjaxResult.success("托盘:" + unbindWmsBoxDTO.getPalletTo() + "解绑成功!");
|
|
|
+ private ReversePickConvertDTO buildReversePickConvertDTO(ReversePickGroupDiskDTO reversePickGroupDiskDTO) {
|
|
|
+ ReversePickConvertDTO reversePickConvertDTO = ConvertUtils.sourceToTarget(reversePickGroupDiskDTO, ReversePickConvertDTO.class);
|
|
|
+ // 根据条码获取物料号
|
|
|
+ CodeSkuRelationshipVO codeSkuRelationshipVO = codeSkuRelationshipService.checkIsProduct(reversePickConvertDTO.getSn());
|
|
|
+ String sku = codeSkuRelationshipVO.getSku();
|
|
|
+ WmsDocOrderHeader wmsDocOrderHeader = selectWmsDocOrderHeaderByErpNo(reversePickConvertDTO.getErpNo());
|
|
|
+ String orderNo = Optional.ofNullable(wmsDocOrderHeader).orElseThrow(() -> new BaseException("请扫描正确的出库单号!")).getOrderNo();
|
|
|
+ reversePickConvertDTO.setOrderNo(orderNo);
|
|
|
+ reversePickConvertDTO.setSku(sku);
|
|
|
+ return reversePickConvertDTO;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * PDA理货备货并发控制
|
|
|
- * @param pdaGroupDiskDTO
|
|
|
- * @return
|
|
|
+ * 判断反拣类型为解绑还是扩容 返回负数扩容 正数解绑
|
|
|
*/
|
|
|
- @Override
|
|
|
- public synchronized AjaxResult syncPdaGroupDiskBH(PdaGroupDiskDTO pdaGroupDiskDTO){
|
|
|
- return pdaGroupDiskBH(pdaGroupDiskDTO);
|
|
|
+ private BigDecimal judgeReversePickType(String sku, String orderNo){
|
|
|
+ List<InvLotAtt> invLotAttList = invLotAttService.queryOrderSameSkuInvLotAttList(sku, orderNo);
|
|
|
+ if (CollectionUtil.isEmpty(invLotAttList)) throw new BaseException("该出库单未进行理货备货,无法反拣!");
|
|
|
+ List<InvLotLocId> invLotLocIdList = invLotLocIdService.queryInvLotLocIdByLotnum(invLotAttList.stream().map(InvLotAtt::getLotnum).collect(Collectors.toList()));
|
|
|
+ List<WmsDocOrderDetails> wmsDocOrderDetailsList = wmsDocOrderDetailsService.queryWmsDocOrderDetails(orderNo, sku);
|
|
|
+ BigDecimal orderAllocatedQty = invLotLocIdList.stream().map(InvLotLocId::getQtyallocated).reduce(BigDecimal.ZERO, BigDecimal::add);
|
|
|
+ BigDecimal orderRequireQty = wmsDocOrderDetailsList.stream().map(WmsDocOrderDetails::getQtyOrdered).reduce(BigDecimal.ZERO, BigDecimal::add);
|
|
|
+ if (CompareUtil.compare(orderAllocatedQty, orderRequireQty) == 0) throw new BaseException("出库单该品号不存在反拣情况!");
|
|
|
+ return NumberUtil.sub(orderAllocatedQty, orderRequireQty);
|
|
|
}
|
|
|
|
|
|
- /**
|
|
|
- * PDA理货备货
|
|
|
- *
|
|
|
- * @param pdaGroupDiskDTO
|
|
|
- * @return
|
|
|
- */
|
|
|
- @Override
|
|
|
- @Transactional(propagation = Propagation.REQUIRES_NEW)
|
|
|
- public AjaxResult pdaGroupDiskBH(PdaGroupDiskDTO pdaGroupDiskDTO) {
|
|
|
- String palletNoFrom = pdaGroupDiskDTO.getPalletNoFrom(); // 起始托盘
|
|
|
- String palletNoTo = pdaGroupDiskDTO.getPalletNoTo(); // 目标托盘
|
|
|
- String sn = pdaGroupDiskDTO.getSn(); // 条码号
|
|
|
- String boxNo = StringUtils.isNotBlank(pdaGroupDiskDTO.getBoxNo()) ? pdaGroupDiskDTO.getBoxNo() : palletNoTo; //箱号
|
|
|
- BigDecimal qty = new BigDecimal(pdaGroupDiskDTO.getQty()); // 数量
|
|
|
+ private GroupDiskConvertDTO buildGroupDiskConvertDTO(PdaGroupDiskDTO pdaGroupDiskDTO) {
|
|
|
+ GroupDiskConvertDTO groupDiskConvertDTO = ConvertUtils.sourceToTarget(pdaGroupDiskDTO, GroupDiskConvertDTO.class);
|
|
|
+ String boxNo = StringUtils.isNotBlank(pdaGroupDiskDTO.getBoxNo()) ? pdaGroupDiskDTO.getBoxNo() : pdaGroupDiskDTO.getPalletTo();
|
|
|
+ String lotNum = IdWorker.getIdStr();
|
|
|
+ groupDiskConvertDTO.setBoxNo(boxNo);
|
|
|
+ groupDiskConvertDTO.setGroupDiskQty(new BigDecimal(pdaGroupDiskDTO.getQty()));
|
|
|
+ groupDiskConvertDTO.setLotNum(lotNum);
|
|
|
// 根据条码获取物料号
|
|
|
- CodeSkuRelationshipVO codeSkuRelationshipVO = codeSkuRelationshipService.checkIsProduct(sn);
|
|
|
+ CodeSkuRelationshipVO codeSkuRelationshipVO = codeSkuRelationshipService.checkIsProduct(pdaGroupDiskDTO.getSn());
|
|
|
// 物料编码
|
|
|
String sku = codeSkuRelationshipVO.getSku();
|
|
|
- WmsDocOrderHeader wmsDocOrderHeader = selectWmsDocOrderHeaderByErpNo(pdaGroupDiskDTO.getOrderNo());
|
|
|
- String orderNo = wmsDocOrderHeader.getOrderNo();
|
|
|
- List<WmsDocOrderDetails> wmsDocOrderDetailsList = wmsDocOrderDetailsService.queryWmsDocOrderDetailsByOrderNo(orderNo);
|
|
|
- List<WmsDocOrderDetails> wmsDocOrderDetailsMatchSkuList = wmsDocOrderDetailsList.stream().filter(item -> item.getSku().equals(sku)).collect(Collectors.toList());
|
|
|
- if (CollectionUtil.isEmpty(wmsDocOrderDetailsMatchSkuList)){
|
|
|
- throw new BaseException("出库明细未绑定此类产品!");
|
|
|
- }
|
|
|
- //筛选出相同sku并且数量未分配或未分配完的明细信息
|
|
|
- List<WmsDocOrderDetails> wmsDocOrderDetailsFilterList = wmsDocOrderDetailsMatchSkuList.stream()
|
|
|
- .filter(item -> CompareUtil.compare(item.getQtyOrdered().subtract(item.getQtyAllocated()), BigDecimal.ZERO) > 0).collect(Collectors.toList());
|
|
|
- if (CollectionUtil.isEmpty(wmsDocOrderDetailsFilterList)){
|
|
|
- throw new BaseException("出库单该产品已备货完成!");
|
|
|
- }
|
|
|
-
|
|
|
- //验证托盘相关信息并获取指向托盘库位信息
|
|
|
- String locationId = verifyInvLotAndGetLocationId(palletNoTo, sn, orderNo);
|
|
|
+ groupDiskConvertDTO.setSku(sku);
|
|
|
+ if (StringUtils.isBlank(pdaGroupDiskDTO.getErpNo())) return groupDiskConvertDTO;
|
|
|
+ WmsDocOrderHeader wmsDocOrderHeader = selectWmsDocOrderHeaderByErpNo(pdaGroupDiskDTO.getErpNo());
|
|
|
+ groupDiskConvertDTO.setWmsOrderNo(Optional.ofNullable(wmsDocOrderHeader).orElseThrow(() -> new BaseException("请扫描正确的出库单号!")).getOrderNo());
|
|
|
+ return groupDiskConvertDTO;
|
|
|
+ }
|
|
|
|
|
|
- List<InvLotAtt> invLotAttList = invLotAttService.queryInvLotAtt(palletNoFrom, sn);
|
|
|
+ private String invLotLocGroupDisk(GroupDiskConvertDTO groupDiskConvertDTO){
|
|
|
+ List<InvLotAtt> invLotAttList = invLotAttService.queryInvLotAtt(groupDiskConvertDTO.getPalletFrom(), groupDiskConvertDTO.getSn());
|
|
|
List<InvLotLocId> invLotLocIdList = invLotLocIdService.queryInvLotLocIdByLotnum(invLotAttList.stream().map(InvLotAtt::getLotnum).collect(Collectors.toList()));
|
|
|
+ String orderNo = StringUtils.isNotBlank(groupDiskConvertDTO.getWmsOrderNo()) ? groupDiskConvertDTO.getWmsOrderNo() : null;
|
|
|
//创建新批次
|
|
|
- String lotNum = IdWorker.getIdStr();
|
|
|
InvLotLocId invLotLocId = invLotLocIdList.stream().findFirst().orElseThrow(() -> new BaseException("库位库存信息丢失!"));
|
|
|
String asnNo = invLotAttList.stream().filter(item -> item.getLotnum().equals(invLotLocId.getLotnum())).map(InvLotAtt::getLotatt08).findFirst().orElseThrow(() -> new BaseException("此批次入库信息丢失!"));
|
|
|
- invLotAttService.insertInvLotAtt(buildInvLotAtt(lotNum, palletNoTo, orderNo, sn, sku, asnNo));
|
|
|
+ String sku = groupDiskConvertDTO.getSku();
|
|
|
+ invLotAttService.insertInvLotAtt(buildInvLotAtt(groupDiskConvertDTO.getLotNum(), groupDiskConvertDTO.getPalletTo(), orderNo, groupDiskConvertDTO.getSn(), sku, asnNo));
|
|
|
BigDecimal qtyAllocated = ObjectUtil.isNotNull(invLotLocId.getQtyallocated()) ? invLotLocId.getQtyallocated() : BigDecimal.ZERO;
|
|
|
BigDecimal invLotLocQty = invLotLocId.getQty().subtract(qtyAllocated);
|
|
|
+ //验证托盘相关信息并获取指向托盘库位信息
|
|
|
+ String locationId = verifyInvLotAndGetLocationId(groupDiskConvertDTO.getPalletTo(), groupDiskConvertDTO.getSn(), orderNo);
|
|
|
locationId = StringUtils.isNotBlank(locationId) ? locationId : invLotLocId.getLocationId();
|
|
|
- if (CompareUtil.compare(qty, invLotLocQty) >= 0) {
|
|
|
- invLotLocIdService.updateInvLotLocId(invLotLocId.getLotnum(), lotNum, invLotLocQty, sku, locationId);
|
|
|
+ if (CompareUtil.compare(groupDiskConvertDTO.getGroupDiskQty(), invLotLocQty) >= 0) {
|
|
|
+ invLotLocIdService.updateInvLotLocId(invLotLocId.getLotnum(), groupDiskConvertDTO.getLotNum(), invLotLocQty, sku, locationId);
|
|
|
} else {
|
|
|
// 拆分库存
|
|
|
// 修改原库存
|
|
|
- invLotLocIdService.updateInvLotLocId(invLotLocId.getLotnum(), qtyAllocated.add(qty), invLotLocId.getSku());
|
|
|
+ invLotLocIdService.updateInvLotLocId(invLotLocId.getLotnum(), qtyAllocated.add(groupDiskConvertDTO.getGroupDiskQty()), invLotLocId.getSku());
|
|
|
// 插入新库存
|
|
|
- invLotLocIdService.insertInvLotLocId(buildInvLotLocId(lotNum, qty, locationId, orderNo, sku));
|
|
|
+ invLotLocIdService.insertInvLotLocId(buildInvLotLocId(groupDiskConvertDTO.getLotNum(), groupDiskConvertDTO.getGroupDiskQty(), locationId, invLotLocId.getTraceid(), sku));
|
|
|
+ }
|
|
|
+ // 更新托盘
|
|
|
+ wmsBoxInfoService.updateWmsBoxLocationIdByBoxNo(groupDiskConvertDTO.getBoxNo(), Long.parseLong(locationId));
|
|
|
+ return locationId;
|
|
|
+ }
|
|
|
+
|
|
|
+ private void wmsDocOrderGroupDisk(GroupDiskConvertDTO groupDiskConvertDTO){
|
|
|
+ BigDecimal qty = groupDiskConvertDTO.getGroupDiskQty();
|
|
|
+ List<WmsDocOrderDetails> wmsDocOrderDetailsList = wmsDocOrderDetailsService.queryWmsDocOrderDetails(groupDiskConvertDTO.getWmsOrderNo());
|
|
|
+ List<WmsDocOrderDetails> wmsDocOrderDetailsMatchSkuList = wmsDocOrderDetailsList.stream().filter(item -> item.getSku().equals(groupDiskConvertDTO.getSku())).collect(Collectors.toList());
|
|
|
+ if (CollectionUtil.isEmpty(wmsDocOrderDetailsMatchSkuList)){
|
|
|
+ throw new BaseException("出库明细未绑定此类产品!");
|
|
|
+ }
|
|
|
+ //筛选出相同sku并且数量未分配或未分配完的明细信息
|
|
|
+ List<WmsDocOrderDetails> wmsDocOrderDetailsFilterList = wmsDocOrderDetailsMatchSkuList.stream()
|
|
|
+ .filter(item -> CompareUtil.compare(item.getQtyOrdered().subtract(item.getQtyAllocated()), BigDecimal.ZERO) > 0).collect(Collectors.toList());
|
|
|
+ if (CollectionUtil.isEmpty(wmsDocOrderDetailsFilterList)){
|
|
|
+ throw new BaseException("出库单该产品已备货完成!");
|
|
|
}
|
|
|
|
|
|
for (WmsDocOrderDetails wmsDocOrderDetails : wmsDocOrderDetailsFilterList) {
|
|
@@ -2871,29 +3145,27 @@ public class WmsDocOrderHeaderServiceImpl implements IWmsDocOrderHeaderService {
|
|
|
BigDecimal wmsDocOrderDetailsQty = wmsDocOrderDetails.getQtyOrdered().subtract(wmsDocOrderDetailsQtyAllocated);
|
|
|
//理货备货数量小于单个明细所需数量判断
|
|
|
BigDecimal remainQty = qty.subtract(wmsDocOrderDetailsQty);
|
|
|
- Boolean flag = CompareUtil.compare(remainQty, BigDecimal.ZERO) < 0;
|
|
|
+ boolean flag = CompareUtil.compare(remainQty, BigDecimal.ZERO) < 0;
|
|
|
|
|
|
wmsDocOrderDetails.setQtyAllocated(flag ? wmsDocOrderDetailsQtyAllocated.add(qty) : wmsDocOrderDetails.getQtyOrdered());
|
|
|
wmsDocOrderDetails.setQtyAllocatedEach(wmsDocOrderDetails.getQtyAllocated());
|
|
|
wmsDocOrderDetails.setLineStatus(flag ? Constant.ORDER_STS.STS10.getValue() : Constant.ORDER_STS.STS20.getValue());
|
|
|
wmsDocOrderDetailsService.updateWmsDocOrderDetails(wmsDocOrderDetails);
|
|
|
//生成分配明细
|
|
|
- actAllocationDetailsService.addActAllocationDetails(lotNum, locationId, qty, wmsDocOrderDetails
|
|
|
+ actAllocationDetailsService.addActAllocationDetails(groupDiskConvertDTO.getLotNum(), groupDiskConvertDTO.getLocationId(), qty, wmsDocOrderDetails
|
|
|
, wmsDocOrderDetails.getLineStatus());
|
|
|
// 记录扫码数据
|
|
|
- erpBarcodesService.recordErpBarcodeListSo(wmsDocOrderDetails, sn
|
|
|
- , "SORTATION01", palletNoTo, BigDecimal.ONE, boxNo);
|
|
|
+ erpBarcodesService.recordErpBarcodeListSo(wmsDocOrderDetails, groupDiskConvertDTO.getSn()
|
|
|
+ , "SORTATION01", groupDiskConvertDTO.getPalletTo(), BigDecimal.ONE, groupDiskConvertDTO.getBoxNo());
|
|
|
qty = remainQty;
|
|
|
if (flag || CompareUtil.compare(qty, BigDecimal.ZERO) == 0) break;
|
|
|
}
|
|
|
- // 更新托盘
|
|
|
- wmsBoxInfoService.updateWmsBoxLocationIdByBoxNo(boxNo, Long.parseLong(locationId));
|
|
|
- List<WmsDocOrderDetails> wmsDocOrderDetailsByOrderNo = wmsDocOrderDetailsService.queryWmsDocOrderDetailsByOrderNo(orderNo);
|
|
|
+
|
|
|
+ List<WmsDocOrderDetails> wmsDocOrderDetailsByOrderNo = wmsDocOrderDetailsService.queryWmsDocOrderDetails(groupDiskConvertDTO.getWmsOrderNo());
|
|
|
List<WmsDocOrderDetails> docOrderDetailsList = wmsDocOrderDetailsByOrderNo.stream()
|
|
|
.filter(item -> CompareUtil.compare(item.getLineStatus(), Constant.ORDER_STS.STS20.getValue()) != 0).collect(Collectors.toList());
|
|
|
wmsDocOrderHeaderMapper.update(new WmsDocOrderHeader(), Wrappers.<WmsDocOrderHeader>lambdaUpdate()
|
|
|
- .set(WmsDocOrderHeader::getOrderStatus, CollectionUtil.isNotEmpty(docOrderDetailsList) ? Constant.ORDER_STS.STS22.getValue() : Constant.ORDER_STS.STS23.getValue()).eq(WmsDocOrderHeader::getOrderNo, orderNo));
|
|
|
- return AjaxResult.success("当前托盘备货成功!托盘数量: " + invLotAttService.queryPalletTotal(palletNoTo));
|
|
|
+ .set(WmsDocOrderHeader::getOrderStatus, CollectionUtil.isNotEmpty(docOrderDetailsList) ? Constant.ORDER_STS.STS22.getValue() : Constant.ORDER_STS.STS23.getValue()).eq(WmsDocOrderHeader::getOrderNo, groupDiskConvertDTO.getWmsOrderNo()));
|
|
|
}
|
|
|
|
|
|
private String verifyInvLotAndGetLocationId(String palletNoTo, String sn, String orderNo) {
|
|
@@ -2906,11 +3178,13 @@ public class WmsDocOrderHeaderServiceImpl implements IWmsDocOrderHeaderService {
|
|
|
//验证是否已经有不同出库单备货了
|
|
|
List<InvLotLocId> invLotLocIdList = invLotLocIdService.queryInvLotLocIdByLotnum(palletNoToInvLotAttList.stream().map(InvLotAtt::getLotnum).collect(Collectors.toList()));
|
|
|
if (CollectionUtil.isEmpty(invLotLocIdList)) return null;
|
|
|
+ String locationId = invLotLocIdList.stream().filter(item -> StringUtils.isNotBlank(item.getLocationId())).map(InvLotLocId::getLocationId).findFirst().orElseThrow(() -> new BaseException("指向托盘库位信息丢失!"));
|
|
|
+ if (StringUtils.isBlank(orderNo)) return locationId;
|
|
|
List<InvLotAtt> invLotAttList = palletNoToInvLotAttList.stream().filter(item ->
|
|
|
invLotLocIdList.stream().map(InvLotLocId::getLotnum).collect(Collectors.toList()).contains(item.getLotnum())).collect(Collectors.toList());
|
|
|
List<InvLotAtt> invLotAttFilterList = invLotAttList.stream().filter(item -> StringUtils.isNotBlank(item.getLotatt14()) && !item.getLotatt14().equals(orderNo)).collect(Collectors.toList());
|
|
|
if (CollectionUtil.isNotEmpty(invLotAttFilterList)) throw new BaseException("该托盘已备货其他出库单: " + invLotAttFilterList.stream().map(InvLotAtt::getLotatt14).collect(Collectors.joining(",")));
|
|
|
- return invLotLocIdList.stream().filter(item -> StringUtils.isNotBlank(item.getLocationId())).map(InvLotLocId::getLocationId).findFirst().orElseThrow(() -> new BaseException("指向托盘库位信息丢失!"));
|
|
|
+ return locationId;
|
|
|
}
|
|
|
|
|
|
private InvLotLocId buildInvLotLocId(String lotNum, BigDecimal qty, String locationId, String traceId, String sku) {
|
|
@@ -2940,113 +3214,8 @@ public class WmsDocOrderHeaderServiceImpl implements IWmsDocOrderHeaderService {
|
|
|
return invLotAtt;
|
|
|
}
|
|
|
|
|
|
- /**
|
|
|
- * 验证出库单
|
|
|
- *
|
|
|
- * @param orderNo
|
|
|
- */
|
|
|
- private void verifyWmsDocOrder(String orderNo) {
|
|
|
- WmsDocOrderHeader header = wmsDocOrderHeaderService.selectWmsDocOrderHeaderByOrderNo(orderNo);
|
|
|
- if (ObjectUtil.isNull(header)) throw new BaseException("查无此出库单数据" + orderNo);
|
|
|
- if (!header.getOrderType().equals(Constant.ORDER_TYP.BH.getValue())) {
|
|
|
- throw new BaseException("出库单类型不可备货组盘!");
|
|
|
- }
|
|
|
- if (!header.getOrderStatus().equals(Constant.ORDER_STS.STS10.getValue())
|
|
|
- && !header.getOrderStatus().equals(Constant.ORDER_STS.STS20.getValue())
|
|
|
- && !header.getOrderStatus().equals(Constant.ORDER_STS.STS22.getValue())) {
|
|
|
- throw new BaseException("出库单状态不可备货组盘!");
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * 库存分配
|
|
|
- *
|
|
|
- * @param
|
|
|
- * orderNos
|
|
|
- * @return
|
|
|
- */
|
|
|
- @Override
|
|
|
- @Transactional
|
|
|
- public Boolean inventoryMatch(String orderNos) {
|
|
|
- List<String> orderList = JSONArray.parseArray(orderNos, String.class);
|
|
|
- String order = orderList.stream().collect(Collectors.joining(","));
|
|
|
- List<PalletMatchLog> palletMatchLogList = palletMatchLogService.queryAllPalletMatchLogByOrderNos(order);
|
|
|
- if (CollectionUtil.isNotEmpty(palletMatchLogList)) {
|
|
|
- palletMatchLogService.logicalDeletionPalletMatchLog(palletMatchLogList);
|
|
|
- }
|
|
|
-
|
|
|
- //根据erp单号获取出库单头列表
|
|
|
- List<WmsDocOrderHeader> wmsDocOrderHeaderList = wmsDocOrderHeaderMapper.selectList(Wrappers.<WmsDocOrderHeader>lambdaQuery().in(WmsDocOrderHeader::getSoReference1, orderList).orderByDesc(WmsDocOrderHeader::getCreateTime));
|
|
|
- if (CollectionUtil.isEmpty(wmsDocOrderHeaderList)) {
|
|
|
- throw new BaseException("请扫描正确的出库单号");
|
|
|
- }
|
|
|
- List<WmsDocOrderHeader> wmsDocOrderHeaderFilterList = wmsDocOrderHeaderList.stream().filter(item -> item.getOrderStatus().equals(Constant.ORDER_STS.STS00.getValue())
|
|
|
- || item.getOrderStatus().equals(Constant.ORDER_STS.STS10.getValue()) || item.getOrderStatus().equals(Constant.ORDER_STS.STS22.getValue())).collect(Collectors.toList());
|
|
|
- if (CollectionUtil.isEmpty(wmsDocOrderHeaderFilterList)) {
|
|
|
- throw new BaseException("出库单状态不可进行库存匹配!");
|
|
|
- }
|
|
|
- List<WmsDocOrderDetails> wmsDocOrderDetailsList = wmsDocOrderDetailsService.queryWmsDocOrderDetailsByOrderNo(
|
|
|
- wmsDocOrderHeaderFilterList.stream().filter(item -> StringUtils.isNotBlank(item.getOrderNo()))
|
|
|
- .map(WmsDocOrderHeader::getOrderNo).collect(Collectors.toList()));
|
|
|
- if (CollectionUtil.isEmpty(wmsDocOrderDetailsList)) {
|
|
|
- throw new BaseException("出库单明细为空!");
|
|
|
- }
|
|
|
- Map<String, List<WmsDocOrderDetails>> wmsDocOrderDetailsGroupBySkuMap = wmsDocOrderDetailsList.stream().filter(item -> StringUtils.isNotBlank(item.getSku())).collect(Collectors.groupingBy(WmsDocOrderDetails::getSku));
|
|
|
- if (CollectionUtil.isEmpty(wmsDocOrderDetailsGroupBySkuMap)) {
|
|
|
- throw new BaseException("出库单明细绑定sku为空!");
|
|
|
- }
|
|
|
- Map<String, List<InvLotAttPalletTotalDTO>> invLotAttPalletTotalMap = invLotAttService.buildInvLotAttPalletTotalMap(wmsDocOrderDetailsGroupBySkuMap.entrySet().stream().map(Map.Entry::getKey).collect(Collectors.toList()));
|
|
|
- if (CollectionUtil.isEmpty(invLotAttPalletTotalMap)) {
|
|
|
- throw new BaseException("所选出库单绑定sku无库存!");
|
|
|
- }
|
|
|
- //所需出库托盘
|
|
|
- List<InvLotAttPalletTotalDTO> result = new ArrayList<>();
|
|
|
- for (Map.Entry<String, List<WmsDocOrderDetails>> wmsDocOrderDetailsGroupBySkuMapEntry : wmsDocOrderDetailsGroupBySkuMap.entrySet()) {
|
|
|
- //扫描出库单各sku需求总数
|
|
|
- BigDecimal total = wmsDocOrderDetailsGroupBySkuMapEntry.getValue().stream().filter(item -> ObjectUtil.isNotNull(item.getQtyOrdered())).map(item -> ObjectUtil.isNotNull(item.getQtyAllocated())
|
|
|
- ? item.getQtyOrdered().subtract(item.getQtyAllocated()) : item.getQtyOrdered()).reduce(BigDecimal.ZERO, BigDecimal::add);
|
|
|
- if (CompareUtil.compare(total, BigDecimal.ZERO) <= 0) continue;
|
|
|
- List<InvLotAttPalletTotalDTO> invLotAttPalletTotalDTOList = invLotAttPalletTotalMap.get(wmsDocOrderDetailsGroupBySkuMapEntry.getKey());
|
|
|
- if (CollectionUtil.isEmpty(invLotAttPalletTotalDTOList)) continue;
|
|
|
- if (CollectionUtil.isNotEmpty(palletMatchLogList)){
|
|
|
- List<InvLotAttPalletTotalDTO> invLotAttPalletTotalList = invLotAttPalletTotalDTOList.stream().filter(item -> !palletMatchLogList.stream().map(palletMatchLog -> palletMatchLog.getPalletNo()).collect(Collectors.toList()).contains(item.getPalletNo())).collect(Collectors.toList());
|
|
|
- if (CollectionUtil.isEmpty(invLotAttPalletTotalList)) {
|
|
|
- result.addAll(invLotAttPalletTotalDTOList);
|
|
|
- continue;
|
|
|
- }
|
|
|
- invLotAttPalletTotalDTOList = invLotAttPalletTotalList;
|
|
|
- }
|
|
|
-
|
|
|
- for (InvLotAttPalletTotalDTO invLotAttPalletTotalDTO : invLotAttPalletTotalDTOList) {
|
|
|
- BigDecimal palletTotal = new BigDecimal(invLotAttPalletTotalDTO.getTotalQty());
|
|
|
- if (CompareUtil.compare(total, palletTotal) <= 0) {
|
|
|
- result.add(invLotAttPalletTotalDTO);
|
|
|
- break;
|
|
|
- }
|
|
|
- total = total.subtract(palletTotal);
|
|
|
- result.add(invLotAttPalletTotalDTO);
|
|
|
- }
|
|
|
- }
|
|
|
- return palletMatchLogService.insertBatch(buildPalletMatchLogList(result, orderList));
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public List<PalletMatchLogDTO> queryPalletMatchInfoList(String orderNos) {
|
|
|
- List<String> orderList = JSONArray.parseArray(orderNos, String.class);
|
|
|
- String order = orderList.stream().collect(Collectors.joining(","));
|
|
|
- List<PalletMatchLog> palletMatchLogList = palletMatchLogService.queryPalletMatchLogByOrderNos(order);
|
|
|
- List<BaseLocationInfo> baseLocationInfoList = baseLocationInfoService.selectBaseLocationInfoList(palletMatchLogList.stream().map(PalletMatchLog::getLocationId).collect(Collectors.toList()));
|
|
|
-
|
|
|
- return palletMatchLogList.stream().map(item -> {
|
|
|
- PalletMatchLogDTO palletMatchLogDTO = ConvertUtils.sourceToTarget(item, PalletMatchLogDTO.class);
|
|
|
- BaseLocationInfo locationInfo = baseLocationInfoList.stream().filter(baseLocationInfo -> baseLocationInfo.getId().equals(Long.parseLong(item.getLocationId()))).findFirst().orElseThrow(() -> new BaseException("库位信息有误"));
|
|
|
- palletMatchLogDTO.setLocationNo(locationInfo.getLocationNo());
|
|
|
- return palletMatchLogDTO;
|
|
|
- }).collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(PalletMatchLogDTO::getPalletNo))), ArrayList::new));
|
|
|
- }
|
|
|
-
|
|
|
private List<PalletMatchLog> buildPalletMatchLogList(List<InvLotAttPalletTotalDTO> invLotAttPalletTotalDTOList, List<String> orderList) {
|
|
|
- String orderNos = orderList.stream().collect(Collectors.joining(","));
|
|
|
+ String orderNos = String.join(",", orderList);
|
|
|
Date createTime = DateUtils.getNowDate();
|
|
|
return invLotAttPalletTotalDTOList.stream().map(item -> {
|
|
|
PalletMatchLog palletMatchLog = ConvertUtils.sourceToTarget(item, PalletMatchLog.class);
|