refactor(storage): 优化储位管理和服务层实现

- 将getBinNos方法改为getBinNo,统一返回单个储位编号
- 移除SAP服务集成相关的代码逻辑
- 更新InCostCenterBackController中的储位获取逻辑
- 添加仓库位置启用状态检查功能
- 重构入库记录中的二维码处理流程
- 引入条码处理阶段常量进行状态管理
- 优化InProduceBackController中的储位设置逻辑
- 更新生产订单控制器中的入库处理逻辑
- 调整物料扫描记录中的储位字段为单一值
- 修改多个控制器中的资源注入方式
- 更新物料退料提交对象的数据结构
- 优化条码主数据的状态更新机制
- 调整物料清单控制器中的删除操作事务处理
- 修复Excel导入验证条件的逻辑错误
- 优化包装数量计算使用统一工具类方法
This commit is contained in:
曹鹏飞 2026-03-03 17:56:54 +08:00
parent 2a79163ac3
commit 3b8b92942a
27 changed files with 365 additions and 220 deletions

View File

@ -13,6 +13,7 @@ import com.nflg.wms.admin.util.NoUtil;
import com.nflg.wms.admin.util.PdfGeneratorUtil; import com.nflg.wms.admin.util.PdfGeneratorUtil;
import com.nflg.wms.admin.util.QRCodeUtil; import com.nflg.wms.admin.util.QRCodeUtil;
import com.nflg.wms.admin.util.ThymeleafUtil; import com.nflg.wms.admin.util.ThymeleafUtil;
import com.nflg.wms.common.constant.BarCodeProcessStage;
import com.nflg.wms.common.pojo.ApiResult; import com.nflg.wms.common.pojo.ApiResult;
import com.nflg.wms.common.pojo.PageData; import com.nflg.wms.common.pojo.PageData;
import com.nflg.wms.common.pojo.document.InMaterialScanRecord; import com.nflg.wms.common.pojo.document.InMaterialScanRecord;
@ -24,10 +25,7 @@ import com.nflg.wms.common.pojo.qo.*;
import com.nflg.wms.common.pojo.vo.*; import com.nflg.wms.common.pojo.vo.*;
import com.nflg.wms.common.util.UserUtil; import com.nflg.wms.common.util.UserUtil;
import com.nflg.wms.common.util.VUtil; import com.nflg.wms.common.util.VUtil;
import com.nflg.wms.repository.entity.WmsInCostcenterBack; import com.nflg.wms.repository.entity.*;
import com.nflg.wms.repository.entity.WmsInCostcenterBackItem;
import com.nflg.wms.repository.entity.WmsInCostcenterBackTicket;
import com.nflg.wms.repository.entity.WmsInCostcenterBackTicketItem;
import com.nflg.wms.repository.service.*; import com.nflg.wms.repository.service.*;
import com.nflg.wms.starter.BaseController; import com.nflg.wms.starter.BaseController;
import jakarta.annotation.Resource; import jakarta.annotation.Resource;
@ -80,6 +78,12 @@ public class InCostCenterBackController extends BaseController {
@Resource @Resource
private BasdeSerialNumberControllerService serialNumberControllerService; private BasdeSerialNumberControllerService serialNumberControllerService;
@Resource
private IWmsWarehouseService warehouseService;
@Resource
private IWmsQrCodeMasterService qrCodeMasterService;
/** /**
* 查询SAP领料订单数据 * 查询SAP领料订单数据
*/ */
@ -181,9 +185,8 @@ public class InCostCenterBackController extends BaseController {
if (StrUtil.isBlank(vo.getLgort2())) { if (StrUtil.isBlank(vo.getLgort2())) {
vo.setLgort2(CollectionUtil.get(storageService.getWarehouseNo(order.getWerks(), item.getMatnr()), 0)); vo.setLgort2(CollectionUtil.get(storageService.getWarehouseNo(order.getWerks(), item.getMatnr()), 0));
} }
if (StrUtil.isNotBlank(vo.getLgort2()) && StrUtil.isBlank(vo.getLgpbe())) { vo.setLgpbe(storageService.getBinNo(item.getMatnr(), order.getWerks(), vo.getLgort2()));
vo.setLgpbe(StrUtil.join("/", storageService.getBinNos(item.getMatnr(), order.getWerks(), vo.getLgort2()))); vo.setIsDisableLocation(warehouseService.isEnableLocation(order.getWerks(), vo.getLgort2()));
}
return vo; return vo;
}).toList() }).toList()
) )
@ -208,8 +211,17 @@ public class InCostCenterBackController extends BaseController {
.setCreateTime(LocalDateTime.now()); .setCreateTime(LocalDateTime.now());
List<WmsInCostcenterBackItem> datas = inCostcenterBackItemService.getList(order.getId()); List<WmsInCostcenterBackItem> datas = inCostcenterBackItemService.getList(order.getId());
List<InMaterialScanRecord> records = new ArrayList<>(); List<InMaterialScanRecord> records = new ArrayList<>();
// List<MaterialQRCodeContentDTO> dtos = new ArrayList<>();
List<WmsInCostcenterBackTicketItem> ticketItems = new ArrayList<>(); List<WmsInCostcenterBackTicketItem> ticketItems = new ArrayList<>();
Set<String> allQrCodes = new HashSet<>();
request.getItems().forEach(it -> {
it.getItems().forEach(item -> {
allQrCodes.addAll(item.getQrCodes());
});
});
List<WmsQrCodeMaster> qrCodeMasters = qrCodeMasterService.lambdaQuery()
.lt(WmsQrCodeMaster::getProcessStage, BarCodeProcessStage.InBound.getState())
.in(WmsQrCodeMaster::getBarcodeCode, allQrCodes)
.list();
request.getItems().forEach(it -> { request.getItems().forEach(it -> {
WmsInCostcenterBackItem item = datas.stream().filter(d -> Objects.equals(it.getOrderItemId(), d.getId())).findFirst().orElse(null); WmsInCostcenterBackItem item = datas.stream().filter(d -> Objects.equals(it.getOrderItemId(), d.getId())).findFirst().orElse(null);
VUtil.trueThrowBusinessError(Objects.isNull(item)).throwMessage("订单项无效"); VUtil.trueThrowBusinessError(Objects.isNull(item)).throwMessage("订单项无效");
@ -217,40 +229,52 @@ public class InCostCenterBackController extends BaseController {
.setId(IdUtil.getSnowflakeNextId()) .setId(IdUtil.getSnowflakeNextId())
.setTicketId(ticket.getId()) .setTicketId(ticket.getId())
.setOrderItemId(item.getId()) .setOrderItemId(item.getId())
.setLgpbe(StrUtil.join(",", it.getBinNos())) .setLgpbe(StrUtil.join(",", it.getItems().stream().map(InCostcenterBackSubmitItemQRQO::getBinNo).toList()))
.setNum(BigDecimal.ZERO); .setNum(BigDecimal.ZERO);
ticketItems.add(ti); ticketItems.add(ti);
it.getQrCodes().forEach(qrCode -> { it.getItems().forEach(iit -> {
MaterialQRCodeContentDTO qrCodeContent = NoUtil.getMaterialQRCodeContent(qrCode); iit.getQrCodes().forEach(qrCode -> {
// dtos.add(qrCodeContent); MaterialQRCodeContentDTO qrCodeContent = NoUtil.getMaterialQRCodeContent(qrCode);
String materialNo = qrCodeContent.getMaterialNo(); String materialNo = qrCodeContent.getMaterialNo();
VUtil.trueThrowBusinessError(!StrUtil.equals(materialNo, item.getMatnr())) VUtil.trueThrowBusinessError(!StrUtil.equals(materialNo, item.getMatnr()))
.throwMessage("订单项与物料不符"); .throwMessage("订单项与物料不符");
item.setLeft(item.getLeft().subtract(qrCodeContent.getNum())); item.setLeft(item.getLeft().subtract(qrCodeContent.getNum()));
VUtil.trueThrowBusinessError(item.getLeft().compareTo(BigDecimal.ZERO) < 0) VUtil.trueThrowBusinessError(item.getLeft().compareTo(BigDecimal.ZERO) < 0)
.throwMessage("物料" + materialNo + "的入库数量超出申请数量"); .throwMessage("物料" + materialNo + "的入库数量超出申请数量");
ti.setNum(ti.getNum().add(qrCodeContent.getNum())); ti.setNum(ti.getNum().add(qrCodeContent.getNum()));
records.add(new InMaterialScanRecord() records.add(new InMaterialScanRecord()
.setSource(2) .setSource(2)
.setSourceId(order.getId()) .setSourceId(order.getId())
.setSourceItemId(item.getId()) .setSourceItemId(item.getId())
.setTicketItemId(ti.getId()) .setTicketItemId(ti.getId())
.setMaterialNo(materialNo) .setMaterialNo(materialNo)
.setContent(qrCode) .setContent(qrCode)
.setBatchNo(qrCodeContent.getBatchNo()) .setBatchNo(qrCodeContent.getBatchNo())
.setSerialNo(qrCodeContent.getSerialNo()) .setSerialNo(qrCodeContent.getSerialNo())
.setFactoryNo(order.getWerks()) .setFactoryNo(order.getWerks())
.setWarehouseNo(request.getLgort()) .setWarehouseNo(request.getLgort())
.setBinNos(StrUtil.split(it.getBinNos(), "/")) .setBinNo(iit.getBinNo())
.setUniqNo(qrCodeContent.getUniqNo()) .setUniqNo(qrCodeContent.getUniqNo())
.setNum(qrCodeContent.getNum()) .setNum(qrCodeContent.getNum())
.setCreateBy(UserUtil.getUserName()) .setCreateBy(UserUtil.getUserName())
.setCreateTime(Instant.now()) .setCreateTime(Instant.now())
); );
WmsQrCodeMaster qrCodeMaster = qrCodeMasters.stream()
.filter(q -> StrUtil.equals(q.getBarcodeCode(), qrCode))
.findFirst()
.orElse(null);
VUtil.trueThrowBusinessError(Objects.isNull(qrCodeMaster)).throwMessage("二维码" + qrCode + "无效");
qrCodeMaster.setProcessStage(BarCodeProcessStage.InBound.getState());
qrCodeMaster.setFactoryCode(order.getWerks());
qrCodeMaster.setStorageLocation(request.getLgort());
qrCodeMaster.setBinLocation(iit.getBinNo());
qrCodeMaster.setLastScanBy(UserUtil.getUserId());
qrCodeMaster.setLastScanByname(UserUtil.getUserName());
qrCodeMaster.setLastScanTime(LocalDateTime.now());
});
}); });
}); });
inCostcenterBackItemService.updateBatchById(datas); inCostcenterBackItemService.updateBatchById(datas);
inMaterialScanRecordRespository.saveAll(records);
inCostcenterBackTicketItemService.saveBatch(ticketItems); inCostcenterBackTicketItemService.saveBatch(ticketItems);
inCostcenterBackService.lambdaUpdate() inCostcenterBackService.lambdaUpdate()
.set(WmsInCostcenterBack::getSapStatus, true) .set(WmsInCostcenterBack::getSapStatus, true)
@ -260,6 +284,7 @@ public class InCostCenterBackController extends BaseController {
.set(WmsInCostcenterBack::getState, datas.stream().map(WmsInCostcenterBackItem::getLeft).reduce(BigDecimal.ZERO, BigDecimal::add).compareTo(BigDecimal.ZERO) > 0 ? 1 : 2) .set(WmsInCostcenterBack::getState, datas.stream().map(WmsInCostcenterBackItem::getLeft).reduce(BigDecimal.ZERO, BigDecimal::add).compareTo(BigDecimal.ZERO) > 0 ? 1 : 2)
.eq(WmsInCostcenterBack::getId, order.getId()) .eq(WmsInCostcenterBack::getId, order.getId())
.update(); .update();
qrCodeMasterService.updateBatchById(qrCodeMasters);
inventoryService.in(records.stream() inventoryService.in(records.stream()
.collect(Collectors.groupingBy(InMaterialScanRecord::getKey)) .collect(Collectors.groupingBy(InMaterialScanRecord::getKey))
.values() .values()
@ -299,6 +324,7 @@ public class InCostCenterBackController extends BaseController {
ticket.setDocYear(vo.getEMJahr()); ticket.setDocYear(vo.getEMJahr());
ticket.setMatDoc(vo.getEMblnr()); ticket.setMatDoc(vo.getEMblnr());
inCostcenterBackTicketService.save(ticket); inCostcenterBackTicketService.save(ticket);
inMaterialScanRecordRespository.saveAll(records);
return ApiResult.success(); return ApiResult.success();
} }

View File

@ -15,6 +15,7 @@ import com.nflg.wms.admin.util.NoUtil;
import com.nflg.wms.admin.util.PdfGeneratorUtil; import com.nflg.wms.admin.util.PdfGeneratorUtil;
import com.nflg.wms.admin.util.QRCodeUtil; import com.nflg.wms.admin.util.QRCodeUtil;
import com.nflg.wms.admin.util.ThymeleafUtil; import com.nflg.wms.admin.util.ThymeleafUtil;
import com.nflg.wms.common.constant.BarCodeProcessStage;
import com.nflg.wms.common.pojo.ApiResult; import com.nflg.wms.common.pojo.ApiResult;
import com.nflg.wms.common.pojo.PageData; import com.nflg.wms.common.pojo.PageData;
import com.nflg.wms.common.pojo.document.InMaterialScanRecord; import com.nflg.wms.common.pojo.document.InMaterialScanRecord;
@ -23,10 +24,7 @@ import com.nflg.wms.common.pojo.qo.*;
import com.nflg.wms.common.pojo.vo.*; import com.nflg.wms.common.pojo.vo.*;
import com.nflg.wms.common.util.UserUtil; import com.nflg.wms.common.util.UserUtil;
import com.nflg.wms.common.util.VUtil; import com.nflg.wms.common.util.VUtil;
import com.nflg.wms.repository.entity.WmsInProduceBack; import com.nflg.wms.repository.entity.*;
import com.nflg.wms.repository.entity.WmsInProduceBackItem;
import com.nflg.wms.repository.entity.WmsInProduceBackTicket;
import com.nflg.wms.repository.entity.WmsInProduceBackTicketItem;
import com.nflg.wms.repository.service.*; import com.nflg.wms.repository.service.*;
import com.nflg.wms.starter.BaseController; import com.nflg.wms.starter.BaseController;
import jakarta.annotation.Resource; import jakarta.annotation.Resource;
@ -76,6 +74,15 @@ public class InProduceBackController extends BaseController {
@Resource @Resource
private BasdeSerialNumberControllerService serialNumberControllerService; private BasdeSerialNumberControllerService serialNumberControllerService;
@Resource
private IWmsQrCodeMasterService qrCodeMasterService;
@Resource
private IWmsStorageService storageService;
@Resource
private IWmsWarehouseService warehouseService;
/** /**
* 查询SAP领料订单数据 * 查询SAP领料订单数据
*/ */
@ -185,10 +192,11 @@ public class InProduceBackController extends BaseController {
.map(item -> new OutProduceItemVO() .map(item -> new OutProduceItemVO()
.setId(item.getId()) .setId(item.getId())
.setLgort2(order.getLgort2()) .setLgort2(order.getLgort2())
.setLgpbe(item.getLgpbe()) .setLgpbe(storageService.getBinNo(item.getMatnr(), order.getDwerk(), order.getLgort2()))
.setMaktx2(item.getMaktx2()) .setMaktx2(item.getMaktx2())
.setMatnr(item.getMatnr()) .setMatnr(item.getMatnr())
.setNum(item.getSqsl().subtract(item.getNum())) .setNum(item.getSqsl().subtract(item.getNum()))
.setIsDisableLocation(warehouseService.isEnableLocation(order.getDwerk(), order.getLgort2()))
).toList() ).toList()
) )
); );
@ -213,55 +221,77 @@ public class InProduceBackController extends BaseController {
// List<MaterialQRCodeContentDTO> dtos = new ArrayList<>(); // List<MaterialQRCodeContentDTO> dtos = new ArrayList<>();
List<WmsInProduceBackTicketItem> ticketItems = new ArrayList<>(); List<WmsInProduceBackTicketItem> ticketItems = new ArrayList<>();
Multimap<String, String> input2 = ArrayListMultimap.create(); Multimap<String, String> input2 = ArrayListMultimap.create();
request.getQrCodes().forEach(qrCode -> { Set<String> allQrCodes = new HashSet<>();
MaterialQRCodeContentDTO qrCodeContent = NoUtil.getMaterialQRCodeContent(qrCode); request.getItems().forEach(it -> {
allQrCodes.addAll(it.getQrCodes());
});
List<WmsQrCodeMaster> qrCodeMasters = qrCodeMasterService.lambdaQuery()
.lt(WmsQrCodeMaster::getProcessStage, BarCodeProcessStage.InBound.getState())
.in(WmsQrCodeMaster::getBarcodeCode, allQrCodes)
.list();
request.getItems().forEach(iit -> {
iit.getQrCodes().forEach(qrCode -> {
MaterialQRCodeContentDTO qrCodeContent = NoUtil.getMaterialQRCodeContent(qrCode);
// dtos.add(qrCodeContent); // dtos.add(qrCodeContent);
String materialNo = qrCodeContent.getMaterialNo(); String materialNo = qrCodeContent.getMaterialNo();
WmsInProduceBackItem item = datas.stream().filter(d -> StrUtil.equals(d.getMatnr(), materialNo)).findFirst().orElse(null); WmsInProduceBackItem item = datas.stream().filter(d -> StrUtil.equals(d.getMatnr(), materialNo)).findFirst().orElse(null);
VUtil.trueThrowBusinessError(Objects.isNull(item)).throwMessage("物料" + materialNo + "不需要退料"); VUtil.trueThrowBusinessError(Objects.isNull(item)).throwMessage("物料" + materialNo + "不需要退料");
// VUtil.trueThrowBusinessError(List.of("3","4").contains(item.getLbprt()) && StrUtil.isBlank(qrCodeContent.getSerialNo())) // VUtil.trueThrowBusinessError(List.of("3","4").contains(item.getLbprt()) && StrUtil.isBlank(qrCodeContent.getSerialNo()))
// .throwMessage("物料" + materialNo + "必须有序列号"); // .throwMessage("物料" + materialNo + "必须有序列号");
// if (List.of("3","4").contains(item.getLbprt())){ // if (List.of("3","4").contains(item.getLbprt())){
// input2.put(item.getRspos(),qrCodeContent.getSerialNo()); // input2.put(item.getRspos(),qrCodeContent.getSerialNo());
// } // }
input2.put(item.getRspos(), qrCodeContent.getSerialNo()); input2.put(item.getRspos(), qrCodeContent.getSerialNo());
WmsInProduceBackTicketItem pti = ticketItems.stream() WmsInProduceBackTicketItem pti = ticketItems.stream()
.filter(ti -> Objects.equals(ti.getProduceBackItemId(), item.getId())) .filter(ti -> Objects.equals(ti.getProduceBackItemId(), item.getId()))
.findFirst() .findFirst()
.orElseGet(() -> { .orElseGet(() -> {
WmsInProduceBackTicketItem ti = new WmsInProduceBackTicketItem() WmsInProduceBackTicketItem ti = new WmsInProduceBackTicketItem()
.setId(IdUtil.getSnowflakeNextId()) .setId(IdUtil.getSnowflakeNextId())
.setTicketId(ticket.getId()) .setTicketId(ticket.getId())
.setProduceBackItemId(item.getId()) .setProduceBackItemId(item.getId())
.setNum(BigDecimal.ZERO); .setNum(BigDecimal.ZERO);
ticketItems.add(ti); ticketItems.add(ti);
return ti; return ti;
}); });
BigDecimal num = item.getSqsl().subtract(item.getNum()); BigDecimal num = item.getSqsl().subtract(item.getNum());
VUtil.trueThrowBusinessError(num.compareTo(qrCodeContent.getNum()) < 0) VUtil.trueThrowBusinessError(num.compareTo(qrCodeContent.getNum()) < 0)
.throwMessage("物料" + materialNo + "的入库数量超出申请数量"); .throwMessage("物料" + materialNo + "的入库数量超出申请数量");
item.setNum(item.getNum().add(qrCodeContent.getNum())); item.setNum(item.getNum().add(qrCodeContent.getNum()));
pti.setNum(pti.getNum().add(qrCodeContent.getNum())); pti.setNum(pti.getNum().add(qrCodeContent.getNum()));
records.add(new InMaterialScanRecord() records.add(new InMaterialScanRecord()
.setSource(1) .setSource(1)
.setSourceId(order.getId()) .setSourceId(order.getId())
.setSourceItemId(item.getId()) .setSourceItemId(item.getId())
.setTicketItemId(pti.getId()) .setTicketItemId(pti.getId())
.setMaterialNo(materialNo) .setMaterialNo(materialNo)
.setContent(qrCode) .setContent(qrCode)
.setBatchNo(qrCodeContent.getBatchNo()) .setBatchNo(qrCodeContent.getBatchNo())
.setSerialNo(qrCodeContent.getSerialNo()) .setSerialNo(qrCodeContent.getSerialNo())
.setUniqNo(qrCodeContent.getUniqNo()) .setUniqNo(qrCodeContent.getUniqNo())
.setFactoryNo(order.getDwerk()) .setFactoryNo(order.getDwerk())
.setWarehouseNo(request.getLgort()) .setWarehouseNo(request.getLgort())
// .setBinNos(StrUtil.split(it.getBinNos(), "/")) // .setBinNos(StrUtil.split(it.getBinNos(), "/"))
.setNum(qrCodeContent.getNum()) .setNum(qrCodeContent.getNum())
.setCreateBy(UserUtil.getUserName()) .setCreateBy(UserUtil.getUserName())
.setCreateTime(Instant.now()) .setCreateTime(Instant.now())
); );
WmsQrCodeMaster qrCodeMaster = qrCodeMasters.stream()
.filter(q -> StrUtil.equals(q.getBarcodeCode(), qrCode))
.findFirst()
.orElse(null);
VUtil.trueThrowBusinessError(Objects.isNull(qrCodeMaster)).throwMessage("二维码" + qrCode + "无效");
qrCodeMaster.setProcessStage(BarCodeProcessStage.InBound.getState());
qrCodeMaster.setFactoryCode(order.getDwerk());
qrCodeMaster.setStorageLocation(request.getLgort());
qrCodeMaster.setBinLocation(iit.getBinNo());
qrCodeMaster.setLastScanBy(UserUtil.getUserId());
qrCodeMaster.setLastScanByname(UserUtil.getUserName());
qrCodeMaster.setLastScanTime(LocalDateTime.now());
});
}); });
inProduceBackItemService.updateBatchById(datas); inProduceBackItemService.updateBatchById(datas);
inMaterialScanRecordRespository.saveAll(records); qrCodeMasterService.updateBatchById(qrCodeMasters);
inProduceBackTicketItemService.saveBatch(ticketItems); inProduceBackTicketItemService.saveBatch(ticketItems);
inventoryService.in(records.stream() inventoryService.in(records.stream()
.collect(Collectors.groupingBy(InMaterialScanRecord::getKey)) .collect(Collectors.groupingBy(InMaterialScanRecord::getKey))
@ -310,6 +340,7 @@ public class InProduceBackController extends BaseController {
.set(WmsInProduceBack::getState, inNum.compareTo(totalNum) >= 0 ? 2 : 1) .set(WmsInProduceBack::getState, inNum.compareTo(totalNum) >= 0 ? 2 : 1)
.eq(WmsInProduceBack::getId, order.getId()) .eq(WmsInProduceBack::getId, order.getId())
.update(); .update();
inMaterialScanRecordRespository.saveAll(records);
return ApiResult.success(); return ApiResult.success();
} }

View File

@ -108,6 +108,12 @@ public class InProduceOrderController extends BaseController {
@Resource @Resource
private IWmsQrCodeMasterService qrCodeMasterService; private IWmsQrCodeMasterService qrCodeMasterService;
@Resource
private IWmsStorageService storageService;
@Resource
private IWmsWarehouseService warehouseService;
/** /**
* 从SAP查询生产订单信息 * 从SAP查询生产订单信息
* @param no 生产订单号 * @param no 生产订单号
@ -367,21 +373,21 @@ public class InProduceOrderController extends BaseController {
if (Objects.equals(type, 0)) { if (Objects.equals(type, 0)) {
child.setMustScan(false); child.setMustScan(false);
} }
child.setBinNos(binService.getBinNos(child.getMaterialNo(), child.getFactoryNo(), child.getWarehouseNo())); child.setBinNo(binService.getBinNo(child.getMaterialNo(), child.getFactoryNo(), child.getWarehouseNo()));
}); });
datas.addAll(children); datas.addAll(children);
}); });
return ApiResult.success(datas); return ApiResult.success(datas);
} else { } else {
list.forEach(it -> { list.forEach(it -> {
it.setBinNos(binService.getBinNos(it.getMaterialNo(), it.getFactoryNo(), it.getWarehouseNo())); it.setBinNo(binService.getBinNo(it.getMaterialNo(), it.getFactoryNo(), it.getWarehouseNo()));
}); });
return ApiResult.success(list); return ApiResult.success(list);
} }
} }
/** /**
* 收货PDA使用 * 入库PDA使用
* @param request 请求参数 * @param request 请求参数
*/ */
@Transactional @Transactional
@ -413,8 +419,18 @@ public class InProduceOrderController extends BaseController {
List<String> materialNos = new ArrayList<>(); List<String> materialNos = new ArrayList<>();
List<InMaterialScanRecord> records = new ArrayList<>(); List<InMaterialScanRecord> records = new ArrayList<>();
Map<Long, String> warehouseNoChange = new HashMap<>(); Map<Long, String> warehouseNoChange = new HashMap<>();
Set<String> allQrCodes = new HashSet<>();
request.getMaterials().forEach(it -> {
it.getItems().forEach(item -> {
allQrCodes.addAll(item.getQrCodes());
});
});
List<WmsQrCodeMaster> qrCodeMasters = CollectionUtil.isEmpty(allQrCodes) ? Collections.emptyList() : qrCodeMasterService.lambdaQuery()
.lt(WmsQrCodeMaster::getProcessStage, BarCodeProcessStage.InBound.getState())
.in(WmsQrCodeMaster::getBarcodeCode, allQrCodes)
.list();
datas.forEach(it -> { datas.forEach(it -> {
InProduceOrderReceiveMaterialQO materialQO = request.getItems() InProduceOrderReceiveMaterialQO materialQO = request.getMaterials()
.stream() .stream()
.filter(q -> StrUtil.equals(q.getMaterialNo(), it.getMaterialNo())) .filter(q -> StrUtil.equals(q.getMaterialNo(), it.getMaterialNo()))
.findFirst() .findFirst()
@ -422,7 +438,7 @@ public class InProduceOrderController extends BaseController {
if (Objects.isNull(materialQO)) { if (Objects.isNull(materialQO)) {
materialNos.add(it.getMaterialNo()); materialNos.add(it.getMaterialNo());
} else { } else {
VUtil.trueThrowBusinessError(it.isMustScan() && CollectionUtil.isEmpty(materialQO.getQrCodes())) VUtil.trueThrowBusinessError(it.isMustScan() && CollectionUtil.isEmpty(materialQO.getItems()))
.throwMessage(materialQO.getMaterialNo() + "需要提供扫码信息"); .throwMessage(materialQO.getMaterialNo() + "需要提供扫码信息");
if (!StrUtil.equals(it.getWarehouseNo(), materialQO.getWarehouseNo())) { if (!StrUtil.equals(it.getWarehouseNo(), materialQO.getWarehouseNo())) {
warehouseNoChange.put(it.getId(), materialQO.getWarehouseNo()); warehouseNoChange.put(it.getId(), materialQO.getWarehouseNo());
@ -437,34 +453,48 @@ public class InProduceOrderController extends BaseController {
} }
} }
if (it.isMustScan()) { if (it.isMustScan()) {
BigDecimal num = BigDecimal.ZERO; materialQO.getItems().forEach(item -> {
for (String qrCode : materialQO.getQrCodes()) { BigDecimal num = BigDecimal.ZERO;
MaterialQRCodeContentDTO content = NoUtil.getMaterialQRCodeContent(qrCode); for (String qrCode : item.getQrCodes()) {
if (Objects.nonNull(content.getNum())) { MaterialQRCodeContentDTO content = NoUtil.getMaterialQRCodeContent(qrCode);
num = num.add(content.getNum()); if (Objects.nonNull(content.getNum())) {
num = num.add(content.getNum());
}
records.add(new InMaterialScanRecord()
.setSource(4)
.setSourceId(order.getId())
.setSourceItemId(it.getId())
.setTicketItemId(it.getId())
.setMaterialNo(it.getMaterialNo())
.setContent(qrCode)
.setBatchNo(content.getBatchNo())
.setSerialNo(content.getSerialNo())
.setUniqNo(content.getUniqNo())
.setFactoryNo(it.getFactoryNo())
.setWarehouseNo(it.getWarehouseNo())
.setBinNo(item.getBinNo())
.setNum(content.getNum())
.setUnit(it.getUnit())
.setCreateBy(UserUtil.getUserName())
.setCreateTime(Instant.now())
);
WmsQrCodeMaster qrCodeMaster = qrCodeMasters.stream()
.filter(q -> StrUtil.equals(q.getBarcodeCode(), qrCode))
.findFirst()
.orElse(null);
VUtil.trueThrowBusinessError(Objects.isNull(qrCodeMaster)).throwMessage("二维码" + qrCode + "无效");
qrCodeMaster.setProcessStage(BarCodeProcessStage.InBound.getState());
qrCodeMaster.setFactoryCode(it.getFactoryNo());
qrCodeMaster.setStorageLocation(it.getWarehouseNo());
qrCodeMaster.setBinLocation(item.getBinNo());
qrCodeMaster.setLastScanBy(UserUtil.getUserId());
qrCodeMaster.setLastScanByname(UserUtil.getUserName());
qrCodeMaster.setLastScanTime(LocalDateTime.now());
} }
records.add(new InMaterialScanRecord() if (num.compareTo(it.getNum()) != 0) {
.setSource(4) materialNos.add(it.getMaterialNo());
.setSourceId(order.getId()) }
.setSourceItemId(it.getId()) });
.setTicketItemId(it.getId())
.setMaterialNo(it.getMaterialNo())
.setContent(qrCode)
.setBatchNo(content.getBatchNo())
.setSerialNo(content.getSerialNo())
.setUniqNo(content.getUniqNo())
.setFactoryNo(it.getFactoryNo())
.setWarehouseNo(it.getWarehouseNo())
.setBinNos(StrUtil.split(materialQO.getBinNos(), "/"))
.setNum(content.getNum())
.setUnit(it.getUnit())
.setCreateBy(UserUtil.getUserName())
.setCreateTime(Instant.now())
);
}
if (num.compareTo(it.getNum()) != 0) {
materialNos.add(it.getMaterialNo());
}
} }
// if (!order.getList()) { // if (!order.getList()) {
// //是否更改了储位 // //是否更改了储位
@ -511,6 +541,9 @@ public class InProduceOrderController extends BaseController {
.map(InMaterialScanRecord::getSerialNo) .map(InMaterialScanRecord::getSerialNo)
.toList(); .toList();
} }
if (CollectionUtil.isNotEmpty(qrCodeMasters)) {
qrCodeMasterService.updateBatchById(qrCodeMasters);
}
inventoryService.in(list.stream() inventoryService.in(list.stream()
.filter(it -> Objects.equals(it.getParentId(), 0L)) .filter(it -> Objects.equals(it.getParentId(), 0L))
.map(it -> new InventoryDTO() .map(it -> new InventoryDTO()
@ -522,7 +555,6 @@ public class InProduceOrderController extends BaseController {
.setSerialNo(it.getSernr()) .setSerialNo(it.getSernr())
).toList() ).toList()
); );
inMaterialScanRecordRespository.saveAll(records);
if (CollectionUtil.isNotEmpty(warehouseNoChange)) { if (CollectionUtil.isNotEmpty(warehouseNoChange)) {
produceOrderItemService.updateBatchById( produceOrderItemService.updateBatchById(
warehouseNoChange.entrySet() warehouseNoChange.entrySet()
@ -541,6 +573,7 @@ public class InProduceOrderController extends BaseController {
order.setUpdateBy(UserUtil.getUserName()); order.setUpdateBy(UserUtil.getUserName());
order.setUpdateTime(LocalDateTime.now()); order.setUpdateTime(LocalDateTime.now());
produceOrderService.updateById(order); produceOrderService.updateById(order);
inMaterialScanRecordRespository.saveAll(records);
return ApiResult.success(); return ApiResult.success();
} }

View File

@ -21,7 +21,6 @@ import com.nflg.wms.common.pojo.dto.MaterialQRCodeContentDTO;
import com.nflg.wms.common.pojo.dto.QrCodeMasterPrintDTO; import com.nflg.wms.common.pojo.dto.QrCodeMasterPrintDTO;
import com.nflg.wms.common.pojo.qo.*; import com.nflg.wms.common.pojo.qo.*;
import com.nflg.wms.common.pojo.vo.*; import com.nflg.wms.common.pojo.vo.*;
import com.nflg.wms.common.util.NumberUtil;
import com.nflg.wms.common.util.UserUtil; import com.nflg.wms.common.util.UserUtil;
import com.nflg.wms.common.util.VUtil; import com.nflg.wms.common.util.VUtil;
import com.nflg.wms.repository.entity.*; import com.nflg.wms.repository.entity.*;
@ -47,7 +46,6 @@ import java.time.Instant;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.*; import java.util.*;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import java.util.stream.Stream;
import java.util.zip.ZipEntry; import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream; import java.util.zip.ZipOutputStream;
@ -243,39 +241,41 @@ public class InProduceOrderSurplusController extends BaseController {
.setId(IdUtil.getSnowflakeNextId()) .setId(IdUtil.getSnowflakeNextId())
.setTicketId(ticket.getId()) .setTicketId(ticket.getId())
.setOrderItemId(item.getId()) .setOrderItemId(item.getId())
.setLgpbe(StrUtil.join(",", it.getBinNos())) .setLgpbe(StrUtil.join(",", it.getItems().stream().map(InCostcenterBackSubmitItemQRQO::getBinNo).toList()))
.setNum(BigDecimal.ZERO); .setNum(BigDecimal.ZERO);
ticketItems.add(ti); ticketItems.add(ti);
it.getQrCodes().forEach(qrCode -> { it.getItems().forEach(iit -> {
MaterialQRCodeContentDTO qrCodeContent = NoUtil.getMaterialQRCodeContent(qrCode); iit.getQrCodes().forEach(qrCode -> {
String materialNo = qrCodeContent.getMaterialNo(); MaterialQRCodeContentDTO qrCodeContent = NoUtil.getMaterialQRCodeContent(qrCode);
VUtil.trueThrowBusinessError(!StrUtil.equals(materialNo, item.getMatnr())) String materialNo = qrCodeContent.getMaterialNo();
.throwMessage("订单项与物料不符"); VUtil.trueThrowBusinessError(!StrUtil.equals(materialNo, item.getMatnr()))
item.setLeftNum(item.getLeftNum().subtract(qrCodeContent.getNum())); .throwMessage("订单项与物料不符");
VUtil.trueThrowBusinessError(item.getLeftNum().compareTo(BigDecimal.ZERO) < 0) item.setLeftNum(item.getLeftNum().subtract(qrCodeContent.getNum()));
.throwMessage("物料" + materialNo + "的入库数量超出申请数量"); VUtil.trueThrowBusinessError(item.getLeftNum().compareTo(BigDecimal.ZERO) < 0)
ti.setNum(ti.getNum().add(qrCodeContent.getNum())); .throwMessage("物料" + materialNo + "的入库数量超出申请数量");
records.add(new InMaterialScanRecord() ti.setNum(ti.getNum().add(qrCodeContent.getNum()));
.setSource(7) records.add(new InMaterialScanRecord()
.setSourceId(order.getId()) .setSource(7)
.setSourceItemId(item.getId()) .setSourceId(order.getId())
.setTicketId(ticket.getId()) .setSourceItemId(item.getId())
.setTicketItemId(ti.getId()) .setTicketId(ticket.getId())
.setMaterialNo(materialNo) .setTicketItemId(ti.getId())
.setMaterialDesc(qrCodeContent.getMaterialDesc()) .setMaterialNo(materialNo)
.setUnit(item.getMeins()) .setMaterialDesc(qrCodeContent.getMaterialDesc())
.setContent(qrCode) .setUnit(item.getMeins())
.setBatchNo(qrCodeContent.getBatchNo()) .setContent(qrCode)
.setSerialNo(qrCodeContent.getSerialNo()) .setBatchNo(qrCodeContent.getBatchNo())
.setFactoryNo(order.getDwerk()) .setSerialNo(qrCodeContent.getSerialNo())
.setWarehouseNo(ticket.getLgort()) .setFactoryNo(order.getDwerk())
.setBinNos(StrUtil.split(it.getBinNos(), "/")) .setWarehouseNo(ticket.getLgort())
.setUniqNo(qrCodeContent.getUniqNo()) .setBinNo(iit.getBinNo())
.setRspos(item.getRspos()) .setUniqNo(qrCodeContent.getUniqNo())
.setNum(qrCodeContent.getNum()) .setRspos(item.getRspos())
.setCreateBy(UserUtil.getUserName()) .setNum(qrCodeContent.getNum())
.setCreateTime(Instant.now()) .setCreateBy(UserUtil.getUserName())
); .setCreateTime(Instant.now())
);
});
}); });
}); });
inProduceOrderSurplusItemService.updateBatchById(datas); inProduceOrderSurplusItemService.updateBatchById(datas);

View File

@ -78,7 +78,7 @@ public class OutPurchaseController extends BaseController {
public ApiResult<ZWM3A05VO> searchSAP(@Valid @RequestBody @NotNull zwm3A05QO request) { public ApiResult<ZWM3A05VO> searchSAP(@Valid @RequestBody @NotNull zwm3A05QO request) {
ZWM3A05VO result = sapService.zwm3A05(request); ZWM3A05VO result = sapService.zwm3A05(request);
result.getItems().parallelStream().forEach(it -> { result.getItems().parallelStream().forEach(it -> {
it.setBinNos(binService.getBinNos(it.getMatnr(), result.getWerks(), it.getLgort())); it.setBinNos(binService.getBinNo(it.getMatnr(), result.getWerks(), it.getLgort()));
}); });
return ApiResult.success(result); return ApiResult.success(result);
} }

View File

@ -881,7 +881,7 @@ public class StructuralPackageOrderController extends BaseController {
log.error("{},{},{}未从SAP的ZIM_004接口查询仓库为空", it.getExternalOrderNo(), it.getSupplierCode(), it.getPackageNo()); log.error("{},{},{}未从SAP的ZIM_004接口查询仓库为空", it.getExternalOrderNo(), it.getSupplierCode(), it.getPackageNo());
} else { } else {
it.setWarehouseNo(dto.getWarehouseNo()); it.setWarehouseNo(dto.getWarehouseNo());
it.setBinNos(binService.getBinNos(it.getPackageNo(), dto.getWerks(), dto.getWarehouseNo())); it.setBinNos(binService.getBinNo(it.getPackageNo(), dto.getWerks(), dto.getWarehouseNo()));
// if (dto.getTransportNum().compareTo(new BigDecimal(it.getNum()))<0){ // if (dto.getTransportNum().compareTo(new BigDecimal(it.getNum()))<0){
// it.setNum(dto.getTransportNum().intValue()); // it.setNum(dto.getTransportNum().intValue());
// } // }

View File

@ -484,7 +484,7 @@ public class TransferCompanyController extends BaseController {
.setMatnr(item.getMatnr()) .setMatnr(item.getMatnr())
.setMaktx(item.getMaktx()) .setMaktx(item.getMaktx())
.setNum(item.getNum()) .setNum(item.getNum())
.setBinIn(StrUtil.join("/", storageService.getBinNos(item.getMatnr(), ticket.getWerks(), ticket.getLgort()))) .setBinIn(StrUtil.join("/", storageService.getBinNo(item.getMatnr(), ticket.getWerks(), ticket.getLgort())))
).toList() ).toList()
) )
); );
@ -515,7 +515,7 @@ public class TransferCompanyController extends BaseController {
.setSerialNo(record.getSerialNo()) .setSerialNo(record.getSerialNo())
.setFactoryNo(ticket.getWerks()) .setFactoryNo(ticket.getWerks())
.setWarehouseNo(qo.getLgort1()) .setWarehouseNo(qo.getLgort1())
.setBinNos(Objects.isNull(itemQo) ? Collections.emptyList() : StrUtil.split(itemQo.getBinNos(), "/")) .setBinNo(Objects.isNull(itemQo) ? "" : itemQo.getBinNos())
.setUniqNo(record.getUniqNo()) .setUniqNo(record.getUniqNo())
.setRspos(record.getRspos()) .setRspos(record.getRspos())
.setNum(record.getNum()) .setNum(record.getNum())

View File

@ -212,8 +212,8 @@ public class TransferFactoryController extends BaseController {
.setLgort(order.getLgort()) .setLgort(order.getLgort())
.setNum(item.getLeft()) .setNum(item.getLeft())
.setMeins(item.getMeins()) .setMeins(item.getMeins())
.setBinIn(StrUtil.join("/", storageService.getBinNos(item.getMatnr(), order.getWerks(), order.getUmlgo()))) .setBinIn(StrUtil.join("/", storageService.getBinNo(item.getMatnr(), order.getWerks(), order.getUmlgo())))
.setBinOut(StrUtil.join("/", storageService.getBinNos(item.getMatnr(), order.getWerks(), order.getLgort()))); .setBinOut(StrUtil.join("/", storageService.getBinNo(item.getMatnr(), order.getWerks(), order.getLgort())));
vo.setQiTao(type > 0); vo.setQiTao(type > 0);
if (Objects.equals(type, 1)) { if (Objects.equals(type, 1)) {
vo.setChildren(bomService.getChildrenVO(item.getMatnr())); vo.setChildren(bomService.getChildrenVO(item.getMatnr()));
@ -446,8 +446,8 @@ public class TransferFactoryController extends BaseController {
.setLgort(ticket.getLgort()) .setLgort(ticket.getLgort())
.setLgort1(ticket.getUmlgo()) .setLgort1(ticket.getUmlgo())
.setNum(it.getNum()) .setNum(it.getNum())
.setBinIn(StrUtil.join("/", storageService.getBinNos(it.getMatnr(), ticket.getWerks(), ticket.getUmlgo()))) .setBinIn(StrUtil.join("/", storageService.getBinNo(it.getMatnr(), ticket.getWerks(), ticket.getUmlgo())))
.setBinOut(StrUtil.join("/", storageService.getBinNos(it.getMatnr(), ticket.getWerks(), ticket.getLgort()))) .setBinOut(StrUtil.join("/", storageService.getBinNo(it.getMatnr(), ticket.getWerks(), ticket.getLgort())))
).toList()) ).toList())
); );
} }
@ -479,12 +479,13 @@ public class TransferFactoryController extends BaseController {
.setSerialNo(record.getSerialNo()) .setSerialNo(record.getSerialNo())
.setFactoryNo(ticket.getWerks()) .setFactoryNo(ticket.getWerks())
.setWarehouseNo(qo.getLgort1()) .setWarehouseNo(qo.getLgort1())
.setBinNos(StrUtil.split(qo.getItems() .setBinNo(qo.getItems()
.stream() .stream()
.filter(it -> Objects.equals(it.getId(), record.getTicketItemId())) .filter(it -> Objects.equals(it.getId(), record.getTicketItemId()))
.findFirst() .findFirst()
.orElse(new InSubmitItemQO()) .orElse(new InSubmitItemQO())
.getBinNos(), "/")) .getBinNos()
)
.setUniqNo(record.getUniqNo()) .setUniqNo(record.getUniqNo())
.setRspos(record.getRspos()) .setRspos(record.getRspos())
.setNum(record.getNum()) .setNum(record.getNum())

View File

@ -17,22 +17,7 @@ public class BinService {
@Resource @Resource
private IWmsStorageService storageService; private IWmsStorageService storageService;
@Resource public String getBinNo(String materialNo, String factory, String warehouseNo) {
private SapService sapService; return storageService.getBinNo(materialNo, factory, warehouseNo);
public String getBinNos(String materialNo, String factory, String warehouseNo) {
Set<String> bins = storageService.getBinNos(materialNo, factory, warehouseNo);
// if (CollectionUtil.isNotEmpty(bins)){
// return String.join("/",bins);
// }else {
// List<SAPSyncFromDTO> dtos = sapService.zwm3A01(factory, List.of(warehouseNo), List.of(materialNo), null, null);
// if (CollectionUtil.isEmpty(dtos)){
// log.error("{},{},{}未从SAP的ZWM3A01接口查询到数据", factory, warehouseNo, materialNo);
// return null;
// }else {
// return dtos.get(0).getBinNos();
// }
// }
return String.join("/",bins);
} }
} }

View File

@ -45,9 +45,9 @@ public class InMaterialScanRecord {
private String warehouseNo; private String warehouseNo;
/** /**
* 储位列表 * 储位
*/ */
private List<String> binNos; private String binNo;
/** /**
* 二维码内容 * 二维码内容

View File

@ -1,5 +1,6 @@
package com.nflg.wms.common.pojo.qo; package com.nflg.wms.common.pojo.qo;
import jakarta.validation.Valid;
import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotEmpty; import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.NotNull;
@ -16,15 +17,10 @@ public class InCostcenterBackSubmitItemQO {
@NotNull @NotNull
private Long orderItemId; private Long orderItemId;
/**
* 实际入库储位编号列表
*/
@NotBlank
private String binNos;
/** /**
* 二维码列表 * 二维码列表
*/ */
@Valid
@NotEmpty @NotEmpty
private List<String> qrCodes; private List<InCostcenterBackSubmitItemQRQO> items;
} }

View File

@ -0,0 +1,21 @@
package com.nflg.wms.common.pojo.qo;
import jakarta.validation.constraints.NotEmpty;
import lombok.Data;
import java.util.List;
@Data
public class InCostcenterBackSubmitItemQRQO {
/**
* 实际入库储位编号列表
*/
private String binNo;
/**
* 二维码列表
*/
@NotEmpty
private List<String> qrCodes;
}

View File

@ -1,5 +1,6 @@
package com.nflg.wms.common.pojo.qo; package com.nflg.wms.common.pojo.qo;
import jakarta.validation.Valid;
import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotEmpty; import jakarta.validation.constraints.NotEmpty;
import lombok.Data; import lombok.Data;
@ -21,6 +22,7 @@ public class InProduceBackSubmitQO {
/** /**
* 二维码列表 * 二维码列表
*/ */
@Valid
@NotEmpty @NotEmpty
private List<String> qrCodes; private List<InCostcenterBackSubmitItemQRQO> items;
} }

View File

@ -1,6 +1,8 @@
package com.nflg.wms.common.pojo.qo; package com.nflg.wms.common.pojo.qo;
import jakarta.validation.Valid;
import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotEmpty;
import lombok.Data; import lombok.Data;
import java.util.List; import java.util.List;
@ -17,15 +19,12 @@ public class InProduceOrderReceiveMaterialQO {
/** /**
* 仓库编号 * 仓库编号
*/ */
@NotBlank
private String warehouseNo; private String warehouseNo;
/**
* 储位编号列表
*/
private String binNos;
/** /**
* 二维码列表 * 二维码列表
*/ */
private List<String> qrCodes; @Valid
private List<InCostcenterBackSubmitItemQRQO> items;
} }

View File

@ -21,5 +21,5 @@ public class InProduceOrderReceiveQO {
*/ */
@Valid @Valid
@NotEmpty @NotEmpty
private List<InProduceOrderReceiveMaterialQO> items; private List<InProduceOrderReceiveMaterialQO> materials;
} }

View File

@ -55,7 +55,7 @@ public class InProduceOrderItemVO {
/** /**
* 储位 * 储位
*/ */
private String binNos; private String binNo;
/** /**
* 批次号 * 批次号

View File

@ -76,4 +76,10 @@ public class OutProduceItemVO {
public boolean getUseChildren() { public boolean getUseChildren() {
return CollectionUtil.isNotEmpty(children); return CollectionUtil.isNotEmpty(children);
} }
/**
* 是否启用储位管理
*/
@JsonProperty("isDisableLocation")
private Boolean isDisableLocation;
} }

View File

@ -29,7 +29,7 @@ public interface WmsStorageMapper extends BaseMapper<WmsStorage> {
List<String> getWarehouseNo(String factoryNo, String materialNo); List<String> getWarehouseNo(String factoryNo, String materialNo);
String getBinNos(String materialNo, String factoryNo, String warehouseNo); String getBinNo(String materialNo, String factoryNo, String warehouseNo);
List<StorageVO> searchNonSync(); List<StorageVO> searchNonSync();

View File

@ -32,4 +32,6 @@ public interface WmsWarehouseMapper extends BaseMapper<WmsWarehouse> {
List<WarehouseVO> getListByIds(List<Long> list); List<WarehouseVO> getListByIds(List<Long> list);
WarehouseVO getInfo(Long id); WarehouseVO getInfo(Long id);
Boolean isEnableLocation(String factoryNo, String warehouseNo);
} }

View File

@ -39,7 +39,7 @@ public interface IWmsStorageService extends IService<WmsStorage> {
List<String> getWarehouseNo(String factoryNo, String materialNo); List<String> getWarehouseNo(String factoryNo, String materialNo);
Set<String> getBinNos(String materialNo, @NotBlank String factoryNo, String warehouseNo); String getBinNo(String materialNo, @NotBlank String factoryNo, String warehouseNo);
List<StorageVO> searchNonSync(); List<StorageVO> searchNonSync();

View File

@ -43,4 +43,6 @@ public interface IWmsWarehouseService extends IService<WmsWarehouse> {
List<WarehouseVO> getListByIds(List<Long> list); List<WarehouseVO> getListByIds(List<Long> list);
WarehouseVO getInfo(Long id); WarehouseVO getInfo(Long id);
Boolean isEnableLocation(String factoryNo, String warehouseNo);
} }

View File

@ -102,8 +102,8 @@ public class WmsStorageServiceImpl extends ServiceImpl<WmsStorageMapper, WmsStor
} }
@Override @Override
public Set<String> getBinNos(String materialNo, String factoryNo, String warehouseNo) { public String getBinNo(String materialNo, String factoryNo, String warehouseNo) {
return new HashSet<>(StrUtil.split(baseMapper.getBinNos(materialNo,factoryNo,warehouseNo), ",")); return baseMapper.getBinNo(materialNo,factoryNo,warehouseNo);
} }
@Override @Override

View File

@ -120,4 +120,9 @@ public class WmsWarehouseServiceImpl extends ServiceImpl<WmsWarehouseMapper, Wms
public WarehouseVO getInfo(Long id) { public WarehouseVO getInfo(Long id) {
return baseMapper.getInfo(id); return baseMapper.getInfo(id);
} }
@Override
public Boolean isEnableLocation(String factoryNo, String warehouseNo) {
return baseMapper.isEnableLocation(factoryNo, warehouseNo);
}
} }

View File

@ -86,7 +86,7 @@
WHERE s.material_no = #{materialNo} and di."value" = #{factoryNo} WHERE s.material_no = #{materialNo} and di."value" = #{factoryNo}
</select> </select>
<select id="getBinNos" resultType="java.lang.String"> <select id="getBinNo" resultType="java.lang.String">
SELECT bin.no SELECT bin.no
FROM wms_storage s FROM wms_storage s
INNER JOIN wms_bin bin ON s.bin_id = bin.id INNER JOIN wms_bin bin ON s.bin_id = bin.id

View File

@ -77,4 +77,11 @@
left join dictionary_item di on w.factory_id = di.id left join dictionary_item di on w.factory_id = di.id
where w.id = #{id} where w.id = #{id}
</select> </select>
<select id="isEnableLocation" resultType="java.lang.Boolean">
SELECT wh.is_disable_location
FROM wms_warehouse wh
INNER JOIN dictionary_item di ON wh.factory_id=di."id"
WHERE di."value"=#{factoryNo} AND wh."no"=#{warehouseNo}
</select>
</mapper> </mapper>

View File

@ -11,6 +11,7 @@ import com.nflg.wms.common.pojo.qo.*;
import com.nflg.wms.common.pojo.vo.ShipmentMaterialCodeQRVO; import com.nflg.wms.common.pojo.vo.ShipmentMaterialCodeQRVO;
import com.nflg.wms.common.pojo.vo.ShipmentMaterialCodeItemVO; import com.nflg.wms.common.pojo.vo.ShipmentMaterialCodeItemVO;
import com.nflg.wms.common.util.EecExcelUtil; import com.nflg.wms.common.util.EecExcelUtil;
import com.nflg.wms.common.util.NumberUtil;
import com.nflg.wms.common.util.UserUtil; import com.nflg.wms.common.util.UserUtil;
import com.nflg.wms.common.util.VUtil; import com.nflg.wms.common.util.VUtil;
import com.nflg.wms.repository.entity.*; import com.nflg.wms.repository.entity.*;
@ -113,12 +114,35 @@ public class MaterialCodeController extends BaseController {
/** /**
* 清单-删除 * 清单-删除
*/ */
@Transactional
@PostMapping("delete") @PostMapping("delete")
public ApiResult<Void> delete(@RequestBody @NotEmpty List<Long> ids) { public ApiResult<Void> delete(@RequestBody @NotEmpty List<Long> ids) {
materialCodeService.lambdaUpdate() List<Long> idsForDelete = materialCodeService.lambdaQuery()
.select(WmsShipmentMaterialCode::getId)
.eq(WmsShipmentMaterialCode::getStatus, 0) .eq(WmsShipmentMaterialCode::getStatus, 0)
.in(WmsShipmentMaterialCode::getId, ids) .in(WmsShipmentMaterialCode::getId, ids)
.remove(); .list()
.stream()
.map(WmsShipmentMaterialCode::getId)
.toList();
if (CollectionUtil.isNotEmpty(idsForDelete)) {
materialCodeService.removeByIds(idsForDelete);
materialCodeForwardService.lambdaUpdate()
.in(WmsShipmentMaterialCodeForward::getMaterialCodeId)
.remove();
idsForDelete = materialCodeItemService.lambdaQuery()
.in(WmsShipmentMaterialCodeItem::getMaterialCodeId, idsForDelete)
.list()
.stream()
.map(WmsShipmentMaterialCodeItem::getId)
.toList();
if (CollectionUtil.isNotEmpty(idsForDelete)) {
materialCodeItemService.removeByIds(idsForDelete);
materialCodeItemQrService.lambdaUpdate()
.in(WmsShipmentMaterialCodeItemQr::getItemId, idsForDelete)
.remove();
}
}
return ApiResult.success(); return ApiResult.success();
} }
@ -193,21 +217,21 @@ public class MaterialCodeController extends BaseController {
log.debug("第{}行:{}", row.getRowNum(), row); log.debug("第{}行:{}", row.getRowNum(), row);
if (row.getRowNum() == 1) { if (row.getRowNum() == 1) {
materialCode.setCustomerName(row.getString(2)); materialCode.setCustomerName(row.getString(2));
VUtil.trueThrowBusinessError(StrUtil.isNotBlank(materialCode.getCustomerName())) VUtil.trueThrowBusinessError(StrUtil.isBlank(materialCode.getCustomerName()))
.throwMessage("客户名称不能为空"); .throwMessage("客户名称不能为空");
} else if (row.getRowNum() == 2) { } else if (row.getRowNum() == 2) {
materialCode.setDeviceNo(row.getString(2)); materialCode.setDeviceNo(row.getString(2));
VUtil.trueThrowBusinessError(StrUtil.isNotBlank(materialCode.getDeviceNo())) VUtil.trueThrowBusinessError(StrUtil.isBlank(materialCode.getDeviceNo()))
.throwMessage("设备编号不能为空"); .throwMessage("设备编号不能为空");
materialCode.setOrderDate(row.getLocalDate(6).format(DateTimeFormatter.ofPattern("yyyy-MM-dd"))); materialCode.setOrderDate(row.getLocalDate(6).format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
VUtil.trueThrowBusinessError(StrUtil.isNotBlank(materialCode.getOrderDate())) VUtil.trueThrowBusinessError(StrUtil.isBlank(materialCode.getOrderDate()))
.throwMessage("订单日期不能为空"); .throwMessage("订单日期不能为空");
} else if (row.getRowNum() == 3) { } else if (row.getRowNum() == 3) {
materialCode.setSoNo(row.getString(2)); materialCode.setSoNo(row.getString(2));
VUtil.trueThrowBusinessError(StrUtil.isNotBlank(materialCode.getSoNo())) VUtil.trueThrowBusinessError(StrUtil.isBlank(materialCode.getSoNo()))
.throwMessage("销售订单号不能为空"); .throwMessage("销售订单号不能为空");
materialCode.setMaterialNo(row.getString(6)); materialCode.setMaterialNo(row.getString(6));
VUtil.trueThrowBusinessError(StrUtil.isNotBlank(materialCode.getMaterialNo())) VUtil.trueThrowBusinessError(StrUtil.isBlank(materialCode.getMaterialNo()))
.throwMessage("设备料号不能为空"); .throwMessage("设备料号不能为空");
} else if (row.getRowNum() > 4 && StrUtil.isNotBlank(row.getString(1))) { } else if (row.getRowNum() > 4 && StrUtil.isNotBlank(row.getString(1))) {
WmsShipmentMaterialCodeItem item = new WmsShipmentMaterialCodeItem(); WmsShipmentMaterialCodeItem item = new WmsShipmentMaterialCodeItem();
@ -225,6 +249,8 @@ public class MaterialCodeController extends BaseController {
item.setBoxNo(row.getString(9)); item.setBoxNo(row.getString(9));
item.setCreateBy(UserUtil.getUserName()); item.setCreateBy(UserUtil.getUserName());
item.setCreateTime(LocalDateTime.now()); item.setCreateTime(LocalDateTime.now());
item.setPackingNum(NumberUtil.calculateLabelNum(item.getNum(), item.getMinPackagingNum()));
item.setPackingLeft(item.getPackingNum());
items.add(item); items.add(item);
qrs.add(new WmsShipmentMaterialCodeItemQr() qrs.add(new WmsShipmentMaterialCodeItemQr()
.setItemId(item.getId()) .setItemId(item.getId())
@ -271,18 +297,20 @@ public class MaterialCodeController extends BaseController {
item.setId(IdUtil.getSnowflakeNextId()); item.setId(IdUtil.getSnowflakeNextId());
item.setCreateBy(UserUtil.getUserName()); item.setCreateBy(UserUtil.getUserName());
item.setCreateTime(LocalDateTime.now()); item.setCreateTime(LocalDateTime.now());
BigDecimal result = item.getNum().divide(item.getMinPackagingNum(), 3, RoundingMode.HALF_UP); // BigDecimal result = item.getNum().divide(item.getMinPackagingNum(), 3, RoundingMode.HALF_UP);
BigDecimal decimalValue = result.remainder(BigDecimal.ONE); // BigDecimal decimalValue = result.remainder(BigDecimal.ONE);
item.setPackingNum(decimalValue.compareTo(BigDecimal.ZERO) > 0 ? result.intValue() + 1 : result.intValue()); // item.setPackingNum(decimalValue.compareTo(BigDecimal.ZERO) > 0 ? result.intValue() + 1 : result.intValue());
item.setPackingNum(NumberUtil.calculateLabelNum(item.getNum(), item.getMinPackagingNum()));
item.setPackingLeft(item.getPackingNum()); item.setPackingLeft(item.getPackingNum());
int count = decimalValue.compareTo(BigDecimal.ZERO) > 0 ? result.intValue() + 1 : result.intValue(); // int count = decimalValue.compareTo(BigDecimal.ZERO) > 0 ? result.intValue() + 1 : result.intValue();
for (int i = 1; i <= item.getPackingNum(); i++) { for (int i = 1; i <= item.getPackingNum(); i++) {
materialCodeItemQrService.save(new WmsShipmentMaterialCodeItemQr() materialCodeItemQrService.save(new WmsShipmentMaterialCodeItemQr()
.setItemId(item.getId()) .setItemId(item.getId())
.setNo(KeyUtil.next()) .setNo(KeyUtil.next())
.setNum(i == count && decimalValue.compareTo(BigDecimal.ZERO) > 0 ? decimalValue : item.getMinPackagingNum()) // .setNum(i == count && decimalValue.compareTo(BigDecimal.ZERO) > 0 ? decimalValue : item.getMinPackagingNum())
.setCreateBy(UserUtil.getUserName()) .setNum(NumberUtil.getPackageNum(item.getNum(), item.getMinPackagingNum(), item.getPackingNum(), i))
.setCreateTime(LocalDateTime.now()) .setCreateBy(UserUtil.getUserName())
.setCreateTime(LocalDateTime.now())
); );
} }
materialCodeItemService.save(item); materialCodeItemService.save(item);
@ -318,16 +346,17 @@ public class MaterialCodeController extends BaseController {
materialCodeItemQrService.lambdaUpdate() materialCodeItemQrService.lambdaUpdate()
.eq(WmsShipmentMaterialCodeItemQr::getItemId, item.getId()) .eq(WmsShipmentMaterialCodeItemQr::getItemId, item.getId())
.remove(); .remove();
BigDecimal result = item.getNum().divide(item.getMinPackagingNum(), 3, RoundingMode.HALF_UP); // BigDecimal result = item.getNum().divide(item.getMinPackagingNum(), 3, RoundingMode.HALF_UP);
BigDecimal decimalValue = result.remainder(BigDecimal.ONE); // BigDecimal decimalValue = result.remainder(BigDecimal.ONE);
item.setPackingNum(decimalValue.compareTo(BigDecimal.ZERO) > 0 ? result.intValue() + 1 : result.intValue()); // item.setPackingNum(decimalValue.compareTo(BigDecimal.ZERO) > 0 ? result.intValue() + 1 : result.intValue());
item.setPackingNum(NumberUtil.calculateLabelNum(item.getNum(), item.getMinPackagingNum()));
item.setPackingLeft(item.getPackingNum()); item.setPackingLeft(item.getPackingNum());
int count = decimalValue.compareTo(BigDecimal.ZERO) > 0 ? result.intValue() + 1 : result.intValue(); // int count = decimalValue.compareTo(BigDecimal.ZERO) > 0 ? result.intValue() + 1 : result.intValue();
for (int i = 1; i <= item.getPackingNum(); i++) { for (int i = 1; i <= item.getPackingNum(); i++) {
materialCodeItemQrService.save(new WmsShipmentMaterialCodeItemQr() materialCodeItemQrService.save(new WmsShipmentMaterialCodeItemQr()
.setItemId(item.getId()) .setItemId(item.getId())
.setNo(KeyUtil.next()) .setNo(KeyUtil.next())
.setNum(i == count && decimalValue.compareTo(BigDecimal.ZERO) > 0 ? decimalValue : item.getMinPackagingNum()) .setNum(NumberUtil.getPackageNum(item.getNum(), item.getMinPackagingNum(), item.getPackingNum(), i))
.setCreateBy(UserUtil.getUserName()) .setCreateBy(UserUtil.getUserName())
.setCreateTime(LocalDateTime.now()) .setCreateTime(LocalDateTime.now())
); );
@ -551,7 +580,7 @@ public class MaterialCodeController extends BaseController {
return exportItemZip(datas); return exportItemZip(datas);
} }
private ResponseEntity<byte[]> exportItemZip(List<ShipmentMaterialCodeQRVO> datas) throws Exception{ private ResponseEntity<byte[]> exportItemZip(List<ShipmentMaterialCodeQRVO> datas) throws Exception {
Map<String, String> iamges = materialService.lambdaQuery() Map<String, String> iamges = materialService.lambdaQuery()
.select(WmsShipmentMaterial::getNo, WmsShipmentMaterial::getImage) .select(WmsShipmentMaterial::getNo, WmsShipmentMaterial::getImage)
.in(WmsShipmentMaterial::getNo, datas.stream().map(ShipmentMaterialCodeQRVO::getMaterialNo).collect(Collectors.toSet())) .in(WmsShipmentMaterial::getNo, datas.stream().map(ShipmentMaterialCodeQRVO::getMaterialNo).collect(Collectors.toSet()))