|
|
|
|
@ -12,7 +12,6 @@ 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.desk.produce.pojo.entity.WorkOrder; |
|
|
|
|
import org.springblade.wms.excel.StGlassCakeOutExcel; |
|
|
|
|
import org.springblade.wms.mapper.StGlassCakeOutMapper; |
|
|
|
|
import org.springblade.wms.mapper.StOtherReceiptRecordMapper; |
|
|
|
|
@ -56,14 +55,7 @@ public class StGlassCakeOutServiceImpl extends BaseServiceImpl<StGlassCakeOutMap |
|
|
|
|
StOtherReceiptRecordMapper stOtherReceiptRecordMapper; |
|
|
|
|
@Resource |
|
|
|
|
IPartClient partClient; |
|
|
|
|
// @Resource
|
|
|
|
|
// IDsPartService dsPartService;
|
|
|
|
|
// @Resource
|
|
|
|
|
// IDsPartRelationService partRelationService;
|
|
|
|
|
// @Resource
|
|
|
|
|
// IWorkOrderService workOrderService;
|
|
|
|
|
// @Resource
|
|
|
|
|
// WorkOrderMapper workOrderMapper;
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
|
public IPage<StGlassCakeOutVO> selectStGlassCakeOutPage(IPage<StGlassCakeOutVO> page, StGlassCakeOutVO stGlassCakeOut) { |
|
|
|
|
return page.setRecords(baseMapper.selectStGlassCakeOutPage(page, stGlassCakeOut)); |
|
|
|
|
@ -84,24 +76,24 @@ public class StGlassCakeOutServiceImpl extends BaseServiceImpl<StGlassCakeOutMap |
|
|
|
|
// Long userId = Long.valueOf(user.getUserId());
|
|
|
|
|
Date now = new Date(); |
|
|
|
|
|
|
|
|
|
WorkOrder workOrder = stOtherReceiptRecordMapper.getByWoCode(dto.getWoCode()); |
|
|
|
|
if (workOrder == null) { |
|
|
|
|
throw new RuntimeException("根据工单编号【" + dto.getWoCode() + "】未查询到工单信息"); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
Long yoId = workOrder.getYoId(); |
|
|
|
|
if (yoId == null) { |
|
|
|
|
throw new RuntimeException("工单【" + dto.getWoCode() + "】未查到生产订单ID"); |
|
|
|
|
} |
|
|
|
|
// WorkOrder workOrder = stOtherReceiptRecordMapper.getByWoCode(dto.getWoCode());
|
|
|
|
|
// if (workOrder == null) {
|
|
|
|
|
// throw new RuntimeException("根据工单编号【" + dto.getWoCode() + "】未查询到工单信息");
|
|
|
|
|
// }
|
|
|
|
|
//
|
|
|
|
|
// Long yoId = workOrder.getYoId();
|
|
|
|
|
// if (yoId == null) {
|
|
|
|
|
// throw new RuntimeException("工单【" + dto.getWoCode() + "】未查到生产订单ID");
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
YieldOrder yieldOrder = stOtherReceiptRecordMapper.getByYoId(workOrder.getYoId()); |
|
|
|
|
YieldOrder yieldOrder = stOtherReceiptRecordMapper.getByYoId(dto.getYoCode()); |
|
|
|
|
if (yieldOrder == null) { |
|
|
|
|
throw new RuntimeException("根据生产订单ID【" + yoId + "】未查询到生产订单信息"); |
|
|
|
|
throw new RuntimeException("根据生产订单ID【" + dto.getYoCode() + "】未查询到生产订单信息"); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
DsPartEntity partOne = partClient.getPart(workOrder.getPartCode(),yieldOrder.getPartVersion()); |
|
|
|
|
DsPartEntity partOne = partClient.getPart(yieldOrder.getPartCode(),yieldOrder.getPartVersion()); |
|
|
|
|
if (partOne == null) { |
|
|
|
|
throw new RuntimeException("根据零件编号【" + workOrder.getPartCode() + "】未查询到零件信息"); |
|
|
|
|
throw new RuntimeException("根据零件编号【" + yieldOrder.getPartCode() + "】未查询到零件信息"); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
List<DsPartRelationEntity> partRelationEntityList = partClient.getSubPart(partOne.getId()); |
|
|
|
|
@ -191,32 +183,79 @@ public class StGlassCakeOutServiceImpl extends BaseServiceImpl<StGlassCakeOutMap |
|
|
|
|
// // ========== 查询库存量最大的库存记录 ==========
|
|
|
|
|
// StRealtimeStock maxStock = stRealtimeStockService.getOne(stockQuery);
|
|
|
|
|
|
|
|
|
|
StRealtimeStock maxStock = stRealtimeStockMapper.selectMaxUsableStockByCakeAttr(isPrint, powderWeight, materialNo, thickness, goodsCode); |
|
|
|
|
// StRealtimeStock maxStock = stRealtimeStockMapper.selectMaxUsableStockByCakeAttr(isPrint, powderWeight, materialNo, thickness, goodsCode);
|
|
|
|
|
// if (maxStock == null) {
|
|
|
|
|
// System.out.println("玻璃饼[编码:" + goodsCode + "]未查询到匹配库存,无法生成预出库");
|
|
|
|
|
// continue;
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
Double requireQty = yieldOrder.getYpQty()*glassCake.getQuota(); |
|
|
|
|
System.out.println("玻璃饼编码:" + goodsCode + ",总需求:" + requireQty); |
|
|
|
|
|
|
|
|
|
// =====================【校验】总可用库存是否足够 =====================
|
|
|
|
|
List<StRealtimeStock> candidateStockList = new ArrayList<>(); |
|
|
|
|
double totalUsable = 0.0; |
|
|
|
|
// 循环查询所有可用库存,累加可用量,直到凑够 or 无库存
|
|
|
|
|
while (true) { |
|
|
|
|
StRealtimeStock maxStock = stRealtimeStockMapper.selectMaxUsableStockByCakeAttr( |
|
|
|
|
isPrint, powderWeight, materialNo, thickness, goodsCode); |
|
|
|
|
|
|
|
|
|
if (maxStock == null) { |
|
|
|
|
System.out.println("玻璃饼[编码:" + goodsCode + "]未查询到匹配库存,无法生成预出库"); |
|
|
|
|
break; // 没有更多库存了
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
double occupyQty = Optional.ofNullable(maxStock.getOccupyQuantity()).orElse(0D); |
|
|
|
|
double usableQty = maxStock.getQuantity() - occupyQty; |
|
|
|
|
|
|
|
|
|
if (usableQty <= 0) { |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
candidateStockList.add(maxStock); |
|
|
|
|
totalUsable += usableQty; |
|
|
|
|
|
|
|
|
|
if (totalUsable >= requireQty) { |
|
|
|
|
break; // 已凑够
|
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// ===================== 不够则直接抛异常,不生成任何单据 =====================
|
|
|
|
|
if (totalUsable < requireQty - 0.001) { |
|
|
|
|
System.out.println("玻璃饼[编码:" + goodsCode + "]库存不足,跳过生成!需求:" + requireQty + ",可分配:" + totalUsable); |
|
|
|
|
// 跳过当前这条,继续下一条玻璃饼
|
|
|
|
|
continue; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
Double requireQty = workOrder.getMakeQty()*glassCake.getQuota(); |
|
|
|
|
// ===================== 走到这里 = 库存足够,开始真正生成预出库 =====================
|
|
|
|
|
double remainingQty = requireQty; |
|
|
|
|
for (StRealtimeStock maxStock : candidateStockList) { |
|
|
|
|
if (remainingQty <= 0.001) { |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
double occupyQty = Optional.ofNullable(maxStock.getOccupyQuantity()).orElse(0D); |
|
|
|
|
double usableQty = maxStock.getQuantity() - occupyQty; |
|
|
|
|
double actualTake = Math.min(usableQty, remainingQty); |
|
|
|
|
// StRealtimeStockLock stockLock = stRealtimeStockMapper.selectByRlsId(maxStock.getId());
|
|
|
|
|
// ========== 库存充足性校验:可用量 >= 预出库目标数量才生成 ==========
|
|
|
|
|
Double stockQty; |
|
|
|
|
if (maxStock != null && maxStock.getOccupyQuantity() != null) { |
|
|
|
|
stockQty = maxStock.getQuantity() - maxStock.getOccupyQuantity(); |
|
|
|
|
} else { |
|
|
|
|
stockQty = maxStock.getQuantity(); |
|
|
|
|
} |
|
|
|
|
if (stockQty == null || stockQty.compareTo(requireQty) < 0) { |
|
|
|
|
throw new ServiceException(String.format("工作订单号:%s,玻璃饼号: %s,库存不足无法生成预出库单!", |
|
|
|
|
dto.getWoCode(), maxStock.getGoodsId())); |
|
|
|
|
} |
|
|
|
|
// Double stockQty;
|
|
|
|
|
// if (maxStock != null && maxStock.getOccupyQuantity() != null) {
|
|
|
|
|
// stockQty = maxStock.getQuantity() - maxStock.getOccupyQuantity();
|
|
|
|
|
// } else {
|
|
|
|
|
// stockQty = maxStock.getQuantity();
|
|
|
|
|
// }
|
|
|
|
|
// if (stockQty == null || stockQty.compareTo(requireQty) < 0) {
|
|
|
|
|
// throw new ServiceException(String.format("工作订单号:%s,玻璃饼号: %s,库存不足无法生成预出库单!",
|
|
|
|
|
// dto.getWoCode(), maxStock.getGoodsId()));
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
// ========== 库存充足:构建该玻璃饼的预出库实体 ==========
|
|
|
|
|
StGlassCakeOut preOutStock = new StGlassCakeOut(); |
|
|
|
|
// 关联玻璃饼信息
|
|
|
|
|
preOutStock.setWoCode(workOrder.getWoCode()); |
|
|
|
|
// preOutStock.setWoCode(workOrder.getWoCode());
|
|
|
|
|
preOutStock.setYoCode(yieldOrder.getYoCode()); |
|
|
|
|
preOutStock.setCardNo(dto.getCardNo()); |
|
|
|
|
preOutStock.setQuantity(workOrder.getMakeQty()); |
|
|
|
|
preOutStock.setQuantity(yieldOrder.getYpQty()); |
|
|
|
|
preOutStock.setPartCode(partOne.getPartCode()); |
|
|
|
|
preOutStock.setPartName(partOne.getPartName()); |
|
|
|
|
|
|
|
|
|
@ -251,16 +290,24 @@ public class StGlassCakeOutServiceImpl extends BaseServiceImpl<StGlassCakeOutMap |
|
|
|
|
// 添加到预出库列表
|
|
|
|
|
preOutStockList.add(preOutStock); |
|
|
|
|
System.out.println("玻璃饼[编码:" + goodsCode + "]库存充足,已构建预出库信息,库存ID:" + maxStock.getId()); |
|
|
|
|
maxStock.setOccupyQuantity(requireQty); |
|
|
|
|
// maxStock.setOccupyQuantity(requireQty);
|
|
|
|
|
// stRealtimeStockService.updateById(maxStock);
|
|
|
|
|
double newOccupy = occupyQty + actualTake; |
|
|
|
|
maxStock.setOccupyQuantity(newOccupy); |
|
|
|
|
stRealtimeStockService.updateById(maxStock); |
|
|
|
|
|
|
|
|
|
StRealtimeStockLock lock = new StRealtimeStockLock(); |
|
|
|
|
lock.setId(IdUtil.getSnowflake().nextId()); |
|
|
|
|
lock.setRlsId(maxStock.getId()); |
|
|
|
|
lock.setWoNo(preOutStock.getWoCode()); |
|
|
|
|
lock.setOccupyQuantity(preOutStock.getRequireQty()); |
|
|
|
|
// lock.setOccupyQuantity(preOutStock.getRequireQty());
|
|
|
|
|
// 锁本次扣的数量
|
|
|
|
|
lock.setOccupyQuantity(actualTake); |
|
|
|
|
lock.setStatus(0); |
|
|
|
|
stRealtimeStockMapper.insertStockLock(lock); |
|
|
|
|
remainingQty -= actualTake; |
|
|
|
|
} |
|
|
|
|
System.out.println("玻璃饼[编码:" + goodsCode + "] 预出库全部完成!"); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@ -364,8 +411,9 @@ public class StGlassCakeOutServiceImpl extends BaseServiceImpl<StGlassCakeOutMap |
|
|
|
|
StGlassCakeOutDTO dto = new StGlassCakeOutDTO(); |
|
|
|
|
|
|
|
|
|
dto.setCardNo(cardNo); |
|
|
|
|
WorkOrder workOrder = baseMapper.getByWoCode(dto.getCardNo()); |
|
|
|
|
dto.setWoCode(workOrder.getWoCode()); |
|
|
|
|
// WorkOrder workOrder = baseMapper.getByWoCode(dto.getCardNo());
|
|
|
|
|
YieldOrder yieldOrder = baseMapper.getByYoCode(dto.getCardNo()); |
|
|
|
|
dto.setYoCode(yieldOrder.getYoCode()); |
|
|
|
|
|
|
|
|
|
List<StGlassCakeOut> stGlassCakeOutList = this.generatePreOutOrder(dto); |
|
|
|
|
if (!CollectionUtils.isEmpty(stGlassCakeOutList)) { |
|
|
|
|
@ -459,6 +507,7 @@ public class StGlassCakeOutServiceImpl extends BaseServiceImpl<StGlassCakeOutMap |
|
|
|
|
outEntity.setOutUsers(userId); // 出库人ID
|
|
|
|
|
outEntity.setOutTime(nowDate); // 实际出库时间
|
|
|
|
|
outEntity.setCurStatus(1L); // 状态变更:1=已出库
|
|
|
|
|
outEntity.setPicker(param.getPicker()); |
|
|
|
|
outEntity.setUpdateUser(userId); |
|
|
|
|
outEntity.setUpdateTime(nowDate); |
|
|
|
|
this.updateById(outEntity); |
|
|
|
|
@ -497,6 +546,7 @@ public class StGlassCakeOutServiceImpl extends BaseServiceImpl<StGlassCakeOutMap |
|
|
|
|
inoutRecord.setWoCode(outEntity.getWoCode()); |
|
|
|
|
inoutRecord.setUserId(userId); |
|
|
|
|
// 租户/创建人基础字段(继承TenantEntity)
|
|
|
|
|
inoutRecord.setUserId(param.getPicker()); |
|
|
|
|
inoutRecord.setCreateUser(userId); |
|
|
|
|
inoutRecord.setCreateTime(nowDate); |
|
|
|
|
inoutRecord.setUpdateUser(userId); |
|
|
|
|
|