Merge remote-tracking branch 'origin/master'

liweidong
李涛 2 weeks ago
commit af7559538e
  1. 2
      blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/dashboard/pojo/entity/DsPartEntity.java
  2. 13
      blade-service/blade-desk/src/main/java/org/springblade/desk/order/service/impl/PlateGoodsRecordServiceImpl.java
  3. 4
      blade-service/blade-wms/src/main/java/org/springblade/wms/mapper/StRealtimeStockMapper.xml
  4. 33
      blade-service/blade-wms/src/main/java/org/springblade/wms/service/impl/StErpWarehouseTransferServiceImpl.java
  5. 11
      blade-service/blade-wms/src/main/java/org/springblade/wms/service/impl/StOtherReceiptRecordServiceImpl.java
  6. 48
      blade-service/blade-wms/src/main/java/org/springblade/wms/service/impl/StRequisitionServiceImpl.java

@ -159,7 +159,7 @@ public class DsPartEntity extends BaseEntity {
* 镀层厚度 * 镀层厚度
*/ */
@Schema(description = "镀层厚度") @Schema(description = "镀层厚度")
private Double plateThickness; private String plateThickness;
/** /**
* 镀层物料 * 镀层物料
*/ */

@ -259,7 +259,7 @@ public class PlateGoodsRecordServiceImpl extends BaseServiceImpl<PlateGoodsRecor
} }
} }
if(StringUtils.isNotEmpty(plateGoodsCode) && isContains){ if(StringUtils.isNotEmpty(plateGoodsCode) && isContains){
Double h1 = dsPart.getPlateThickness(); Double h1 = getPlateThicknessAsDouble(dsPart);
Double h2 = dsPart.getPlateThicknessTwo(); Double h2 = dsPart.getPlateThicknessTwo();
Double s1 = dsPart.getArea(); Double s1 = dsPart.getArea();
Double s2 = dsPart.getAreaTwo(); Double s2 = dsPart.getAreaTwo();
@ -442,6 +442,17 @@ public class PlateGoodsRecordServiceImpl extends BaseServiceImpl<PlateGoodsRecor
return true; return true;
} }
public Double getPlateThicknessAsDouble(DsPartEntity dsPart) {
if (dsPart.getPlateThickness() == null || dsPart.getPlateThickness().trim().isEmpty()) {
return 0.0;
}
try {
return Double.valueOf(dsPart.getPlateThickness());
} catch (NumberFormatException e) {
log.warn("厚度格式错误: {}", dsPart.getPlateThickness());
return 0.0;
}
}
@Override @Override

@ -556,8 +556,8 @@
AND t.sl_id = #{slId} -- 库位ID匹配 AND t.sl_id = #{slId} -- 库位ID匹配
AND t.pi_no IS NOT NULL -- 过滤空批次号 AND t.pi_no IS NOT NULL -- 过滤空批次号
AND t.is_deleted = 0 -- 过滤已删除的库存数据 AND t.is_deleted = 0 -- 过滤已删除的库存数据
AND t.stock_quantity > 0 -- 核心新增:库存数量不等于0 AND t.quantity > 0 -- 核心新增:库存数量不等于0
AND t.stock_quantity IS NOT NULL AND t.quantity IS NOT NULL
</select> </select>
<select id="findByPiNoAndGoodsCode" resultMap="stRealtimeStockResultMap"> <select id="findByPiNoAndGoodsCode" resultMap="stRealtimeStockResultMap">

@ -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