仓库管理修改

liweidong
wusiyu 9 hours ago
parent c91a63e051
commit 25058bda3f
  1. 8
      blade-service-api/blade-erpdata-api/src/main/java/org/springblade/erpdata/feign/IErpDataWmsClient.java
  2. 5
      blade-service-api/blade-erpdata-api/src/main/java/org/springblade/erpdata/feign/IErpDataWmsClientFallback.java
  3. 20
      blade-service-api/blade-wms-api/src/main/java/org/springblade/wms/pojo/dto/StockOccupyTempDTO.java
  4. 25
      blade-service-api/blade-wms-api/src/main/java/org/springblade/wms/pojo/dto/SubItemStockDTO.java
  5. 5
      blade-service-api/blade-wms-api/src/main/java/org/springblade/wms/pojo/entity/StGlassCakeOut.java
  6. 5
      blade-service-api/blade-wms-api/src/main/java/org/springblade/wms/pojo/entity/StGoods.java
  7. 12
      blade-service-api/blade-wms-api/src/main/java/org/springblade/wms/pojo/entity/StGraphiteMoldOut.java
  8. 5
      blade-service/blade-erpdata/src/main/java/org/springblade/erpdata/feign/ErpDataWmsClient.java
  9. 2
      blade-service/blade-erpdata/src/main/java/org/springblade/erpdata/service/IErpDataWmsService.java
  10. 36
      blade-service/blade-erpdata/src/main/java/org/springblade/erpdata/service/impl/ErpDataWmsServiceImpl.java
  11. 27
      blade-service/blade-wms/src/main/java/org/springblade/wms/service/impl/StBuyOrderServiceImpl.java
  12. 14
      blade-service/blade-wms/src/main/java/org/springblade/wms/service/impl/StGlassCakeOutServiceImpl.java
  13. 178
      blade-service/blade-wms/src/main/java/org/springblade/wms/service/impl/StGraphiteMoldOutServiceImpl.java
  14. 28
      blade-service/blade-wms/src/main/java/org/springblade/wms/service/impl/StOtherReceiptRecordServiceImpl.java
  15. 5
      blade-service/blade-wms/src/main/java/org/springblade/wms/service/impl/StRealtimeStockServiceImpl.java

@ -48,6 +48,8 @@ public interface IErpDataWmsClient {
String GET_MAINTEN_STATUS = API_PREFIX + "/getMaintenStatus";
String SEND_RBFIRT_CHK = API_PREFIX + "/sendRbfirtChk";
/**
* 到期送检发送erp
*/
@ -90,6 +92,12 @@ public interface IErpDataWmsClient {
@RequestParam("needDate") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") Date needDate,
@RequestParam("flag")String flag ,@RequestParam("checkQty")Double checkQty, @RequestParam("quantityLevel")String quantityLevel) throws BusinessException;
/**
* 额外玻璃粉验证
*/
@PostMapping(SEND_RBFIRT_CHK)
R<String> sendRbfirtChk(@RequestParam("goodsCode")String goodsCode, @RequestParam("goodsName")String goodsName) throws BusinessException;
/**
* 物料状态监控同步
*/

@ -57,6 +57,11 @@ public class IErpDataWmsClientFallback implements IErpDataWmsClient{
return R.fail("获取数据失败");
}
@Override
public R<String> sendRbfirtChk(@RequestParam("goodsCode")String goodsCode, @RequestParam("goodsName")String goodsName) {
return R.fail("获取数据失败");
}
@Override
public R<StGoodsExtStatusVO> getGoodsExtStatus(@RequestParam("goodsCode")String goodsCode) {
return R.fail("获取数据失败");

@ -0,0 +1,20 @@
package org.springblade.wms.pojo.dto;
import lombok.Data;
import org.springblade.wms.pojo.entity.StRealtimeStock;
/**
* @version 1.0
* @program: jonhon-mes-svr
* @ClassName StockOccupyTempDTO
* @description:
* @autor: WuSiYu
* @create 2026-06-02 18:06
**/
@Data
public class StockOccupyTempDTO {
private String subGoodsCode;
private StRealtimeStock stock;
private Double takeQty;
}

@ -0,0 +1,25 @@
package org.springblade.wms.pojo.dto;
import lombok.Data;
import org.springblade.wms.pojo.entity.StRealtimeStock;
import java.util.List;
/**
* @version 1.0
* @program: jonhon-mes-svr
* @ClassName SubItemStockDTO
* @description:
* @autor: WuSiYu
* @create 2026-06-02 17:49
**/
@Data
public class SubItemStockDTO {
private String subGoodsCode;
// 单套耗用
private Double singleUseQty;
private List<StRealtimeStock> stockList;
// 剩余可用总库存(动态扣减)
private Double remainUsable;
}

@ -138,6 +138,11 @@ public class StGlassCakeOut extends TenantEntity {
*/
@Schema(description = "领料人ID")
private Long picker;
/**
* 预出数量
*/
@Schema(description = "预出数量")
private Double preOutQty;
/**
* 是否印字
*/

@ -277,6 +277,11 @@ public class StGoods extends BaseEntity {
*/
@Schema(description = "生产批量")
private Double productionBatch;
/**
* 换算比例
*/
@Schema(description = "换算比例")
private Double conversionRatio;
@TableField(exist = false)
private Double avlQuantity;

@ -148,4 +148,16 @@ public class StGraphiteMoldOut extends TenantEntity {
@Schema(description = "领料人ID")
private Long picker;
/**
* 父出库号
*/
@Schema(description = "父出库号")
private String parentOutCode;
/**
* 齐套数量
*/
@Schema(description = "齐套数量")
private Double completeQuantity;
}

@ -62,6 +62,11 @@ public class ErpDataWmsClient implements IErpDataWmsClient{
return R.data(erpDataWmsService.sendErpMaintenance(goodsCode, shCode, location, needDate, flag, checkQty, quantityLevel));
}
@Override
public R<String> sendRbfirtChk(String goodsCode, String goodsName) throws BusinessException {
return R.data(erpDataWmsService.sendRbfirtChk(goodsCode, goodsName));
}
@Override
public R<StGoodsExtStatusVO> getGoodsExtStatus(String goodsCode) {
return R.data(erpDataWmsService.getGoodsExtStatus(goodsCode));

@ -36,4 +36,6 @@ public interface IErpDataWmsService {
String sendErpMaintenance(String goodsCode, String shCode, String location, Date needDate, String flag, Double checkQty, String quantityLevel) throws BusinessException;
MeasuringToolMaintainVO getMaintenStatus(String goodsCode, String shCode, String location, Date createTime);
String sendRbfirtChk(String goodsCode, String goodsName) throws BusinessException;
}

@ -305,6 +305,42 @@ public class ErpDataWmsServiceImpl implements IErpDataWmsService {
return excflag;
}
@Override
public String sendRbfirtChk(String goodsCode, String goodsName) throws BusinessException {
SimpleJdbcCall jdbcCall = new SimpleJdbcCall(jdbcTemplate)
// 指定存储过程名 + DB Link(和原代码一致)
.withProcedureName("dba_mgr.pro_firtchk")
// DBLink 必须关闭元数据访问
.withoutProcedureColumnMetaDataAccess()
// 显式声明参数(顺序必须和存储过程定义一致)
.declareParameters(
new SqlParameter("v_prtno", Types.VARCHAR), // IN 物料号
new SqlParameter("v_prtdesc", Types.VARCHAR), // IN 物料名称
new SqlParameter("v_desno", Types.VARCHAR), // IN 设计通知单号
new SqlOutParameter("v_excnote", Types.VARCHAR),// OUT 异常信息
new SqlOutParameter("v_excflag", Types.VARCHAR) // OUT 执行标识
);
// 封装输入参数
Map<String, Object> inParams = new HashMap<>();
inParams.put("v_prtno", goodsCode == null ? "" : goodsCode);
inParams.put("v_prtdesc", goodsName == null ? "" : goodsName);
inParams.put("v_desno", null);
// 执行存储过程
Map<String, Object> resultMap = jdbcCall.execute(inParams);
// 提取输出参数
String excflag = (String) resultMap.get("v_excflag");
String excnote = (String) resultMap.get("v_excnote");
// 业务异常判断
if ("0".equals(excflag)) {
throw new BusinessException("玻璃粉验证通知单发送失败,请联系信息部!!! " + excnote);
}
return excflag;
}
@Override
public StGoodsExtStatusVO getGoodsExtStatus(String goodsCode){
return erpDataWmsMapper.getGoodsExtStatus(goodsCode);

@ -7,6 +7,7 @@ import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springblade.common.exception.BusinessException;
import org.springblade.core.log.exception.ServiceException;
import org.springblade.core.mp.base.BaseServiceImpl;
import org.springblade.core.secure.BladeUser;
@ -193,7 +194,7 @@ public class StBuyOrderServiceImpl extends BaseServiceImpl<StBuyOrderMapper, StB
R<String> roleName = sysClient.getRoleName(approvalRecord.getCurrentRoleId());
String roleNameData = roleName.getData();
approvalRecord.setCurrentRoleName(roleNameData);
approvalRecord.setNextRoleName("热表-核算员");
approvalRecord.setNextRoleName("厂内核算员");
//租户ID 000000
R<String> roleIdResp = sysClient.getRoleIds("000000", approvalRecord.getNextRoleName());
String roleId = roleIdResp.getData();
@ -207,10 +208,17 @@ public class StBuyOrderServiceImpl extends BaseServiceImpl<StBuyOrderMapper, StB
}
}
// 3. 玻璃物料发送校验(原逻辑完全保留)
StGoods goods = stGoodsService.getById(sb.getGoodsId());
if (sb.getGoodsId() != null && StrUtil.contains(goods.getGoodsName(), "玻璃")) {
this.sendRbfirtChk(goods.getGoodsCode(), goods.getGoodsName());
// 3. 玻璃物料发送校验
for (StBuyOrder buyOrder : list) {
StGoods goods = stGoodsService.getById(buyOrder.getGoodsId());
if (buyOrder.getGoodsId() != null && StrUtil.contains(goods.getGoodsName(), "玻璃")) {
try {
erpDataWmsClient.sendRbfirtChk(goods.getGoodsCode(), goods.getGoodsName());
} catch (BusinessException e) {
throw new RuntimeException("玻璃粉验证通知单发送失败:" + e.getMessage());
}
}
}
}
@ -313,8 +321,8 @@ public class StBuyOrderServiceImpl extends BaseServiceImpl<StBuyOrderMapper, StB
R<User> ruser = userClient.userInfoById(bo.getDeclareMan());
User declareMan = ruser.getData();
dto.setReqctlr(declareMan.getAccount()); // 当前登录人
dto.setCheckdate(bo.getCheckDate() == null ? "" : DateUtil.format(bo.getCheckDate(), "yyyy-MM-dd"));
R<User> userR = userClient.userInfoById(bo.getCheckMan());
dto.setCheckdate(bo.getCheckDate() == null ? "" : DateUtil.format(bo.getApprovalTime2(), "yyyy-MM-dd"));
R<User> userR = userClient.userInfoById(bo.getApprovalMan2());
User checkMan = userR.getData();
dto.setCheckman(checkMan.getAccount() == null ? "" : checkMan.getAccount());
pdList.add(dto);
@ -349,7 +357,7 @@ public class StBuyOrderServiceImpl extends BaseServiceImpl<StBuyOrderMapper, StB
bo.setBoCode(this.nextCode());
bo.setGoodsId(goods.getId());
bo.setGrade(goods.getGrade());
bo.setBuyMan(userId);
// bo.setBuyMan(userId);
User user = userClient.userInfoById(userId).getData();
bo.setBuyDept(Long.valueOf(user.getDeptId()));
bo.setDeclareMan(userId);
@ -368,6 +376,9 @@ public class StBuyOrderServiceImpl extends BaseServiceImpl<StBuyOrderMapper, StB
bo.setPickStatus("新建");
bo.setApprovalStatus(StBuyOrder.APPROVAL_STATUS_CHECKED);
if (goods.getConversionRatio() != null) {
bo.setBuyQty(buyQty / goods.getConversionRatio());
}
this.save(bo);
List<StBuyOrder> list = new ArrayList<>();

@ -283,10 +283,12 @@ public class StGlassCakeOutServiceImpl extends BaseServiceImpl<StGlassCakeOutMap
preOutStock.setPartCode(faYieldOrder.getPartCode());
preOutStock.setPartName(faYieldOrder.getPartName());
lastNum++;
String sirCode = datePrefix + StrUtil.padPre(String.valueOf(lastNum), 4, '0');
preOutStock.setOutCode(sirCode);
// preOutStock.setOutCode(stStockInoutRecordService.generateCode());
preOutStock.setRequireQty(requireQty);
preOutStock.setPreOutQty(actualTake);
preOutStock.setGoodsId(maxStock.getGoodsId());
StGoods stGoods = stGoodsService.getById(maxStock.getGoodsId());
preOutStock.setGoodsName(stGoods.getGoodsName());
@ -541,7 +543,7 @@ public class StGlassCakeOutServiceImpl extends BaseServiceImpl<StGlassCakeOutMap
}
// 校验出库数量不能大于库存数量
if (param.getOutQty() > realtimeStock.getQuantity()) {
if (param.getOutQty() > realtimeStock.getQuantity() - realtimeStock.getOccupyQuantity()) {
throw new ServiceException("流程卡号【"+outEntity.getCardNo()+"】出库数量不能大于库存总数量,库存数量为:" + realtimeStock.getQuantity());
}
// ============ 步骤2:根据出库单数据 构建 出入库记录对象【核心】 ============
@ -565,7 +567,7 @@ public class StGlassCakeOutServiceImpl extends BaseServiceImpl<StGlassCakeOutMap
inoutRecord.setInOutReason("玻璃饼出库");
inoutRecord.setInOutDate(nowDate);
// 业务信息
inoutRecord.setWoCode(outEntity.getCardNo());
inoutRecord.setCardNo(outEntity.getCardNo());
inoutRecord.setUserId(userId);
// 租户/创建人基础字段(继承TenantEntity)
inoutRecord.setUserId(param.getPicker());
@ -584,6 +586,14 @@ public class StGlassCakeOutServiceImpl extends BaseServiceImpl<StGlassCakeOutMap
this.updateById(outEntity);
resultList.add(outEntity);
if (outEntity.getOutQty() < outEntity.getPreOutQty()) {
Double resOccupyQty = outEntity.getPreOutQty() - outEntity.getOutQty();
realtimeStock.setOccupyQuantity(realtimeStock.getOccupyQuantity() - resOccupyQty);
stRealtimeStockService.updateById(realtimeStock);
stRealtimeStockMapper.updateRealTimeLock(outEntity.getCardNo(), String.valueOf(realtimeStock.getId()), -resOccupyQty);
}
// ============ 步骤4:查询库存对象 加入库存集合 ============
// StRealtimeStock realtimeStock = stRealtimeStockService.getById(outEntity.getRlsId());
// if (realtimeStock != null) {

@ -1,5 +1,6 @@
package org.springblade.wms.service.impl;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.StrUtil;
@ -11,12 +12,18 @@ import lombok.extern.slf4j.Slf4j;
import org.springblade.core.log.exception.ServiceException;
import org.springblade.core.mp.base.BaseServiceImpl;
import org.springblade.core.secure.BladeUser;
import org.springblade.desk.dashboard.feign.IPartClient;
import org.springblade.desk.dashboard.pojo.entity.DsPartEntity;
import org.springblade.desk.dashboard.pojo.entity.DsPartRelationEntity;
import org.springblade.desk.order.pojo.entity.YieldOrder;
import org.springblade.wms.excel.StGraphiteMoldOutExcel;
import org.springblade.wms.mapper.StGlassCakeOutMapper;
import org.springblade.wms.mapper.StGraphiteMoldOutMapper;
import org.springblade.wms.mapper.StRealtimeStockMapper;
import org.springblade.wms.mapper.StStockInoutRecordMapper;
import org.springblade.wms.pojo.dto.StGraphiteMoldOutDTO;
import org.springblade.wms.pojo.dto.StockOccupyTempDTO;
import org.springblade.wms.pojo.dto.SubItemStockDTO;
import org.springblade.wms.pojo.entity.*;
import org.springblade.wms.pojo.vo.StGraphiteMoldOutVO;
import org.springblade.wms.service.*;
@ -25,6 +32,7 @@ import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import java.util.*;
import java.util.stream.Collectors;
/**
* @version 1.0
@ -52,6 +60,10 @@ public class StGraphiteMoldOutServiceImpl extends BaseServiceImpl<StGraphiteMold
IStStorehouseService stStorehouseService;
@Resource
IStStorageLocationService stStorageLocationService;
@Resource
StGlassCakeOutMapper stGlassCakeOutMapper;
@Resource
IPartClient partClient;
@Override
public IPage<StGraphiteMoldOutVO> selectStGraphiteMoldOutPage(IPage<StGraphiteMoldOutVO> page, StGraphiteMoldOutVO stGraphiteMoldOut) {
@ -71,44 +83,108 @@ public class StGraphiteMoldOutServiceImpl extends BaseServiceImpl<StGraphiteMold
throw new RuntimeException("根据流程卡号【" + dto.getCardNo() + "】未查询到生产订单信息");
}
List<StGraphiteMoldOut> preOutStockList = new ArrayList<>();
// 整套数量:需要生产多少套
Double totalNeedSet = faYieldOrder.getYpQty();
int totalNeedSetInt = Double.valueOf(Math.ceil(totalNeedSet)).intValue();
DsPartEntity partOne = partClient.getPart(faYieldOrder.getPartCode(), faYieldOrder.getPartVersion());
List<DsPartRelationEntity> partRelationEntityList = partClient.getSubPart(partOne.getId());
List<DsPartEntity> allChildPartList = new ArrayList<>();
if (!CollectionUtils.isEmpty(partRelationEntityList)) {
// 提取所有非空的childPartId并去重(避免null和重复ID,减少查询压力)
List<Long> childPartIdList = partRelationEntityList.stream()
.map(DsPartRelationEntity::getChildPartId) // 提取子件ID
.filter(Objects::nonNull) // 过滤null的ID
.distinct() // 去重,避免重复查询
.collect(Collectors.toList());
// 批量查询DS_PART表
if (!CollectionUtils.isEmpty(childPartIdList)) {
// 调用dsPartService的批量查询方法(根据ID列表查DS_PART)
allChildPartList = partClient.batchParts(childPartIdList);
}
}
String goodsCode = faYieldOrder.getPartCode();
Double requireQty = faYieldOrder.getYpQty();
System.out.println("石墨模编码:" + goodsCode + ",总需求:" + requireQty);
List<SubItemStockDTO> sourceSubStockList = new ArrayList<>();
for (DsPartEntity bom : allChildPartList) {
SubItemStockDTO item = new SubItemStockDTO();
item.setSubGoodsCode(bom.getPartCode());
// 单套子件耗用数量
DsPartRelationEntity dsPartRelation = stGlassCakeOutMapper.getPartQuota(faYieldOrder.getPartCode(), item.getSubGoodsCode());
item.setSingleUseQty(dsPartRelation.getQuota());
// 查询该子件所有可用库存
List<StRealtimeStock> stockAll = stRealtimeStockMapper.selectMaxUsableStockByMoldAttr(item.getSubGoodsCode());
item.setStockList(stockAll);
// 实时剩余可用总库存(动态变化,逐套消耗)
double usableTotal = 0D;
if (CollUtil.isNotEmpty(stockAll)) {
usableTotal = stockAll.stream()
.mapToDouble(s -> s.getQuantity() - Optional.ofNullable(s.getOccupyQuantity()).orElse(0D))
.sum();
}
item.setRemainUsable(usableTotal);
sourceSubStockList.add(item);
}
List<StRealtimeStock> candidateStockList = new ArrayList<>();
double totalUsable = 0.0;
List<StRealtimeStock> allUsableStockList = stRealtimeStockMapper.selectMaxUsableStockByMoldAttr(goodsCode);
// 存放最终要生成的出库明细、占用、锁库数据
List<StockOccupyTempDTO> needOccupyList = new ArrayList<>();
// 成功齐套的套数
int successSet = 0;
// 2、逐套循环校验,能齐一套算一套
for (; successSet < totalNeedSetInt; ) {
boolean oneSetAllOk = true;
// 本套需要占用的临时数据
List<StockOccupyTempDTO> tempOccupy = new ArrayList<>();
for (SubItemStockDTO sub : sourceSubStockList) {
double needPerSet = sub.getSingleUseQty();
// 当前子件剩余可用不足单套用量 → 本套不齐套,跳出
if (sub.getRemainUsable() < needPerSet - 0.001) {
oneSetAllOk = false;
break;
}
if (allUsableStockList == null || allUsableStockList.isEmpty()) {
log.info("石墨模【{}】库存不足,无法生成!需求数量:{}", goodsCode, requireQty);
return Collections.emptyList();
}
for (StRealtimeStock stock : allUsableStockList) {
double occupy = Optional.ofNullable(stock.getOccupyQuantity()).orElse(0D);
double usableQty = stock.getQuantity() - occupy;
if (usableQty <= 0) {
continue;
// 从子件库存里扣对应数量,优先耗前面批次库存
double surplusNeed = needPerSet;
List<StRealtimeStock> stockList = sub.getStockList();
for (StRealtimeStock stock : stockList) {
if (surplusNeed <= 0.001) break;
double occ = Optional.ofNullable(stock.getOccupyQuantity()).orElse(0D);
double usable = stock.getQuantity() - occ;
if (usable <= 0) continue;
double takeQty = Math.min(usable, surplusNeed);
// 暂存本次占用信息,齐套成功才真正落库
StockOccupyTempDTO temp = new StockOccupyTempDTO();
temp.setStock(stock);
temp.setTakeQty(takeQty);
temp.setSubGoodsCode(sub.getSubGoodsCode());
tempOccupy.add(temp);
surplusNeed -= takeQty;
}
// 子件总可用扣减本套耗用
sub.setRemainUsable(sub.getRemainUsable() - needPerSet);
}
candidateStockList.add(stock);
totalUsable += usableQty;
if (totalUsable >= requireQty) {
if (oneSetAllOk) {
// 本套齐套,临时占用转正,加入最终列表
needOccupyList.addAll(tempOccupy);
successSet++;
} else {
// 任意子件不齐套,终止整套循环,不再尝试后续套数
break;
}
}
// if (totalUsable < requireQty - 0.001) {
// throw new ServiceException("石墨模【" + goodsCode + "】库存不足,无法生成!需求数量:" + requireQty + ",可用库存:" + totalUsable);
// }
if (candidateStockList.isEmpty()) {
log.info("石墨模【{}】库存不足,无法生成!需求数量:{}", goodsCode, requireQty);
if (CollUtil.isEmpty(needOccupyList)) {
log.info("父件{}无任何可齐套库存,需求{}套,生成0套预出库", partOne.getPartCode(), totalNeedSet);
return Collections.emptyList();
}
double remainingQty = requireQty;
List<StGraphiteMoldOut> preOutStockList = new ArrayList<>();
String datePrefix = DateUtil.format(new Date(), "yyyyMMdd");
// 2. 当天最大序号
String maxCode = stStockInoutRecordMapper.getMaxCheckCode(datePrefix);
@ -117,23 +193,29 @@ public class StGraphiteMoldOutServiceImpl extends BaseServiceImpl<StGraphiteMold
String number = maxCode.substring(datePrefix.length());
lastNum = Integer.parseInt(number);
}
for (StRealtimeStock maxStock : candidateStockList) {
if (remainingQty <= 0.001) {
break;
}
int childNum = 1;
double occupyQty = Optional.ofNullable(maxStock.getOccupyQuantity()).orElse(0D);
double usableQty = maxStock.getQuantity() - occupyQty;
double actualTake = Math.min(usableQty, remainingQty);
// 3、遍历占用明细:更新库存占用、新增锁库、生成预出库单据
for (StockOccupyTempDTO temp : needOccupyList) {
lastNum++;
StRealtimeStock maxStock = temp.getStock();
Double takeQty = temp.getTakeQty();
StGraphiteMoldOut preOutStock = new StGraphiteMoldOut();
preOutStock.setYoCode(faYieldOrder.getYoCode());
preOutStock.setCardNo(dto.getCardNo());
String sirCode = datePrefix + StrUtil.padPre(String.valueOf(lastNum), 4, '0');
preOutStock.setOutCode(sirCode);
String parentOutCode = datePrefix + StrUtil.padPre(String.valueOf(lastNum), 4, '0');
preOutStock.setParentOutCode(parentOutCode);
String outCode = parentOutCode + "-" + childNum;
preOutStock.setOutCode(outCode);
childNum++;
// preOutStock.setOutCode(stStockInoutRecordService.generateCode());
preOutStock.setNeedQuantity(requireQty);
SubItemStockDTO currSub = sourceSubStockList.stream()
.filter(s -> s.getSubGoodsCode().equals(temp.getSubGoodsCode()))
.findFirst().get();
preOutStock.setNeedQuantity(currSub.getSingleUseQty() * totalNeedSet);
preOutStock.setCompleteQuantity(takeQty);
preOutStock.setGoodsId(maxStock.getGoodsId());
StGoods stGoods = stGoodsService.getById(maxStock.getGoodsId());
preOutStock.setGoodsName(stGoods.getGoodsName());
@ -152,22 +234,22 @@ public class StGraphiteMoldOutServiceImpl extends BaseServiceImpl<StGraphiteMold
preOutStock.setUpdateTime(now);
preOutStockList.add(preOutStock);
System.out.println("石墨模[编码:" + goodsCode + "]库存充足,已构建预出库信息,库存ID:" + maxStock.getId());
System.out.println("石墨模子件[编码:" + preOutStock.getGoodsCode() + "]库存充足,已构建预出库信息,库存ID:" + maxStock.getId());
double newOccupy = occupyQty + actualTake;
maxStock.setOccupyQuantity(newOccupy);
// 更新实时库存占用数量
double oldOccupy = Optional.ofNullable(maxStock.getOccupyQuantity()).orElse(0D);
maxStock.setOccupyQuantity(oldOccupy + takeQty);
stRealtimeStockService.updateById(maxStock);
StRealtimeStockLock lock = new StRealtimeStockLock();
lock.setId(IdUtil.getSnowflake().nextId());
lock.setRlsId(maxStock.getId());
lock.setWoNo(preOutStock.getCardNo());
lock.setOccupyQuantity(actualTake);
lock.setOccupyQuantity(takeQty);
lock.setStatus(0);
stRealtimeStockMapper.insertStockLock(lock);
remainingQty -= actualTake;
}
System.out.println("石墨模[编码:" + goodsCode + "] 预出库全部完成!");
System.out.println("石墨模子件预出库全部完成!");
this.saveBatch(preOutStockList);
return preOutStockList;
@ -302,7 +384,7 @@ public class StGraphiteMoldOutServiceImpl extends BaseServiceImpl<StGraphiteMold
stockList.add(realtimeStock);
}
if (param.getOutedQuantity() > realtimeStock.getQuantity()) {
if (param.getOutedQuantity() > realtimeStock.getQuantity() - realtimeStock.getOccupyQuantity()) {
throw new ServiceException("流程卡号【"+outEntity.getCardNo()+"】出库数量不能大于库存总数量,库存数量为:" + realtimeStock.getQuantity());
}
@ -320,7 +402,7 @@ public class StGraphiteMoldOutServiceImpl extends BaseServiceImpl<StGraphiteMold
this.updateById(outEntity);
StStockInoutRecord inoutRecord = new StStockInoutRecord();
inoutRecord.setCheckNo(outEntity.getCardNo());
inoutRecord.setCardNo(outEntity.getCardNo());
inoutRecord.setSirCode(outEntity.getOutCode());
inoutRecord.setSlId(outEntity.getSlId());
inoutRecord.setRlsId(outEntity.getRlsId());
@ -350,6 +432,14 @@ public class StGraphiteMoldOutServiceImpl extends BaseServiceImpl<StGraphiteMold
outEntity.setSirId(inoutRecord.getId());
this.updateById(outEntity);
resultList.add(outEntity);
if (outEntity.getOutedQuantity() < outEntity.getCompleteQuantity()) {
Double resOccupyQty = outEntity.getCompleteQuantity() - outEntity.getOutedQuantity();
realtimeStock.setOccupyQuantity(realtimeStock.getOccupyQuantity() - resOccupyQty);
stRealtimeStockService.updateById(realtimeStock);
stRealtimeStockMapper.updateRealTimeLock(outEntity.getCardNo(), String.valueOf(realtimeStock.getId()), -resOccupyQty);
}
}
if (!allInoutList.isEmpty() && !stockList.isEmpty()) {

@ -18,6 +18,7 @@ import org.springblade.desk.produce.pojo.entity.WorkOrder;
import org.springblade.system.feign.IUserClient;
import org.springblade.wms.excel.StOtherReceiptRecordExcel;
import org.springblade.wms.mapper.StOtherReceiptRecordMapper;
import org.springblade.wms.mapper.StStockInoutRecordMapper;
import org.springblade.wms.pojo.dto.InitStockDTO;
import org.springblade.wms.pojo.entity.*;
import org.springblade.wms.pojo.vo.StOtherReceiptRecordVO;
@ -53,6 +54,8 @@ public class StOtherReceiptRecordServiceImpl extends BaseServiceImpl<StOtherRece
@Resource
IStStockInoutRecordService stStockInoutRecordService;
@Resource
StStockInoutRecordMapper stStockInoutRecordMapper;
@Resource
IPartClient partClient;
@Resource
IUserClient userClient;
@ -108,7 +111,13 @@ public class StOtherReceiptRecordServiceImpl extends BaseServiceImpl<StOtherRece
.map(p -> Integer.parseInt(p.substring(9)))
.orElse(0);
// 当天最大序号
String maxCode = stStockInoutRecordMapper.getMaxCheckCode(datePrefix);
int lastNum = 0;
if (StrUtil.isNotBlank(maxCode)) {
String number = maxCode.substring(datePrefix.length());
lastNum = Integer.parseInt(number);
}
// 主账单字段 = 明细合计
for (StStockInoutRecord detail : inoutList) {
// 校验单条明细的必传字段
@ -127,7 +136,11 @@ public class StOtherReceiptRecordServiceImpl extends BaseServiceImpl<StOtherRece
}
}
// detail.setSirCode(stStockInoutRecordService.generateCode());
if (detail.getSirCode() == null) {
lastNum++;
String sirCode = datePrefix + StrUtil.padPre(String.valueOf(lastNum), 4, '0');
detail.setSirCode(sirCode);
}
detail.setInOutSource(StStockInoutRecord.INOUT_SOURCE_OTHER_PURCHASE_RECEIPT);
// 赋值公共属性:批次号、入库单关联ID、部门/创建人
if (detail.getPiNo() == null) {
@ -139,8 +152,8 @@ public class StOtherReceiptRecordServiceImpl extends BaseServiceImpl<StOtherRece
// detail.setSirMoney(detail.getUnitPrice() * detail.getQuantity());
detail.setUnitPrice(detail.getUnitPrice());
detail.setSirMoney(detail.getSirMoney());
detail.setDeptId(user.getDeptId());
detail.setCreateUser(user.getUserId());
detail.setDeptId(AuthUtil.getUser().getDeptId());
detail.setCreateUser(AuthUtil.getUser().getUserId());
detail.setCreateTime(new Date());
detail.setInOutType(StStockInoutRecord.IN_TYPE);
detail.setInOutReason(String.valueOf(stOtherReceiptRecord.getWarehousingReason()));
@ -160,7 +173,7 @@ public class StOtherReceiptRecordServiceImpl extends BaseServiceImpl<StOtherRece
newReceipt.setShId(stOtherReceiptRecord.getShId());
newReceipt.setWarehousingReason(stOtherReceiptRecord.getWarehousingReason());
newReceipt.setMemo(stOtherReceiptRecord.getMemo());
newReceipt.setCreateUser(user.getUserId());
newReceipt.setCreateUser(AuthUtil.getUser().getUserId());
newReceipt.setCreateTime(new Date());
// 关联当前明细的ID(核心:一一对应)
newReceipt.setSirId(detail.getId());
@ -330,13 +343,8 @@ public class StOtherReceiptRecordServiceImpl extends BaseServiceImpl<StOtherRece
inoutRecord.setMaterialNo(partOne.getMaterial());
inoutRecord.setThickness(String.valueOf(partOne.getFormingThickness()));
}
} else {
throw new RuntimeException("零件编号【" + workOrder.getPartCode() + "】不是玻璃饼,不允许操作");
}
if (ObjectUtil.isEmpty(inoutRecord)) {
throw new ServiceException("未找到对应的玻璃饼信息");
}
return inoutRecord;
}

@ -559,7 +559,10 @@ public class StRealtimeStockServiceImpl extends BaseServiceImpl<StRealtimeStockM
.doubleValue();
String lockNo = StrUtil.isNotBlank(inout.getWoCode()) ? inout.getWoCode() : inout.getCardNo();
if (StrUtil.isNotBlank(lockNo) && newOccupy >= 0) {
if (StrUtil.isNotBlank(lockNo)) {
if (newOccupy < 0) {
newOccupy = 0;
}
db.setOccupyQuantity(newOccupy);
this.updateRealTimeLock(lockNo, db.getId(), quantity);
// NumberUtil.add(

Loading…
Cancel
Save