@@ -6,6 +6,7 @@ import com.klp.common.core.domain.PageQuery;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page ;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper ;
import com.baomidou.mybatisplus.core.toolkit.Wrappers ;
import com.klp.common.core.service.ConfigService ;
import com.klp.common.utils.StringUtils ;
import lombok.RequiredArgsConstructor ;
import lombok.extern.slf4j.Slf4j ;
@@ -14,6 +15,7 @@ import com.klp.domain.bo.WmsMaterialWarningBo;
import com.klp.domain.vo.WmsMaterialWarningVo ;
import com.klp.domain.WmsMaterialCoil ;
import com.klp.domain.WmsMaterialWarning ;
import com.klp.domain.bo.WmsMaterialCoilBo ;
import com.klp.mapper.WmsMaterialWarningMapper ;
import com.klp.service.IWmsMaterialWarningService ;
@@ -36,6 +38,7 @@ import java.util.Collection;
public class WmsMaterialWarningServiceImpl implements IWmsMaterialWarningService {
private final WmsMaterialWarningMapper baseMapper ;
private final ConfigService configService ;
/**
* 查询钢卷通用维度告警(长度/厚度/宽度)
@@ -128,21 +131,21 @@ public class WmsMaterialWarningServiceImpl implements IWmsMaterialWarningService
/**
* 检查钢卷长度/厚度偏差并批量插入告警记录
*
* 长度规则: ABS((实测长度 - 理论长度) / 理论长度) > 0.1 → 告警
* 厚度规则:
* 1. 实测厚度 < 理论厚度 → 偏薄告警( ERROR)
* 2. (实测厚度 - 理论厚度) / 理论厚度 > 0.1 → 偏厚告警(WARNING)
* 长度规则: ABS((实测长度 - 理论长度) / 理论长度) > 阈值 → WARNING
* 阈值从 sys_config(material.warning.length) 读取,默认 0.1
* 厚度规则:理论厚度 - 实测厚度 > 阈值 → ERROR
* 阈值从 sys_config(material.warning.thickness) 读取(绝对值差 mm) , 默认 -0.01
*/
@Override
public void checkAndInsertWarnings ( WmsMaterialCoil coil ) {
public void checkAndInsertWarnings ( WmsMaterialCoil coil , WmsMaterialCoilBo bo ) {
try {
doCheckAndInsertWarnings ( coil ) ;
doCheckAndInsertWarnings ( coil , bo );
} catch ( Exception e ) {
log . error ( " 钢卷告警检查异常, coilId={}, 不影响原流程 " , coil ! = null ? coil . getCoilId ( ) : null , e ) ;
}
}
private void doCheckAndInsertWarnings ( WmsMaterialCoil coil ) {
private void doCheckAndInsertWarnings ( WmsMaterialCoil coil , WmsMaterialCoilBo bo ) {
if ( coil = = null | | coil . getCoilId ( ) = = null ) {
return ;
}
@@ -153,7 +156,7 @@ public class WmsMaterialWarningServiceImpl implements IWmsMaterialWarningService
checkLength ( coil , warnings ) ;
// ========== 厚度检查 ==========
checkThickness ( coil , warnings ) ;
checkThickness ( coil , bo , warnings ) ;
// 批量插入
if ( ! warnings . isEmpty ( ) ) {
@@ -168,7 +171,8 @@ public class WmsMaterialWarningServiceImpl implements IWmsMaterialWarningService
/**
* 长度偏差检查
* ABS((actualLength - theoreticalLength) / theoreticalLength) > 0.1 → WARNING
* ABS((actualLength - theoreticalLength) / theoreticalLength) > 阈值 → WARNING
* 阈值从 sys_config(material.warning.length) 读取,默认 0.1
*/
private void checkLength ( WmsMaterialCoil coil , List < WmsMaterialWarning > warnings ) {
Long actualLength = coil . getActualLength ( ) ;
@@ -179,23 +183,31 @@ public class WmsMaterialWarningServiceImpl implements IWmsMaterialWarningService
return ;
}
// 读取配置阈值,默认 0.1( 10%)
BigDecimal threshold ;
try {
String val = configService . getConfigValue ( " material.warning.length " ) ;
threshold = StringUtils . isNotBlank ( val ) ? new BigDecimal ( val . trim ( ) ) : new BigDecimal ( " 0.1 " ) ;
} catch ( Exception e ) {
log . warn ( " 读取长度告警阈值失败,使用默认值 0.1 " , e ) ;
threshold = new BigDecimal ( " 0.1 " ) ;
}
BigDecimal actual = new BigDecimal ( actualLength ) ;
BigDecimal diff = actual . subtract ( theoreticalLength ) . abs ( ) ;
BigDecimal rate = diff . divide ( theoreticalLength , 10 , RoundingMode . HALF_UP ) ;
// 偏差率 > 0.1( 即超过10%)
BigDecimal threshold = new BigDecimal ( " 0.1 " ) ;
if ( rate . compareTo ( threshold ) > 0 ) {
WmsMaterialWarning warning = new WmsMaterialWarning ( ) ;
warning . setCoilId ( coil . getCoilId ( ) ) ;
warning . setWarningType ( " LENGTH " ) ;
warning . setTheoreticalVal ( theoreticalLength ) ;
warning . setActualVal ( actual ) ;
warning . setAllowDeviation ( threshold ) ;
warning . setDeviationValue ( actual . subtract ( theoreticalLength ) ) ;
warning . setDeviationRate ( rate . multiply ( new BigDecimal ( " 100 " ) ) . setScale ( 4 , RoundingMode . HALF_UP ) ) ;
warning . setTheoreticalVal ( theoreticalLength . setScale ( 3 , RoundingMode . HALF_UP ) );
warning . setActualVal ( actual . setScale ( 3 , RoundingMode . HALF_UP ) );
warning . setAllowDeviation ( threshold . setScale ( 3 , RoundingMode . HALF_UP ) );
warning . setDeviationValue ( actual . subtract ( theoreticalLength ) . setScale ( 3 , RoundingMode . HALF_UP ) );
warning . setDeviationRate ( rate . multiply ( new BigDecimal ( " 100 " ) ) . setScale ( 1 , RoundingMode . HALF_UP ) ) ;
warning . setWarningLevel ( " WARNING " ) ;
warning . setWarningMsg ( " 钢卷长度偏差超过10% ,理论长度= " + theoreticalLength + " m, 实测长度= " + actualLength + " mm " ) ;
warning . setWarningMsg ( " 钢卷长度偏差超过阈值 ,理论长度= " + theoreticalLength . setScale ( 3 , RoundingMode . HALF_UP ) + " m, 实测长度= " + actualLength + " mm " ) ;
warning . setWarningStatus ( 0 ) ;
warnings . add ( warning ) ;
}
@@ -203,62 +215,43 @@ public class WmsMaterialWarningServiceImpl implements IWmsMaterialWarningService
/**
* 厚度偏差检查
* 1. 实测厚度 < 理论厚度 → ERROR( 不能比原来薄)
* 2. (实测厚度 - 理论厚度) / 理论厚度 > 0.1 → WARNING( 不能厚太多 )
* 规则:理论厚度 - 规格厚度 > 阈值 → WARNING
* 规格厚度从 BO 中取得( calculateTheoretical 已解析 )
* 阈值从 sys_config(material.warning.thickness) 读取,默认 -0.01
*/
private void checkThickness ( WmsMaterialCoil coil , List < WmsMaterialWarning > warnings ) {
String actualThicknessStr = coil . getActualThickness ( ) ;
private void checkThickness ( WmsMaterialCoil coil , WmsMaterialCoilBo bo , List < WmsMaterialWarning > warnings ) {
BigDecimal theoreticalThickness = coil . getTheoreticalThickness ( ) ;
if ( actu alThicknessStr = = null | | theoretical Thickness = = null
| | theoretical Thickness. compareTo ( BigDecimal . ZERO ) = = 0 ) {
BigDecimal specThickness = bo ! = null ? bo . getSpecThickness ( ) : null ;
if ( theoretic alThickness = = null | | spec Thickness = = null
| | spec Thickness. compareTo ( BigDecimal . ZERO ) = = 0 ) {
return ;
}
BigDecimal actualThickness ;
// 读取配置阈值(单位 mm) , 默认 -0.01
BigDecimal threshold ;
try {
actualThickness = new BigDecimal ( actualThicknessStr . trim ( ) ) ;
} catch ( NumberFormatException e ) {
log . warn ( " 实测厚度无法解析为数值, coilId={}, actualThickness={} " , coil . getCoilId ( ) , actualThicknessStr ) ;
return ;
String val = configService . getConfigValue ( " material.warning.thickness " ) ;
threshold = StringUtils . isNotBlank ( val ) ? new BigDecimal ( val . trim ( ) ) : new BigDecimal ( " -0.01 " ) ;
} catch ( Exception e ) {
log . warn ( " 读取厚度告警阈值失败,使用默认值 -0.01 " , e ) ;
threshold = new BigDecimal ( " -0.01 " ) ;
}
BigDecimal threshold = new BigDecimal ( " 0.1 " ) ;
// 规则1: 实测厚度 < 理论厚度 → 偏薄 ERROR
if ( actualThickness . compareTo ( theoreticalThickness ) < 0 ) {
// 理论厚度 - 规格厚度 > 阈值 → 触发
BigDecimal diff = theoreticalThickness . subtract ( specThickness ) ;
if ( diff . compareTo ( threshold ) > 0 ) {
WmsMaterialWarning warning = new WmsMaterialWarning ( ) ;
warning . setCoilId ( coil . getCoilId ( ) ) ;
warning . setWarningType ( " THICKNESS " ) ;
warning . setTheoreticalVal ( theoreticalThickness ) ;
warning . setActualVal ( actual Thickness) ;
warning . setAllowDeviation ( BigDecimal . ZERO ) ;
warning . setDeviationValue ( actu alThickness. subtract ( theoreticalThickness ) ) ;
BigDecimal rate = theoreticalThickness . subtract ( actualThickness )
. divide ( theor eti calThickness , 10 , RoundingMode . HALF_UP )
. multiply ( new BigDecimal ( " 100 " ) ) . setScale ( 4 , RoundingMode . HALF_UP ) ;
warning . setTheoreticalVal ( theoreticalThickness . setScale ( 3 , RoundingMode . HALF_UP ) );
warning . setActualVal ( spec Thickness. setScale ( 3 , RoundingMode . HALF_UP ) );
warning . setAllowDeviation ( threshold . setScale ( 3 , RoundingMode . HALF_UP ) ) ;
warning . setDeviationValue ( theoretic alThickness. subtract ( specThickness ) . setScale ( 3 , RoundingMode . HALF_UP ) ) ;
BigDecimal rate = diff . divide ( specThickness , 10 , RoundingMode . HALF_UP )
. multiply ( new BigDecimal ( " 100 " ) ) . s etS cale ( 1 , RoundingMode . HALF_UP ) ;
warning . setDeviationRate ( rate ) ;
warning . setWarningLevel ( " ERROR " ) ;
warning . setWarningMsg ( " 钢卷实测厚度偏薄,理论厚度= " + theoreticalThickness + " mm, 实测厚度= " + actualThickness + " mm " ) ;
warning . setWarningStatus ( 0 ) ;
warnings . add ( warning ) ;
return ; // 偏薄已经足够严重,不再重复判断偏厚
}
// 规则2: (实测厚度 - 理论厚度) / 理论厚度 > 0.1 → 偏厚超10%
BigDecimal diff = actualThickness . subtract ( theoreticalThickness ) ;
BigDecimal rate = diff . divide ( theoreticalThickness , 10 , RoundingMode . HALF_UP ) ;
if ( rate . compareTo ( threshold ) > 0 ) {
WmsMaterialWarning warning = new WmsMaterialWarning ( ) ;
warning . setCoilId ( coil . getCoilId ( ) ) ;
warning . setWarningType ( " THICKNESS " ) ;
warning . setTheoreticalVal ( theoreticalThickness ) ;
warning . setActualVal ( actualThickness ) ;
warning . setAllowDeviation ( threshold ) ;
warning . setDeviationValue ( diff ) ;
warning . setDeviationRate ( rate . multiply ( new BigDecimal ( " 100 " ) ) . setScale ( 4 , RoundingMode . HALF_UP ) ) ;
warning . setWarningLevel ( " WARNING " ) ;
warning . setWarningMsg ( " 钢卷实测 厚度偏厚超过10% ,理论厚度= " + theoreticalThickness + " mm, 实测 厚度= " + actual Thickness + " mm " ) ;
warning . setWarningMsg ( " 钢卷厚度偏差超出允许范围 ,理论厚度= " + theoreticalThickness . setScale ( 3 , RoundingMode . HALF_UP ) + " mm, 规格 厚度= " + spec Thickness. setScale ( 3 , RoundingMode . HALF_UP ) + " mm " ) ;
warning . setWarningStatus ( 0 ) ;
warnings . add ( warning ) ;
}