仓库管理修改

liweidong
wusiyu 2 weeks ago
parent 70e3158d3b
commit fb66fff565
  1. 33
      blade-service/blade-wms/src/main/java/org/springblade/wms/service/impl/StErpWarehouseTransferServiceImpl.java
  2. 11
      blade-service/blade-wms/src/main/java/org/springblade/wms/service/impl/StOtherReceiptRecordServiceImpl.java
  3. 48
      blade-service/blade-wms/src/main/java/org/springblade/wms/service/impl/StRequisitionServiceImpl.java

@ -5,6 +5,7 @@ import cn.hutool.core.util.NumberUtil;
import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import jakarta.annotation.Resource; import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springblade.core.log.exception.ServiceException; import org.springblade.core.log.exception.ServiceException;
@ -12,6 +13,7 @@ import org.springblade.core.mp.base.BaseServiceImpl;
import org.springblade.core.secure.BladeUser; import org.springblade.core.secure.BladeUser;
import org.springblade.wms.excel.StErpWarehouseTransferExcel; import org.springblade.wms.excel.StErpWarehouseTransferExcel;
import org.springblade.wms.mapper.StErpWarehouseTransferMapper; import org.springblade.wms.mapper.StErpWarehouseTransferMapper;
import org.springblade.wms.mapper.StUserRightMapper;
import org.springblade.wms.pojo.entity.*; import org.springblade.wms.pojo.entity.*;
import org.springblade.wms.pojo.vo.StErpWarehouseTransferVO; import org.springblade.wms.pojo.vo.StErpWarehouseTransferVO;
import org.springblade.wms.service.*; import org.springblade.wms.service.*;
@ -45,6 +47,8 @@ public class StErpWarehouseTransferServiceImpl extends BaseServiceImpl<StErpWare
private IStStorageLocationService stStorageLocationService; private IStStorageLocationService stStorageLocationService;
@Resource @Resource
private IStWarehouseTransferRecordService stWarehouseTransferRecordService; private IStWarehouseTransferRecordService stWarehouseTransferRecordService;
@Resource
private StUserRightMapper stUserRightMapper;
@Override @Override
public IPage<StErpWarehouseTransferVO> selectStErpWarehouseTransferPage(IPage<StErpWarehouseTransferVO> page, StErpWarehouseTransferVO stErpWarehouseTransfer) { public IPage<StErpWarehouseTransferVO> selectStErpWarehouseTransferPage(IPage<StErpWarehouseTransferVO> page, StErpWarehouseTransferVO stErpWarehouseTransfer) {
@ -63,9 +67,36 @@ public class StErpWarehouseTransferServiceImpl extends BaseServiceImpl<StErpWare
Double totalPutQuantity = Double totalPutQuantity =
BigDecimal.valueOf(transfer.getPutQuantity()).add(BigDecimal.valueOf(putQuantity)).doubleValue(); BigDecimal.valueOf(transfer.getPutQuantity()).add(BigDecimal.valueOf(putQuantity)).doubleValue();
if (totalPutQuantity > transfer.getOutQuantity()) { if (totalPutQuantity > transfer.getOutQuantity()) {
throw new ServiceException("入库数量不能大于出库数量"); throw new ServiceException("入库数量不能大于ERP出库数量");
}
String urTypeStorehouse = StUserRight.UR_TYPE_STOREHOUSE;
// 查询用户是否有该库房的操作权限
Long count = stUserRightMapper.selectCount(Wrappers.lambdaQuery(StUserRight.class)
.eq(StUserRight::getUserId, user.getUserId())
.eq(StUserRight::getTheId, shId)
.eq(StUserRight::getUrType, urTypeStorehouse)
.eq(StUserRight::getIsDeleted, 0)
);
// 无权限 → 直接拦截
if (count == null || count == 0) {
throw new ServiceException("您无当前库房操作权限,不允许入库!");
} }
StStorageLocation location = stStorageLocationService.getById(slId);
List<String> piNos = stRealtimeStockService.findBySlIdAndGoodsCode(slId, location.getGoodsCode());
String transferPino = transfer.getBatchCode();
if (CollUtil.isNotEmpty(piNos)) {
// 库位已有库存 → 必须和转移单 pino 一致
boolean pinoMatch = piNos.stream().anyMatch(p -> p.equals(transferPino));
if (!pinoMatch) {
throw new ServiceException("批次号不匹配!当前库位批次:" + piNos + ",转移单批次:" + transferPino);
}
}
/* 1. 主账单(无 ID 则新增)*/ /* 1. 主账单(无 ID 则新增)*/
StStockInoutRecord inout = new StStockInoutRecord(); StStockInoutRecord inout = new StStockInoutRecord();
inout.setSirCode(stStockInoutRecordService.generateCode()); inout.setSirCode(stStockInoutRecordService.generateCode());

@ -112,6 +112,17 @@ public class StOtherReceiptRecordServiceImpl extends BaseServiceImpl<StOtherRece
throw new RuntimeException("库存更新失败:商品ID、库位ID不能为空,入库数量必须大于0"); throw new RuntimeException("库存更新失败:商品ID、库位ID不能为空,入库数量必须大于0");
} }
StStorageLocation location = stStorageLocationService.getById(detail.getSlId());
List<String> piNos = stRealtimeStockService.findBySlIdAndGoodsCode(detail.getSlId(), location.getGoodsCode());
String detailPiNo = detail.getPiNo();
if (CollUtil.isNotEmpty(piNos)) {
// 库位已有库存 → 必须和转移单 pino 一致
boolean pinoMatch = piNos.stream().anyMatch(p -> p.equals(detailPiNo));
if (!pinoMatch) {
throw new ServiceException("批次号不匹配!当前库位批次:" + piNos + ",其他入库批次:" + detailPiNo);
}
}
// detail.setSirCode(stStockInoutRecordService.generateCode()); // detail.setSirCode(stStockInoutRecordService.generateCode());
detail.setInOutSource(StStockInoutRecord.INOUT_SOURCE_OTHER_PURCHASE_RECEIPT); detail.setInOutSource(StStockInoutRecord.INOUT_SOURCE_OTHER_PURCHASE_RECEIPT);
// 赋值公共属性:批次号、入库单关联ID、部门/创建人 // 赋值公共属性:批次号、入库单关联ID、部门/创建人

@ -1,11 +1,13 @@
package org.springblade.wms.service.impl; package org.springblade.wms.service.impl;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DateUtil; import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import jakarta.annotation.Resource; import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpServletResponse; import jakarta.servlet.http.HttpServletResponse;
import net.sourceforge.barbecue.Barcode; import net.sourceforge.barbecue.Barcode;
@ -18,10 +20,12 @@ import org.springblade.core.mp.base.BaseServiceImpl;
import org.springblade.core.secure.BladeUser; import org.springblade.core.secure.BladeUser;
import org.springblade.wms.excel.StRequisitionExcel; import org.springblade.wms.excel.StRequisitionExcel;
import org.springblade.wms.mapper.StRequisitionMapper; import org.springblade.wms.mapper.StRequisitionMapper;
import org.springblade.wms.mapper.StUserRightMapper;
import org.springblade.wms.pojo.dto.StRequisitionDTO; import org.springblade.wms.pojo.dto.StRequisitionDTO;
import org.springblade.wms.pojo.entity.StGoods; import org.springblade.wms.pojo.entity.StGoods;
import org.springblade.wms.pojo.entity.StRequisition; import org.springblade.wms.pojo.entity.StRequisition;
import org.springblade.wms.pojo.entity.StStockInoutRecord; import org.springblade.wms.pojo.entity.StStockInoutRecord;
import org.springblade.wms.pojo.entity.StUserRight;
import org.springblade.wms.pojo.vo.StRequisitionVO; import org.springblade.wms.pojo.vo.StRequisitionVO;
import org.springblade.wms.service.*; import org.springblade.wms.service.*;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@ -52,6 +56,8 @@ public class StRequisitionServiceImpl extends BaseServiceImpl<StRequisitionMappe
IStGoodsService stGoodsService; IStGoodsService stGoodsService;
@Resource @Resource
IStRealtimeStockService stRealtimeStockService; IStRealtimeStockService stRealtimeStockService;
@Resource
StUserRightMapper stUserRightMapper;
@Override @Override
public IPage<StRequisitionVO> selectStRequisitionPage(IPage<StRequisitionVO> page, StRequisitionVO stRequisition) { public IPage<StRequisitionVO> selectStRequisitionPage(IPage<StRequisitionVO> page, StRequisitionVO stRequisition) {
return page.setRecords(baseMapper.selectStRequisitionPage(page, stRequisition)); return page.setRecords(baseMapper.selectStRequisitionPage(page, stRequisition));
@ -198,29 +204,21 @@ public class StRequisitionServiceImpl extends BaseServiceImpl<StRequisitionMappe
@Override @Override
public Map<String, Object> getBarCode(Long srId) { public Map<String, Object> getBarCode(Long srId) {
// 1. 初始化返回数据结构(与原有getBarCode方法保持一致)
// Map<String, Object> data = new HashMap<>(1);
// List<Map<String, String>> list = new ArrayList<>();
// Map<String, String> map = new HashMap<>();
Map<String, Object> resultMap = new HashMap<>(2); Map<String, Object> resultMap = new HashMap<>(2);
StRequisition stRequisition = getById(srId); StRequisition stRequisition = getById(srId);
// 2. 核心:处理出库单号,生成条形码(Base64格式) // 处理出库单号,生成条形码(Base64格式)
// 出库单号原值(空则显示"/") // 出库单号原值(空则显示"/")
String invadjCodeValue = StringUtils.isNotBlank(stRequisition.getInvadjCode()) ? stRequisition.getInvadjCode() : "/"; String invadjCodeValue = StringUtils.isNotBlank(stRequisition.getInvadjCode()) ? stRequisition.getInvadjCode() : "/";
resultMap.put("invadjCode", invadjCodeValue); resultMap.put("invadjCode", invadjCodeValue);
// 生成出库单号条形码(尺寸:宽300,高80,可根据打印需求调整) // 生成出库单号条形码(尺寸:宽300,高80,可根据打印需求调整)
resultMap.put("invadjCodeBar", generateBarcodeAsBase64(invadjCodeValue, 200, 50)); resultMap.put("invadjCodeBar", generateBarcodeAsBase64(invadjCodeValue, 200, 50));
String buyCodeValue = StringUtils.isNotBlank(stRequisition.getBuyCode()) ? stRequisition.getBuyCode() : "/"; String goodsCodeValue = StringUtils.isNotBlank(stRequisition.getPrtno()) ? stRequisition.getPrtno() : "/";
resultMap.put("buyCode", buyCodeValue); resultMap.put("goodsCode", goodsCodeValue);
// 生成出库单号条形码(尺寸:宽300,高80,可根据打印需求调整) // 生成出库单号条形码(尺寸:宽300,高80,可根据打印需求调整)
resultMap.put("buyCodeBar", generateBarcodeAsBase64(buyCodeValue, 200, 50)); resultMap.put("goodsCodeBar", generateBarcodeAsBase64(goodsCodeValue, 200, 50));
// 4. 组装返回数据(与原有方法结构统一)
// list.add(map);
// data.put("data", list);
return resultMap; return resultMap;
} }
@ -251,6 +249,32 @@ public class StRequisitionServiceImpl extends BaseServiceImpl<StRequisitionMappe
if (ObjectUtil.isNull(requisition)) { if (ObjectUtil.isNull(requisition)) {
throw new ServiceException("领料单不存在,ID:" + srId); throw new ServiceException("领料单不存在,ID:" + srId);
} }
String urTypeStorehouse = StUserRight.UR_TYPE_STOREHOUSE;
// 查询用户是否有该库房的操作权限
Long count = stUserRightMapper.selectCount(Wrappers.lambdaQuery(StUserRight.class)
.eq(StUserRight::getUserId, user.getUserId())
.eq(StUserRight::getTheId, shId)
.eq(StUserRight::getUrType, urTypeStorehouse)
.eq(StUserRight::getIsDeleted, 0)
);
// 无权限 → 直接拦截
if (count == null || count == 0) {
throw new ServiceException("您无当前库房操作权限,不允许入库!");
}
List<String> piNos = stRealtimeStockService.findBySlIdAndGoodsCode(slId, requisition.getPrtno());
String requisitionPiNo = requisition.getPiNo();
if (CollUtil.isNotEmpty(piNos)) {
// 库位已有库存 → 必须和转移单 pino 一致
boolean pinoMatch = piNos.stream().anyMatch(p -> p.equals(requisitionPiNo));
if (!pinoMatch) {
throw new ServiceException("批次号不匹配!当前库位批次:" + piNos + ",物料入库批次:" + requisitionPiNo);
}
}
requisition.setCurStatus(StRequisition.CUR_STATUS_PUSH); requisition.setCurStatus(StRequisition.CUR_STATUS_PUSH);
baseMapper.updateById(requisition); baseMapper.updateById(requisition);

Loading…
Cancel
Save