@@ -14,6 +14,19 @@ import com.klp.domain.vo.WmsRawMaterialVo;
import com.klp.domain.WmsRawMaterial ;
import com.klp.mapper.WmsRawMaterialMapper ;
import com.klp.service.IWmsRawMaterialService ;
import com.klp.service.IWmsStockService ;
import com.klp.service.IWmsPurchasePlanDetailService ;
import com.klp.service.IWmsOrderDetailService ;
import com.klp.service.IWmsProductBomService ;
import com.klp.service.IWmsOrderService ;
import com.klp.domain.bo.WmsPurchasePlanDetailBo ;
import com.klp.domain.bo.WmsOrderDetailBo ;
import com.klp.domain.bo.WmsProductBomBo ;
import com.klp.domain.vo.WmsPurchasePlanDetailVo ;
import com.klp.domain.vo.WmsProductBomVo ;
import com.klp.domain.vo.WmsOrderDetailVo ;
import com.klp.domain.vo.WmsOrderVo ;
import java.math.BigDecimal ;
import java.util.List ;
import java.util.Map ;
@@ -30,6 +43,11 @@ import java.util.Collection;
public class WmsRawMaterialServiceImpl implements IWmsRawMaterialService {
private final WmsRawMaterialMapper baseMapper ;
private final IWmsStockService stockService ;
private final IWmsPurchasePlanDetailService purchasePlanDetailService ;
private final IWmsOrderDetailService orderDetailService ;
private final IWmsProductBomService productBomService ;
private final IWmsOrderService orderService ;
/**
* 查询原材料
@@ -58,6 +76,92 @@ public class WmsRawMaterialServiceImpl implements IWmsRawMaterialService {
return baseMapper . selectVoList ( lqw ) ;
}
/**
* 查询原材料列表(含需求、库存、在途信息)
*/
@Override
public TableDataInfo < WmsRawMaterialVo > queryPageListWithDemand ( WmsRawMaterialBo bo , PageQuery pageQuery ) {
LambdaQueryWrapper < WmsRawMaterial > lqw = buildQueryWrapper ( bo ) ;
Page < WmsRawMaterialVo > result = baseMapper . selectVoPage ( pageQuery . build ( ) , lqw ) ;
// 填充需求、库存、在途信息
fillDemandInfo ( result . getRecords ( ) ) ;
return TableDataInfo . build ( result ) ;
}
/**
* 填充原材料需求、库存、在途信息
*/
private void fillDemandInfo ( List < WmsRawMaterialVo > rawMaterialList ) {
if ( rawMaterialList = = null | | rawMaterialList . isEmpty ( ) ) {
return ;
}
// 为每个原材料填充信息
for ( WmsRawMaterialVo vo : rawMaterialList ) {
Long rawMaterialId = vo . getRawMaterialId ( ) ;
// 查询库存量
BigDecimal inventory = stockService . getStockByItemId ( rawMaterialId ) ;
vo . setInventory ( inventory ! = null ? inventory : BigDecimal . ZERO ) ;
// 查询在途量(采购计划明细)
BigDecimal onTheWay = getOnTheWayQuantity ( rawMaterialId ) ;
vo . setOnTheWay ( onTheWay ) ;
// 查询需求量(订单+BOM)
BigDecimal demand = getDemandQuantity ( rawMaterialId ) ;
vo . setDemand ( demand ) ;
}
}
/**
* 获取在途量
*/
private BigDecimal getOnTheWayQuantity ( Long rawMaterialId ) {
WmsPurchasePlanDetailBo bo = new WmsPurchasePlanDetailBo ( ) ;
bo . setRawMaterialId ( rawMaterialId ) ;
List < WmsPurchasePlanDetailVo > list = purchasePlanDetailService . queryList ( bo ) ;
return list . stream ( )
. filter ( item - > item . getStatus ( ) ! = null & & item . getStatus ( ) = = 1 ) // 在途状态
. map ( WmsPurchasePlanDetailVo : : getQuantity )
. filter ( qty - > qty ! = null )
. reduce ( BigDecimal . ZERO , BigDecimal : : add ) ;
}
/**
* 获取需求量
*/
private BigDecimal getDemandQuantity ( Long rawMaterialId ) {
// 先查询包含该原材料的BOM
WmsProductBomBo bomBo = new WmsProductBomBo ( ) ;
bomBo . setRawMaterialId ( rawMaterialId ) ;
List < WmsProductBomVo > bomList = productBomService . queryList ( bomBo ) ;
if ( bomList . isEmpty ( ) ) {
return BigDecimal . ZERO ;
}
// 查询这些产品的订单明细
BigDecimal totalDemand = BigDecimal . ZERO ;
for ( WmsProductBomVo bom : bomList ) {
WmsOrderDetailBo orderDetailBo = new WmsOrderDetailBo ( ) ;
orderDetailBo . setProductId ( bom . getProductId ( ) ) ;
List < WmsOrderDetailVo > orderDetails = orderDetailService . queryList ( orderDetailBo ) ;
// 逐个查询订单状态,过滤出有效订单的明细
BigDecimal productDemand = BigDecimal . ZERO ;
for ( WmsOrderDetailVo detail : orderDetails ) {
// 查询订单主表状态
WmsOrderVo order = orderService . queryById ( detail . getOrderId ( ) ) ;
if ( order ! = null & & order . getOrderStatus ( ) ! = null & & order . getOrderStatus ( ) < 2 ) {
// 新建、生产中状态,累加数量
if ( detail . getQuantity ( ) ! = null ) {
productDemand = productDemand . add ( detail . getQuantity ( ) ) ;
}
}
}
// 需求量 = 产品需求量 × BOM用量
if ( bom . getQuantity ( ) ! = null ) {
totalDemand = totalDemand . add ( productDemand . multiply ( bom . getQuantity ( ) ) ) ;
}
}
return totalDemand ;
}
private LambdaQueryWrapper < WmsRawMaterial > buildQueryWrapper ( WmsRawMaterialBo bo ) {
Map < String , Object > params = bo . getParams ( ) ;
LambdaQueryWrapper < WmsRawMaterial > lqw = Wrappers . lambdaQuery ( ) ;