@@ -5,6 +5,7 @@ import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.NumberUtil ;
import cn.hutool.core.util.ObjectUtil ;
import cn.hutool.core.util.StrUtil ;
import com.alibaba.fastjson.JSON ;
import com.alibaba.fastjson.JSONArray ;
import com.alibaba.fastjson.JSONObject ;
import lombok.RequiredArgsConstructor ;
@@ -12,6 +13,7 @@ import lombok.extern.slf4j.Slf4j;
import org.nl.modules.common.exception.BadRequestException ;
import org.nl.modules.system.util.CodeUtil ;
import org.nl.modules.wql.core.bean.WQLObject ;
import org.nl.wms.sch.SchTaskDto ;
import org.nl.wms.sch.manage.AbstractAcsTask ;
import org.nl.wms.sch.manage.TaskStatusEnum ;
import org.nl.wms.sch.tasks.AcsTaskDto ;
@@ -19,6 +21,7 @@ import org.nl.wms.sch.tasks.RegionTypeEnum;
import org.springframework.stereotype.Service ;
import org.springframework.transaction.annotation.Transactional ;
import java.util.ArrayList ;
import java.util.List ;
@Service
@@ -27,8 +30,6 @@ import java.util.List;
public class HtSendEmpVehicleTask extends AbstractAcsTask {
private final String THIS_CLASS = HtSendEmpVehicleTask . class . getName ( ) ;
@Override
@Transactional ( rollbackFor = Exception . class )
public void updateTaskStatus ( JSONObject taskObj , String status ) {
@@ -40,6 +41,21 @@ public class HtSendEmpVehicleTask extends AbstractAcsTask {
if ( StrUtil . equals ( status , " 0 " ) ) {
// 取消删除任务
if ( StrUtil . equals ( jsonTask . getString ( " task_status " ) , TaskStatusEnum . FINISHED . getCode ( ) ) ) {
throw new BadRequestException ( " 已完成不能取消! " ) ;
}
String point_code3 = jsonTask . getString ( " point_code3 " ) ;
String point_code2 = jsonTask . getString ( " point_code2 " ) ;
if ( ObjectUtil . isNotEmpty ( point_code3 ) ) {
JSONObject jsonPoint3 = pointTab . query ( " point_code =' " + point_code3 + " ' " ) . uniqueResult ( 0 ) ;
jsonPoint3 . put ( " point_status " , " 1 " ) ;
pointTab . update ( jsonPoint3 ) ;
}
if ( ObjectUtil . isNotEmpty ( point_code2 ) ) {
JSONObject jsonPoint2 = pointTab . query ( " point_code =' " + point_code2 + " ' " ) . uniqueResult ( 0 ) ;
jsonPoint2 . put ( " point_status " , " 1 " ) ;
pointTab . update ( jsonPoint2 ) ;
}
taskTab . delete ( " task_id = ' " + task_id + " ' " ) ;
}
@@ -62,6 +78,10 @@ public class HtSendEmpVehicleTask extends AbstractAcsTask {
// 更新终点: 判断point_code3是否为空, 为空就更新point_code2
if ( ObjectUtil . isNotEmpty ( point_code3 ) ) {
point_code = point_code3 ;
// 更新point_code2:解锁
JSONObject point2 = pointTab . query ( " point_code = ' " + jsonTask . getString ( " point_code2 " ) + " ' " ) . uniqueResult ( 0 ) ;
point2 . put ( " lock_type " , " 1 " ) ;
pointTab . update ( point2 ) ;
} else {
point_code = jsonTask . getString ( " point_code2 " ) ;
}
@@ -79,6 +99,7 @@ public class HtSendEmpVehicleTask extends AbstractAcsTask {
pointTab . update ( endPoint ) ;
} else { //非叠盘架
endPoint . put ( " lock_type " , " 1 " ) ;
endPoint . put ( " vehicle_code " , jsonTask . getString ( " vehicle_code " ) ) ;
endPoint . put ( " vehicle_qty " , jsonTask . getString ( " vehicle_qty " ) ) ;
endPoint . put ( " vehicle_type " , jsonTask . getString ( " vehicle_type " ) ) ;
endPoint . put ( " point_status " , " 2 " ) ;
@@ -91,132 +112,42 @@ public class HtSendEmpVehicleTask extends AbstractAcsTask {
@Override
@Transactional ( rollbackFor = Exception . class )
public String createTask ( JSONObject form ) {
/*
* 1.先生成确定起点的任务
* 2.通过findNextPoint()找终点
* 3.下发给ACS
*/
WQLObject taskTab = WQLObject . getWQLObject ( " SCH_BASE_Task " ) ; // 任务表
WQLObject pointTab = WQLObject . getWQLObject ( " SCH_BASE_Point " ) ; // 点位表
WQLObject vehicleTab = WQLObject . getWQLObject ( " md_pb_vehicle " ) ; // 载具表
String qty = form . getString ( " qty " ) ;
String point_code1 = form . getString ( " point_code1 " ) ;
String point_code2 = " " ;
String task_id = " " ;
JSONObject jsonVehicle = vehicleTab . query ( " vehicle_code = ' " + form . getString ( " vehicle_code " ) + " ' ") . uniqueResult ( 0 ) ;
if ( ObjectUtil . isEmpty ( jsonVehicle ) ) throw new BadRequestException ( " 此载具号不存在 " ) ;
// 1.判断货梯是否有任务,如果有生成起点确定的任务
// 空托盘一楼到二楼固定点位: SSX01A1 , SSX02A1
//判断SSX01A1是否有任务没有则判断其他的三个点位
boolean ssx_1 = this . isTask ( " SSX01A1 " ) ;
if ( ssx_1 ) {
String like = " SSX01% " ;
JSONArray taskArrNum = new JSONArray ( ) ;
JSONArray pointArr = pointTab . query ( " region_id = ' " + RegionTypeEnum . SSX . getId ( ) + " ' and is_used = '1' and is_delete = '0' and point_code like ' " + like + " ' " ) . getResultJSONArray ( 0 ) ;
for ( int i = 0 ; i < pointArr . size ( ) ; i + + ) {
JSONObject json = pointArr . getJSONObject ( i ) ;
boolean is_empTask = this . isTask ( json . getString ( " point_code " ) ) ;
if ( ! is_empTask ) taskArrNum . add ( json ) ;
}
if ( taskArrNum . size ( ) > 0 ) {
} else {
point_code2 = " SSX01A1 " ;
}
}
// 判断SSX02A1是否有任务没有则判断其他的三个点位
if ( ObjectUtil . isEmpty ( point_code2 ) ) {
boolean ssx_2 = this . isTask ( " SSX02A1 " ) ;
if ( ssx_2 ) {
String like = " SSX02% " ;
JSONArray taskArrNum = new JSONArray ( ) ;
JSONArray pointArr = pointTab . query ( " region_id = ' " + RegionTypeEnum . SSX . getId ( ) + " ' and is_used = '1' and is_delete = '0' and point_code like ' " + like + " ' " ) . getResultJSONArray ( 0 ) ;
for ( int i = 0 ; i < pointArr . size ( ) ; i + + ) {
JSONObject json = pointArr . getJSONObject ( i ) ;
boolean is_empTask = this . isTask ( json . getString ( " point_code " ) ) ;
if ( ! is_empTask ) taskArrNum . add ( json ) ;
}
if ( taskArrNum . size ( ) > 0 ) {
} else {
point_code2 = " SSX02A1 " ;
}
}
}
// 如果此时point_code2为空则生成起点确认的任务
if ( ObjectUtil . isEmpty ( point_code2 ) ) {
JSONObject param = new JSONObject ( ) ;
param . put ( " task_status " , " 2 " ) ;
param . put ( " point_code1 " , point_code1 ) ;
param . put ( " vehicle_type " , jsonVehicle . getString ( " vehicle_type " ) ) ;
param . put ( " vehicle_qty " , qty ) ;
param . put ( " vehicle_code " , jsonVehicle . getString ( " vehicle_code " ) ) ;
param . put ( " acs_task_type " , " 1 " ) ;
task_id = this . pubCreateTask ( param ) ;
} else {
// 说明货梯无任务:找终点
JSONObject param = new JSONObject ( ) ;
param . put ( " vehicle_type " , jsonVehicle . getString ( " vehicle_type " ) ) ;
param . put ( " qty " , qty ) ;
String endPoint = this . endPoint ( param ) ;
// 如果终点为空则创建起点确定的任务
if ( ObjectUtil . isEmpty ( endPoint ) ) {
JSONObject param2 = new JSONObject ( ) ;
param2 . put ( " task_status " , " 2 " ) ;
param2 . put ( " point_code1 " , point_code1 ) ;
param2 . put ( " vehicle_type " , jsonVehicle . getString ( " vehicle_type " ) ) ;
param2 . put ( " vehicle_qty " , qty ) ;
param2 . put ( " vehicle_code " , jsonVehicle . getString ( " vehicle_code " ) ) ;
param . put ( " acs_task_type " , " 1 " ) ;
task_id = this . pubCreateTask ( param2 ) ;
} else {
// 不为空则创建到养生A区等待点的任务
// 处理终点编码:入在第一个 '-'前加1, 出在第一个 '-'前加2
// String sub_1 = endPoint.substring(0, endPoint.indexOf("-"));
// String sub_2 = endPoint.substring(endPoint.indexOf("-"), endPoint.length());
JSONObject param2 = new JSONObject ( ) ;
param2 . put ( " task_status " , " 4 " ) ;
param2 . put ( " point_code1 " , point_code1 ) ;
param2 . put ( " point_code2 " , endPoint ) ;
param2 . put ( " vehicle_type " , jsonVehicle . getString ( " vehicle_type " ) ) ;
param2 . put ( " vehicle_qty " , qty ) ;
param2 . put ( " vehicle_code " , jsonVehicle . getString ( " vehicle_code " ) ) ;
param . put ( " acs_task_type " , " 1 " ) ;
task_id = this . pubCreateTask ( param2 ) ;
// 锁定终点
JSONObject jsonEnd = pointTab . query ( " point_code = ' " + endPoint + " ' " ) . uniqueResult ( 0 ) ;
jsonEnd . put ( " lock_type " , " 2 " ) ;
pointTab . update ( jsonEnd ) ;
}
}
return task_id ;
SchTaskDto dto = SchTaskDto . builder ( ) . task_id ( org . nl . wms . util . IdUtil . getLongId ( ) )
. task_code ( CodeUtil . getNewCode ( " TASK_CODE " ) )
. task_type ( " " )
. task_status ( TaskStatusEnum . SURE_START . getCode ( ) )
. point_code1 ( point_code1 )
. vehicle_code ( form . getString ( " vehicle_code " ) )
. vehicle_type ( form . getString ( " vehicle_type " ) )
. vehicle_qty ( form . getIntValue ( " qty " ) )
. handle_class ( THIS_CLASS )
. create_time ( DateUtil . now ( ) )
. build ( ) ;
JSONObject json = JSONObject . parseObject ( JSON . toJSONString ( dto ) ) ;
taskTab . insert ( json ) ;
this . findNextPoint ( ) ;
// this.immediateNotifyAcs() ;
return String . valueOf ( dto . getTask_id ( ) ) ;
}
/**
* @return
* @discription 确定下一点位
* @author ldjun
* @created 2020年6月12日 下午6:01:06
*/
@Override
public void findNextPoint ( ) {
/*
* 根据业务找对应的终点
*/
WQLObject taskTab = WQLObject . getWQLObject ( " SCH_BASE_Task " ) ;
WQLObject pointTab = WQLObject . getWQLObject ( " sch_base_point " ) ;
JSONArray taskArr = taskTab . query ( " handle_class = ' " + THIS_CLASS + " ' and is_delete = '0' and task_status = '2' " ) . getResultJSONArray ( 0 ) ;
JSONArray taskArr = taskTab . query ( " handle_class = ' " + THIS_CLASS + " 'and is_delete = '0' and task_status = '2' " ) . getResultJSONArray ( 0 ) ;
for ( int i = 0 ; i < taskArr . size ( ) ; i + + ) {
JSONObject jsonTask = taskArr . getJSONObject ( i ) ;
String point_code_ht = " " ;
@@ -298,6 +229,9 @@ public class HtSendEmpVehicleTask extends AbstractAcsTask {
@Override
@Transactional ( rollbackFor = Exception . class )
public void forceFinish ( String task_id ) {
/*
* 强制完成
*/
JSONObject taskObj = WQLObject . getWQLObject ( " SCH_BASE_Task " ) . query ( " task_id = ' " + task_id + " ' " ) . uniqueResult ( 0 ) ;
this . updateTaskStatus ( taskObj , TaskStatusEnum . FINISHED . getCode ( ) ) ;
}
@@ -371,32 +305,11 @@ public class HtSendEmpVehicleTask extends AbstractAcsTask {
return end_code ;
}
@Transactional ( rollbackFor = Exception . class )
public String pubCreateTask ( JSONObject param ) {
WQLObject taskTab = WQLObject . getWQLObject ( " SCH_BASE_Task " ) ; // 任务表
JSONObject jsonTask = new JSONObject ( ) ;
jsonTask . put ( " task_id " , IdUtil . getSnowflake ( 1 , 1 ) . nextId ( ) ) ;
jsonTask . put ( " task_code " , CodeUtil . getNewCode ( " TASK_CODE " ) ) ;
jsonTask . put ( " task_type " , " " ) ;
jsonTask . put ( " task_status " , param . getString ( " task_status " ) ) ;
jsonTask . put ( " point_code1 " , param . getString ( " point_code1 " ) ) ;
jsonTask . put ( " point_code2 " , param . getString ( " point_code2 " ) ) ;
jsonTask . put ( " vehicle_type " , param . getString ( " vehicle_type " ) ) ;
jsonTask . put ( " vehicle_qty " , param . getString ( " vehicle_qty " ) ) ;
jsonTask . put ( " vehicle_code " , param . getString ( " vehicle_code " ) ) ;
jsonTask . put ( " priority " , " 1 " ) ;
jsonTask . put ( " handle_class " , THIS_CLASS ) ;
jsonTask . put ( " sort_seq " , " 1 " ) ;
jsonTask . put ( " acs_task_type " , param . getString ( " acs_task_type " ) ) ;
jsonTask . put ( " create_time " , DateUtil . now ( ) ) ;
taskTab . insert ( jsonTask ) ;
return jsonTask . getString ( " task_id " ) ;
}
@Transactional ( rollbackFor = Exception . class )
public boolean isTask ( String point_code ) {
/*
* 判断点位是否有任务存在
*/
WQLObject tab = WQLObject . getWQLObject ( " SCH_BASE_Task " ) ;
boolean result ;
@@ -416,7 +329,12 @@ public class HtSendEmpVehicleTask extends AbstractAcsTask {
}
@Transactional ( rollbackFor = Exception . class )
@Override
public String againApply ( String task_id ) {
/*
* 再次下发任务处理方法
* 涉及业务:入空载具、出空载具、入物料、出物料
*/
WQLObject taskTab = WQLObject . getWQLObject ( " SCH_BASE_Task " ) ; // 任务表
WQLObject pointTab = WQLObject . getWQLObject ( " SCH_BASE_Point " ) ; // 点位表
@@ -430,7 +348,7 @@ public class HtSendEmpVehicleTask extends AbstractAcsTask {
JSONObject jsonOnePoint = pointTab . query ( " region_id = ' " + jsonPoint2 . getString ( " region_id " ) +
" ' and block_num = ' " + jsonPoint2 . getString ( " block_num " ) +
" ' and col_num = ' " + jsonPoint2 . getString ( " col_num " ) +
" ' and point_code <> ' " + jsonPoint2 . getString ( " point_code " ) +
" ' and point_code <> ' " + jsonPoint2 . getString ( " point_code " ) +
" ' and point_status = '2' order by in_empty_seq ASC " ) . uniqueResult ( 0 ) ;
// 如果为空说明这一列其他货位为空 则入到最后一个货位
@@ -438,10 +356,14 @@ public class HtSendEmpVehicleTask extends AbstractAcsTask {
JSONObject jsonEmpPoint = pointTab . query ( " region_id = ' " + jsonPoint2 . getString ( " region_id " ) +
" ' and block_num = ' " + jsonPoint2 . getString ( " block_num " ) +
" ' and col_num = ' " + jsonPoint2 . getString ( " col_num " ) +
" ' and point_code <> ' " + jsonPoint2 . getString ( " point_code " ) +
" ' and point_code <> ' " + jsonPoint2 . getString ( " point_code " ) +
" ' and point_status = '1' order by in_empty_seq DESC " ) . uniqueResult ( 0 ) ;
if ( ObjectUtil . isEmpty ( jsonEmpPoint ) ) point_code = jsonEmpPoint . getString ( " point_code " ) ;
if ( ObjectUtil . isNot Empty ( jsonEmpPoint ) ) {
point_code = jsonEmpPoint . getString ( " point_code " ) ;
jsonTask . put ( " point_code3 " , point_code ) ;
taskTab . update ( jsonTask ) ;
}
} else {
// 找前一位的空位
double in_empty_seq = NumberUtil . sub ( jsonOnePoint . getIntValue ( " in_empty_seq " ) , 1 ) ;
@@ -449,17 +371,46 @@ public class HtSendEmpVehicleTask extends AbstractAcsTask {
JSONObject jsonEmpPoint = pointTab . query ( " region_id = ' " + jsonPoint2 . getString ( " region_id " ) +
" ' and block_num = ' " + jsonPoint2 . getString ( " block_num " ) +
" ' and col_num = ' " + jsonPoint2 . getString ( " col_num " ) +
" ' and point_code <> ' " + jsonPoint2 . getString ( " point_code " ) +
" ' and in_empty_seq = ' " + in_empty_seq +
" ' and point_code <> ' " + jsonPoint2 . getString ( " point_code " ) +
" ' and in_empty_seq = ' " + in_empty_seq +
" ' and point_status = '1' " ) . uniqueResult ( 0 ) ;
if ( ObjectUtil . isNotEmpty ( jsonEmpPoint ) ) point_code = jsonEmpPoint . getString ( " point_code " ) ;
if ( ObjectUtil . isNotEmpty ( jsonEmpPoint ) ) {
point_code = jsonEmpPoint . getString ( " point_code " ) ;
jsonTask . put ( " point_code3 " , point_code ) ;
taskTab . update ( jsonTask ) ;
}
}
JSONObject jsonEndPoint = pointTab . query ( " point_code = ' " + point_code + " ' " ) . uniqueResult ( 0 ) ;
jsonEndPoint . put ( " lock_type " , " 2 " ) ;
pointTab . update ( jsonEndPoint ) ;
return point_code ;
}
@Override
public List < AcsTaskDto > addTask ( ) {
return null ;
/*
* 下发给ACS时需要特殊处理
*/
JSONArray arr = WQLObject . getWQLObject ( " SCH_BASE_Task " ) . query ( " handle_class = ' " + THIS_CLASS + " ' and task_status = ' " + TaskStatusEnum . START_AND_POINT . getCode ( ) + " ' and is_delete ='0' " ) . getResultJSONArray ( 0 ) ;
ArrayList < AcsTaskDto > resultList = new ArrayList < > ( ) ;
for ( int i = 0 ; i < arr . size ( ) ; i + + ) {
JSONObject json = arr . getJSONObject ( i ) ;
AcsTaskDto dto = AcsTaskDto . builder ( )
. task_id ( json . getString ( " task_id " ) )
. task_code ( json . getString ( " task_code " ) )
. task_type ( json . getString ( " task_type " ) )
. start_device_code ( json . getString ( " point_code1 " ) )
. next_device_code ( json . getString ( " point_code3 " ) )
. vehicle_code ( json . getString ( " vehicle_code " ) )
. vehicle_type ( json . getString ( " vehicle_type " ) )
. priority ( json . getString ( " priority " ) )
. remark ( json . getString ( " remark " ) )
. build ( ) ;
resultList . add ( dto ) ;
}
return resultList ;
}
}