@@ -54,7 +54,6 @@ import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter ;
import java.util.* ;
import java.util.concurrent.TimeUnit ;
import java.util.function.Consumer ;
import java.util.stream.Collectors ;
import java.util.stream.Stream ;
@@ -62,6 +61,7 @@ import static org.nl.b_lms.sch.tasks.slitter.util.SlitterTaskUtil.doSavePaperInf
/**
* 定时器呼叫套轴任务
*
* @Author: lyd
* @Date: 2024/2/1
* @Description: 自动任务 呼叫套轴 根据分切计划来呼叫套轴任务 桁架任务
@@ -107,6 +107,7 @@ public class AutoCallAirShaftTask extends Prun {
public final static String IS_ONLY_PULLING = " IS_ONLY_PULLING " ;
public final static String TZ_DAY = " TZ_DAY " ;
public final static String USE_XN = " USE_XN " ;
public final static String BZ_CHECK_EMPTY = " BZ_CHECK_EMPTY " ;
public List < String > stepErrorInfo = new ArrayList < > ( ) ;
@Autowired
private RedissonClient redissonClient ;
@@ -154,6 +155,7 @@ public class AutoCallAirShaftTask extends Prun {
}
}
}
@Transactional ( rollbackFor = Exception . class )
public void doCallShaft ( BstIvtShafttubeivt empty , Param isOnlyPulling , Param tzDay , Param paramObj , Param useXn ) {
log . info ( empty . getPoint_code ( ) + " 执行中... " ) ;
@@ -310,12 +312,13 @@ public class AutoCallAirShaftTask extends Prun {
List < CutpointAirShhaftDto > qzzPoint = sortByPointEmpty ( notTaskPoints ) ;
log . info ( " 查找到满足到对应尺寸的点位-{} " , qzzPoint ) ;
if ( qzzPoint . size ( ) = = 0 ) {
stepErrorInfo . add ( " 没有可拔轴的点位 。 " ) ;
stepErrorInfo . add ( " 没有套轴暂存位没有相同规格的气胀轴来拔轴,直接去气胀轴库获取 。 " ) ;
//若套轴暂存位没有相同规格的气胀轴,直接去气胀轴库找即可
// 调用ACS滚条气涨轴下来
if ( ! toAcsOutShaft ( needPlans , plans , qzzSize , location , empty ) ) {
if ( ! toAcsOutShaft ( needPlans , plans , qzzSize , location , empty ) ) {
log . error ( " 呼叫出轴失败-穿拔轴{}不进行套轴,跳过! " , empty . getPoint_code ( ) ) ;
stepErrorInfo . add ( " 呼叫出轴失败-穿拔轴 " + empty . getPoint_code ( ) + " 不进行套轴,跳过 ! " ) ;
stepErrorInfo . add ( " 呼叫出轴失败-穿拔轴 " + empty . getPoint_code ( ) + " 不进行套轴,直接做拔轴 ! " ) ;
makePullShaft ( empty , specification ) ;
return ;
}
// 保存所需要的分切计划数据到点位上(套轴对接位)更新分切计划
@@ -422,6 +425,7 @@ public class AutoCallAirShaftTask extends Prun {
/**
* 判断是不是有空位置
*
* @param planD
* @return
*/
@@ -430,7 +434,7 @@ public class AutoCallAirShaftTask extends Prun {
String qzzGeneration = planD . getQzz_generation ( ) ;
String location = empty . getPoint_location ( ) ;
// 需要区分上下
List < BstIvtShafttubeivt > shafttubeivts = bstIvtShafttubeivtService . getByQzzSize ( qzzSize , empty . getPoint_code ( ) , location ) ;
List < BstIvtShafttubeivt > shafttubeivts = bstIvtShafttubeivtService . getByQzzSize ( qzzSize , empty . getPoint_code ( ) , location ) ;
if ( shafttubeivts . size ( ) = = 0 ) {
stepErrorInfo . add ( " 气胀轴库找不到[ " + qzzSize + " ]规格的气涨轴位,此次不为[ " + planD . getResource_name ( ) + " ]套轴 " ) ;
log . error ( " 气胀轴库找不到[ " + qzzSize + " ]规格的气涨轴位 " ) ;
@@ -503,6 +507,7 @@ public class AutoCallAirShaftTask extends Prun {
/**
* 跳过跟当前套轴计划一样的管芯的分切计划
*
* @param needPlans 当前能套轴的计划
*/
public void skipTheSameTubePlans ( List < PdmBiSlittingproductionplan > needPlans ) {
@@ -540,10 +545,11 @@ public class AutoCallAirShaftTask extends Prun {
/**
* <h2>呼叫AGV更换纸管</h2>
* <p>默认双管芯尺寸一致
*
* @param needPlans 所需要套轴的分切计划
* @param location 位置
* @param empty 穿拔轴点位
* @param plans 总计划
* @param empty 穿拔轴点位
* @param plans 总计划
* @return 0: false, 1: true, 2: 只作拔轴
*/
public Integer toCallAgvMovePaperTube ( List < PdmBiSlittingproductionplan > needPlans , String location , BstIvtShafttubeivt empty , List < SlitterPlanDistinctDto > plans ) {
@@ -608,7 +614,7 @@ public class AutoCallAirShaftTask extends Prun {
BigDecimal qty = sumByMaterialCode . get ( tubes . get ( 0 ) ) ;
if ( ObjectUtil . isNotEmpty ( qty ) ) {
int sumQty = qty . intValue ( ) ;
if ( sumQty > = needQuantity ) {
if ( sumQty > = needQuantity ) {
stepErrorInfo . add ( " AGV正在搬运管芯... " ) ;
log . info ( " AGV正在搬运管芯... " ) ;
return 1 ;
@@ -774,8 +780,7 @@ public class AutoCallAirShaftTask extends Prun {
List < BstIvtStockingivt > list = stockingivtService . getEmptyPointNotTask ( location , " 0 " ) ;
if ( list . size ( ) = = 0 ) {
stepErrorInfo . add ( " 备货区找不到空位置搬运, 请检查备货区点位情况! " ) ;
redisUtils . set ( " ERROR " + empty . getPoint_code ( ) , stepErrorInfo ) ;
throw new RuntimeException ( " 备货区找不到空位置搬运, 请检查备货区点位情况! " ) ;
return 2 ;
}
BstIvtStockingivt endPoint = list . get ( 0 ) ;
// 创建任务 -> HINT: 在此任务完成之后会调用搬回来的任务,因此任务中要记录需要搬运的点位放在任务请求参数中。
@@ -803,10 +808,11 @@ public class AutoCallAirShaftTask extends Prun {
* @param location 位置:上半部分还是下半部分
* @param empty 套拔轴点位
*/
private Boolean toAcsOutShaft ( List < PdmBiSlittingproductionplan > needPlans , List < SlitterPlanDistinctDto > plans , String qzzSize , String location , BstIvtShafttubeivt empty ) {
private Boolean toAcsOutShaft ( List < PdmBiSlittingproductionplan > needPlans , List < SlitterPlanDistinctDto > plans , String qzzSize , String location , BstIvtShafttubeivt empty ) {
Integer movePaperTube = toCallAgvMovePaperTube ( needPlans , location , empty , plans ) ;
if ( movePaperTube = = 2 ) {
log . info ( " 跳过,无法更换托盘。 " ) ;
stepErrorInfo . add ( " 呼叫AGV更换托盘失败, 无法更换托盘。 " ) ;
return false ;
}
if ( movePaperTube ! = 0 ) {
@@ -814,7 +820,7 @@ public class AutoCallAirShaftTask extends Prun {
return false ;
}
// 需要区分上下
List < BstIvtShafttubeivt > shafttubeivts = bstIvtShafttubeivtService . getByQzzSize ( qzzSize , empty . getPoint_code ( ) , location ) ;
List < BstIvtShafttubeivt > shafttubeivts = bstIvtShafttubeivtService . getByQzzSize ( qzzSize , empty . getPoint_code ( ) , location ) ;
if ( shafttubeivts . size ( ) = = 0 ) {
log . error ( " 气胀轴库找不到[ " + qzzSize + " ]规格的气涨轴位 " ) ;
stepErrorInfo . add ( " 气胀轴库找不到[ " + qzzSize + " ]规格的气涨轴位 " ) ;
@@ -851,7 +857,7 @@ public class AutoCallAirShaftTask extends Prun {
}
if ( ! judgment1 & & ! judgment2 ) {
log . warn ( " 没有气胀轴, 不给ACS写出轴信息 " ) ;
stepErrorInfo . add ( " 呼叫气胀轴失败,(密集库/暂存架)没有 " + qzzSize + " 寸的气胀轴, 不给ACS写出轴信息。请人工补轴或将对应的分切计划点击入站完成 " ) ;
stepErrorInfo . add ( " 呼叫气胀轴失败,(密集库/暂存架)没有 " + qzzSize + " 寸的气胀轴, 不给ACS写出轴信息。请人工补轴或将对应的分切计划点击入站完成 " ) ;
return false ;
}
// 判断气胀轴密集库是否有数据
@@ -978,15 +984,18 @@ public class AutoCallAirShaftTask extends Prun {
if ( list . size ( ) = = 0 ) {
log . warn ( " 气涨轴[{}]对应的分切计划不存在! " , qzzNo ) ;
bcutpointivtService . update ( new UpdateWrapper < BstIvtCutpointivt > ( )
. eq ( " ivt_id " , cutpointivt . getIvt_id ( ) )
. set ( " is_used " , " 0 " )
. set ( " remark " , " 气胀轴 " + qzzNo + " 的计划不存在,无效点位自动禁用 " )
. set ( " update_time " , DateUtil . now ( ) ) ) ;
. eq ( " ivt_id " , cutpointivt . getIvt_id ( ) )
. set ( " is_used " , " 0 " )
. set ( " remark " , " 气胀轴 " + qzzNo + " 的计划不存在,无效点位自动禁用 " )
. set ( " update_time " , DateUtil . now ( ) ) ) ;
stepErrorInfo . add ( " 气胀轴 " + qzzNo + " 的计划不存在,无效点位[ " + cutpointivt . getPoint_code ( ) + " ]自动禁用。 " ) ;
return ;
}
PdmBiSlittingproductionplan plan = list . get ( 0 ) ;
// todo : 考虑是否有空位(如果气涨轴库和气胀轴暂存架都没有空位,则退出)【暂时不考虑】
// hint : 考虑是否有空位(如果气涨轴库和气胀轴暂存架都没有空位,则退出)
if ( doCheckHaveEmptyPoint ( empty , specification , plan ) ) {
return ;
}
List < String > collect = list . stream ( ) . map ( PdmBiSlittingproductionplan : : getContainer_name ) . collect ( Collectors . toList ( ) ) ;
JSONObject param = new JSONObject ( ) ;
param . put ( " point_code1 " , pointCode1 ) ;
@@ -1010,8 +1019,69 @@ public class AutoCallAirShaftTask extends Prun {
stepErrorInfo . add ( " 只做拔轴,拔轴任务已经创建... " ) ;
}
/**
* 检测气胀轴密集库/气胀轴缓存库有没有空位
* @param empty
* @param specification
* @param plan
* @return
*/
private boolean doCheckHaveEmptyPoint ( BstIvtShafttubeivt empty , String specification , PdmBiSlittingproductionplan plan ) {
Param bzCheckEmpty = paramService . findByCode ( BZ_CHECK_EMPTY ) ;
if ( ObjectUtil . isEmpty ( bzCheckEmpty ) ) {
stepErrorInfo . add ( " 参数未配置【BZ_CHECK_EMPTY】, 默认拔轴不检验空位! " ) ;
return false ;
}
if ( " 0 " . equals ( bzCheckEmpty . getValue ( ) ) ) {
stepErrorInfo . add ( " 参数配置【BZ_CHECK_EMPTY】拔轴不检验空位! " ) ;
return false ;
}
// 需要区分上下 - 气胀轴库( 3寸能放7个, 6寸能放6个)
List < BstIvtShafttubeivt > shafttubeivts = bstIvtShafttubeivtService . getByQzzSize ( plan . getQzz_size ( ) , empty . getPoint_code ( ) , empty . getPoint_location ( ) ) ;
if ( shafttubeivts . size ( ) = = 0 ) {
log . error ( " 气胀轴库找不到[ " + plan . getQzz_size ( ) + " ]规格的气涨轴位 " ) ;
stepErrorInfo . add ( " 拔轴空位校验失败:气胀轴库找不到[ " + plan . getQzz_size ( ) + " ]规格的气涨轴位 " ) ;
} else {
Integer qty = 7 ;
// 气涨轴库
BstIvtShafttubeivt shafttubeivt = shafttubeivts . get ( 0 ) ;
qty = " 3 " . equals ( shafttubeivt . getQzz_size ( ) ) ? 7 : 6 ;
JSONArray device_rows = new JSONArray ( ) ;
JSONObject device_obj = new JSONObject ( ) ;
device_rows . add ( device_obj ) ;
device_obj . put ( " device_code " , shafttubeivt . getPoint_code ( ) ) ;
// todo: 暂时都是B1
device_obj . put ( " product_area " , " B1 " ) ;
JSONObject pointStatus = wmsToAcsService . getPointStatus ( device_rows ) ;
if ( ObjectUtil . isEmpty ( pointStatus ) ) {
log . error ( " 获取气胀轴库信息失败 " ) ;
stepErrorInfo . add ( " 拔轴空位校验失败: 获取ACS气胀轴库信息失败... " ) ;
} else {
boolean judgment1 = true ;
boolean judgment2 = true ;
// 获取气涨轴缓存没有任务的点位
List < BstIvtShafttubeivt > qzzCache = bstIvtShafttubeivtService . getNotTaskShaftCacheEmpty ( empty ) ;
if ( qzzCache . size ( ) = = 0 ) {
log . warn ( " 未找到气胀轴密集库可以存放气涨轴规格「 " + plan . getQzz_size ( ) + " 」的暂存位 " ) ;
judgment2 = false ;
}
JSONObject data2 = pointStatus . getJSONArray ( " data " ) . getJSONObject ( 0 ) ;
if ( ObjectUtil . isNotEmpty ( data2 . get ( " qty " ) ) & & data2 . getInteger ( " qty " ) > 0 & & ( qty - data2 . getInteger ( " qty " ) < = 0 ) ) {
log . warn ( " 气胀轴库【 " + shafttubeivt . getPoint_code ( ) + " 】没有空位。 " ) ;
judgment1 = false ;
}
if ( ! judgment1 & & ! judgment2 ) {
stepErrorInfo . add ( " 拔轴空位校验:密集库/缓存架没有可以存放气涨轴规格「 " + plan . getQzz_size ( ) + " - " + specification + " 」的暂存位 " ) ;
return true ;
}
}
}
return false ;
}
/**
* 排序
*
* @param notTaskPoints
* @return
*/