opt:印尼项目更新
This commit is contained in:
@@ -9,9 +9,6 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.nl.b_lms.pda.service.VehicleTwoService;
|
||||
import org.nl.b_lms.pdm.info.dao.PdmBiContainerinbound;
|
||||
import org.nl.b_lms.pdm.info.service.IPdmBiContainerinboundService;
|
||||
import org.nl.b_lms.pdm.productSpec.service.impl.PdmProductSpecServiceImpl;
|
||||
import org.nl.b_lms.pdm.storagevehicleext.dao.MdPbStoragevehicleext;
|
||||
import org.nl.b_lms.pdm.storagevehicleext.service.IMdPbStoragevehicleextService;
|
||||
import org.nl.b_lms.pdm.subpackagerelation.dao.PdmBiSubpackagerelation;
|
||||
@@ -25,6 +22,7 @@ import org.nl.b_lms.sch.tasks.boxstack.BoxSSXTask;
|
||||
import org.nl.b_lms.storage_manage.database.service.IBstIvtBoxinfoService;
|
||||
import org.nl.b_lms.storage_manage.database.service.dao.BstIvtBoxinfo;
|
||||
import org.nl.b_lms.storage_manage.ios.enums.IOSEnum;
|
||||
import org.nl.b_lms.storage_manage.ios.service.iostorInv.util.AisleConflictHelper;
|
||||
import org.nl.b_lms.storage_manage.ios.service.iostorInv.util.service.InBoxManageService;
|
||||
import org.nl.b_lms.storage_manage.ios.service.iostorInv.util.service.InBussManageService;
|
||||
import org.nl.b_lms.storage_manage.ios.service.iostorInv.util.service.InVehicleManageService;
|
||||
@@ -378,6 +376,8 @@ public class VehicleTwoServiceImpl implements VehicleTwoService {
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public JSONObject InVehicleIn(JSONObject whereJson) {
|
||||
|
||||
AisleConflictHelper aisleConflictHelper = SpringContextHolder.getBean(AisleConflictHelper.class);
|
||||
|
||||
MdPdStorageVehicleInfo mdPdStorageVehicleInfo = mdStorageVehicleInfoMapper.selectOne(new QueryWrapper<MdPdStorageVehicleInfo>().eq("storagevehicle_code", whereJson.getString("vehicle_code")));
|
||||
if (ObjectUtil.isEmpty(mdPdStorageVehicleInfo)) {
|
||||
throw new BadRequestException("载具不存在!");
|
||||
@@ -433,6 +433,23 @@ public class VehicleTwoServiceImpl implements VehicleTwoService {
|
||||
}
|
||||
|
||||
|
||||
//优先巷道
|
||||
String vehicleCode2 = whereJson.getString("vehicle_code");
|
||||
String deviceCode2 = whereJson.getString("point_code");
|
||||
if (aisleConflictHelper.isSecondFloor(deviceCode2)) {
|
||||
if(vehicleCode2.startsWith("YNX")) {
|
||||
Integer recommendedBlock = aisleConflictHelper.getRecommendedBlockForInbound(vehicleCode2);
|
||||
if (recommendedBlock == null) {
|
||||
throw new BadRequestException("当前所有大托盘巷道都有出库任务,无法分配入库货位");
|
||||
}
|
||||
} else if(vehicleCode2.startsWith("YNY")) {
|
||||
if (aisleConflictHelper.hasOutboundTask("4")) {
|
||||
throw new BadRequestException("4号巷道有出库任务,无法分配小托盘入库货位");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// if(!IOSEnum.VEHICLE_TYPE_SCAN_POINT.code(vehicle_type).equals(point_code)){
|
||||
// throw new BadRequestException("点位只能为" + IOSEnum.VEHICLE_TYPE_SCAN_POINT.code(vehicle_type));
|
||||
// }
|
||||
@@ -453,6 +470,8 @@ public class VehicleTwoServiceImpl implements VehicleTwoService {
|
||||
throw new BadRequestException("高度超高,无法入库");
|
||||
}
|
||||
|
||||
|
||||
|
||||
JSONArray rows = new JSONArray();
|
||||
|
||||
JSONObject jsonObject = new JSONObject();
|
||||
@@ -470,9 +489,45 @@ public class VehicleTwoServiceImpl implements VehicleTwoService {
|
||||
|
||||
rows.add(jsonObject1);
|
||||
|
||||
redisUtils.set(whereJson.getString("vehicle_code") + "InVehicleInHeightLevel", height);
|
||||
|
||||
JSONObject jsonObject2 = new JSONObject();
|
||||
jsonObject2.put("device_code", point_code);
|
||||
jsonObject2.put("code", "material_barcode");
|
||||
jsonObject2.put("value", mdPdStorageVehicleInfo.getStoragevehicle_code() + "-0");
|
||||
jsonObject2.put("product_area", "BLK");
|
||||
|
||||
rows.add(jsonObject2);
|
||||
|
||||
JSONObject jsonObject3 = new JSONObject();
|
||||
jsonObject3.put("device_code", point_code);
|
||||
jsonObject3.put("code", "barcode");
|
||||
jsonObject3.put("value", mdPdStorageVehicleInfo.getStoragevehicle_code());
|
||||
jsonObject3.put("product_area", "BLK");
|
||||
|
||||
rows.add(jsonObject3);
|
||||
|
||||
wmsToAcsService.action(rows);
|
||||
|
||||
JSONObject param = new JSONObject();
|
||||
param.put("type", "3");
|
||||
param.put("container_type", mdPdStorageVehicleInfo.getStoragevehicle_type().substring(mdPdStorageVehicleInfo.getStoragevehicle_type().length() - 1));
|
||||
param.put("material_barcode", whereJson.getString("vehicle_code") + "-" + "0");
|
||||
param.put("barcode", whereJson.getString("vehicle_code"));
|
||||
|
||||
JSONObject jsonParam = new JSONObject();
|
||||
jsonParam.put("start_device_code", whereJson.getString("point_code"));
|
||||
jsonParam.put("next_device_code", "RK2011");
|
||||
jsonParam.put("vehicle_code2", mdPdStorageVehicleInfo.getStoragevehicle_code());
|
||||
jsonParam.put("vehicle_code", mdPdStorageVehicleInfo.getStoragevehicle_code());
|
||||
jsonParam.put("task_status", TaskStatusEnum.START_AND_POINT.getCode());
|
||||
jsonParam.put("task_type", "010713");
|
||||
jsonParam.put("request_param", param.toString());
|
||||
boxSSXTask.createTask(jsonParam);
|
||||
boxSSXTask.immediateNotifyAcs(null);
|
||||
|
||||
|
||||
redisUtils.set(whereJson.getString("vehicle_code") + "InVehicleInHeightLevel", height);
|
||||
|
||||
result.put("message", "入库成功!");
|
||||
return result;
|
||||
}
|
||||
@@ -651,11 +706,14 @@ public class VehicleTwoServiceImpl implements VehicleTwoService {
|
||||
}
|
||||
|
||||
/**
|
||||
* 生产入库,AGV未上线 临时方案
|
||||
* 生产入库(退货口入库),AGV未上线 临时方案
|
||||
* @param whereJson
|
||||
* @return
|
||||
*/
|
||||
public JSONObject reBackIn(JSONObject whereJson) {
|
||||
|
||||
AisleConflictHelper aisleConflictHelper = SpringContextHolder.getBean(AisleConflictHelper.class);
|
||||
|
||||
//生成托盘和木箱的绑定关系
|
||||
//下发acs任务,确认
|
||||
|
||||
@@ -772,7 +830,60 @@ public class VehicleTwoServiceImpl implements VehicleTwoService {
|
||||
param.put("container_type", mdPdStorageVehicleInfo.getStoragevehicle_type().substring(mdPdStorageVehicleInfo.getStoragevehicle_type().length() - 1));
|
||||
param.put("material_barcode", whereJson.getString("box_no") + "-" + whereJson.getString("bill_type").replace("0", ""));
|
||||
param.put("barcode", whereJson.getString("vehicle_code"));
|
||||
param.put("isUncap",whereJson.getString("is_un_cap"));
|
||||
|
||||
String vehicleCode2 = whereJson.getString("vehicle_code");
|
||||
String deviceCode2 = whereJson.getString("device_code");
|
||||
if (aisleConflictHelper.isSecondFloor(deviceCode2)) {
|
||||
if(vehicleCode2.startsWith("YNX")) {
|
||||
Integer recommendedBlock = aisleConflictHelper.getRecommendedBlockForInbound(vehicleCode2);
|
||||
if (recommendedBlock == null) {
|
||||
throw new BadRequestException("当前所有大托盘巷道都有出库任务,无法分配入库货位");
|
||||
}
|
||||
} else if(vehicleCode2.startsWith("YNY")) {
|
||||
if (aisleConflictHelper.hasOutboundTask("4")) {
|
||||
throw new BadRequestException("4号巷道有出库任务,无法分配小托盘入库货位");
|
||||
}
|
||||
}
|
||||
}
|
||||
param.put("isUncap", whereJson.getString("is_un_cap"));
|
||||
if ("RK2026".equals(whereJson.getString("device_code"))) {
|
||||
param.put("isUncap", "0");
|
||||
|
||||
JSONArray rows = new JSONArray();
|
||||
|
||||
JSONObject jsonObject = new JSONObject();
|
||||
jsonObject.put("device_code", whereJson.getString("device_code"));
|
||||
jsonObject.put("code", "to_back_up_1");
|
||||
jsonObject.put("value", "4");
|
||||
jsonObject.put("product_area", "BLK");
|
||||
rows.add(jsonObject);
|
||||
|
||||
JSONObject jsonObject1 = new JSONObject();
|
||||
jsonObject1.put("device_code", whereJson.getString("device_code"));
|
||||
jsonObject1.put("code", "to_container_type");
|
||||
jsonObject1.put("value", mdPdStorageVehicleInfo.getStoragevehicle_type().substring(mdPdStorageVehicleInfo.getStoragevehicle_type().length() - 1));
|
||||
jsonObject1.put("product_area", "BLK");
|
||||
|
||||
rows.add(jsonObject1);
|
||||
|
||||
JSONObject jsonObject2 = new JSONObject();
|
||||
jsonObject2.put("device_code", whereJson.getString("device_code"));
|
||||
jsonObject2.put("code", "material_barcode");
|
||||
jsonObject2.put("value", whereJson.getString("box_no") + "-" + whereJson.getString("bill_type").replace("0", ""));
|
||||
jsonObject2.put("product_area", "BLK");
|
||||
|
||||
rows.add(jsonObject2);
|
||||
|
||||
JSONObject jsonObject3 = new JSONObject();
|
||||
jsonObject3.put("device_code", whereJson.getString("device_code"));
|
||||
jsonObject3.put("code", "barcode");
|
||||
jsonObject3.put("value", whereJson.getString("vehicle_code"));
|
||||
jsonObject3.put("product_area", "BLK");
|
||||
|
||||
rows.add(jsonObject3);
|
||||
|
||||
wmsToAcsService.action(rows);
|
||||
}
|
||||
|
||||
JSONObject jsonParam = new JSONObject();
|
||||
jsonParam.put("start_device_code", whereJson.getString("device_code"));
|
||||
|
||||
@@ -6,7 +6,9 @@ import lombok.extern.slf4j.Slf4j;
|
||||
import org.nl.b_lms.sch.task.dao.SchBaseTask;
|
||||
import org.nl.b_lms.sch.task.dao.mapper.SchBaseTaskMapper;
|
||||
import org.nl.b_lms.sch.tasks.first_floor_area.auto.Prun;
|
||||
import org.nl.b_lms.storage_manage.ios.service.iostorInv.util.AisleConflictHelper;
|
||||
import org.nl.common.utils.RedissonUtils;
|
||||
import org.nl.modules.wql.util.SpringContextHolder;
|
||||
import org.nl.wms.sch.AcsTaskDto;
|
||||
import org.nl.wms.sch.manage.AbstractAcsTask;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
@@ -34,6 +36,10 @@ public class AutoSendTask extends Prun {
|
||||
try {
|
||||
RedissonUtils.lock(c -> {
|
||||
log.info("start_immediateNotifyAcs task......");
|
||||
// 清除上一轮的ThreadLocal批次追踪数据
|
||||
AisleConflictHelper aisleConflictHelper = SpringContextHolder.getBean(AisleConflictHelper.class);
|
||||
aisleConflictHelper.clearCurrentBatch();
|
||||
|
||||
// 获取全部继承AbstractAcsTask的Bean
|
||||
Map<String, AbstractAcsTask> allTaskBeans = applicationContext.getBeansOfType(AbstractAcsTask.class);
|
||||
List<AcsTaskDto> totalAllTask = new ArrayList<>();
|
||||
@@ -44,7 +50,11 @@ public class AutoSendTask extends Prun {
|
||||
|
||||
// 遍历采集所有业务任务
|
||||
for (AbstractAcsTask task : allTaskBeans.values()) {
|
||||
String cc = task.getClass().getSimpleName();
|
||||
String cc = task.getClass().getName();
|
||||
if(!cc.contains("org.nl.b_lms.sch.tasks.TwoOutTask")){
|
||||
continue;
|
||||
}
|
||||
|
||||
int count = (int) waitingTaskList.stream()
|
||||
.filter(a -> !StringUtils.isEmpty(a.getHandle_class() )
|
||||
&& task.getClass().getName().contains(a.getHandle_class()))
|
||||
@@ -65,14 +75,19 @@ public class AutoSendTask extends Prun {
|
||||
}
|
||||
}
|
||||
|
||||
if (CollectionUtil.isEmpty(totalAllTask)) {
|
||||
log.info("暂无ACS任务需要下发");
|
||||
return;
|
||||
}
|
||||
try {
|
||||
if (CollectionUtil.isEmpty(totalAllTask)) {
|
||||
log.info("暂无ACS任务需要下发");
|
||||
return;
|
||||
}
|
||||
|
||||
// 取出任意一个任务实例调用父类下发过滤方法(父类通用逻辑,任意实例均可)
|
||||
AbstractAcsTask anyTaskInstance = allTaskBeans.values().iterator().next();
|
||||
anyTaskInstance.immediateNotifyAcsList(totalAllTask);
|
||||
// 取出任意一个任务实例调用父类下发过滤方法(父类通用逻辑,任意实例均可)
|
||||
AbstractAcsTask anyTaskInstance = allTaskBeans.values().iterator().next();
|
||||
anyTaskInstance.immediateNotifyAcsList(totalAllTask);
|
||||
} finally {
|
||||
// 清除当前轮次的ThreadLocal批次追踪数据
|
||||
aisleConflictHelper.clearCurrentBatch();
|
||||
}
|
||||
|
||||
}, "AutoSendTask", 30, this);
|
||||
} catch (Exception ex) {
|
||||
|
||||
@@ -46,6 +46,7 @@ import org.nl.b_lms.storage_manage.ios.service.iostorInv.dao.StIvtIostorinvdtl;
|
||||
import org.nl.b_lms.storage_manage.ios.service.iostorInv.dao.mapper.StIvtIostorinvOutMapper;
|
||||
import org.nl.b_lms.storage_manage.ios.service.iostorInv.dao.mapper.StIvtIostorinvdisMapper;
|
||||
import org.nl.b_lms.storage_manage.ios.service.iostorInv.dto.InventoryQueryParam;
|
||||
import org.nl.b_lms.storage_manage.ios.service.iostorInv.util.AisleConflictHelper;
|
||||
import org.nl.b_lms.storage_manage.ios.service.iostorInv.util.service.InBussManageService;
|
||||
import org.nl.b_lms.storage_manage.ios.service.iostorInv.util.service.OutBussManageService;
|
||||
import org.nl.b_lms.storage_manage.ios.service.iostorInv.util.service.TwoInBussManageService;
|
||||
@@ -698,6 +699,18 @@ public class StIvtIostorinvOutServiceImpl extends ServiceImpl<StIvtIostorinvOutM
|
||||
// createTask(taskMange.getJSONArray("out").toJavaList(JSONObject.class),disLikeList,whereJson.getString("point_code"));
|
||||
}
|
||||
|
||||
// for (List<JSONObject> outTaskMangeList : outTaskMangeMap.values()) {
|
||||
// for (int i = 0; i < outTaskMangeList.size(); i++) {
|
||||
// JSONObject json = outTaskMangeList.get(i);
|
||||
// if(StringUtils.isBlank(json.getString("storagevehicle_code"))){
|
||||
// throw new BadRequestException("货位不能为空!");
|
||||
// }
|
||||
//
|
||||
// //计算载具和对应关系表中,有没有出现
|
||||
//
|
||||
// }
|
||||
// }
|
||||
|
||||
// 下发移库任务
|
||||
if (ObjectUtil.isNotEmpty(moveTaskMangeList)) {
|
||||
outBussManageService.createMove2(moveTaskMangeList);
|
||||
@@ -706,6 +719,12 @@ public class StIvtIostorinvOutServiceImpl extends ServiceImpl<StIvtIostorinvOutM
|
||||
// TODO --
|
||||
// 创建出库任务
|
||||
try {
|
||||
for (List<JSONObject> outTaskMangeList : outTaskMangeMap.values()) {
|
||||
JSONObject jsonVeExt = mdPbStoragevehicleextService.getOneByPcsnToObject(outTaskMangeList.get(0).getString("storagevehicle_code"));
|
||||
if (ObjectUtil.isEmpty(jsonVeExt)) {
|
||||
throw new BadRequestException("此木箱没有绑定托盘号!" + outTaskMangeList.get(0) .getString("storagevehicle_code"));
|
||||
}
|
||||
}
|
||||
for (List<JSONObject> outTaskMangeList : outTaskMangeMap.values()) {
|
||||
createTask(outTaskMangeList, disTaskMangeList, whereJson.getString("point_code"),whereJson.getString("checked"),whereJson.getString("bill_type"));
|
||||
}
|
||||
@@ -1248,7 +1267,7 @@ public class StIvtIostorinvOutServiceImpl extends ServiceImpl<StIvtIostorinvOutM
|
||||
*/
|
||||
@Transactional
|
||||
public void createForTask(JSONObject json, JSONObject where) {
|
||||
|
||||
AisleConflictHelper aisleConflictHelper = SpringContextHolder.getBean(AisleConflictHelper.class);
|
||||
|
||||
String flag = where.getString("flag");
|
||||
String is_auto_issue = where.getString("is_auto_issue");
|
||||
@@ -1278,7 +1297,7 @@ public class StIvtIostorinvOutServiceImpl extends ServiceImpl<StIvtIostorinvOutM
|
||||
throw new BadRequestException("点位没有大小托盘类型,请确认");
|
||||
}
|
||||
|
||||
if (!IOSEnum.EXCEP_OUT.code(json.getString("storagevehicle_type")).equals(where.getString("point_code"))) {
|
||||
if ( !aisleConflictHelper.isSecondFloor(where.getString("point_code")) &&!IOSEnum.EXCEP_OUT.code(json.getString("storagevehicle_type")).equals(where.getString("point_code"))) {
|
||||
throw new BadRequestException("出库口选择有误,请确认起点的大小托盘类型与终点是否匹配");
|
||||
}
|
||||
end_device_code = where.getString("point_code");
|
||||
@@ -1941,12 +1960,7 @@ public class StIvtIostorinvOutServiceImpl extends ServiceImpl<StIvtIostorinvOutM
|
||||
flag = jsonParam.getString("value");
|
||||
}
|
||||
IStIvtIostorinvOutService aopService = SpringContextHolder.getBean(IStIvtIostorinvOutService.class);
|
||||
for (int i = 0; i < taskMangeList.size(); i++) {
|
||||
JSONObject json = taskMangeList.get(i);
|
||||
if(StringUtils.isBlank(json.getString("storagevehicle_code"))){
|
||||
throw new BadRequestException("批次不能为空!");
|
||||
}
|
||||
}
|
||||
|
||||
for (int i = 0; i < taskMangeList.size(); i++) {
|
||||
JSONObject json = taskMangeList.get(i);
|
||||
// TODO ---
|
||||
|
||||
@@ -32,6 +32,10 @@ public class AisleConflictHelper {
|
||||
private static final List<String> INBOUND_TASK_CLASSES = Arrays.asList(TWO_IN_TASK_CLASS, TWO_IN_EMP_TASK_CLASS);
|
||||
private static final List<String> OUTBOUND_TASK_CLASSES = Arrays.asList(TWO_OUT_TASK_CLASS, TWO_OUT_EMP_TASK_CLASS);
|
||||
|
||||
// ThreadLocal: 跟踪当前调度批次中已通过检查的巷道(解决同批次04状态任务互相不可见的问题)
|
||||
private static final ThreadLocal<Set<String>> currentBatchOutboundAisles = ThreadLocal.withInitial(HashSet::new);
|
||||
private static final ThreadLocal<Set<String>> currentBatchInboundAisles = ThreadLocal.withInitial(HashSet::new);
|
||||
|
||||
@Autowired
|
||||
private SchBaseTaskMapper schBaseTaskMapper;
|
||||
|
||||
@@ -101,10 +105,20 @@ public class AisleConflictHelper {
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* 清除当前批次的巷道追踪记录
|
||||
* 在AutoSendTask.run()和immediateNotifyAcs()结束时调用,防止下一次调度使用旧数据
|
||||
*/
|
||||
public void clearCurrentBatch() {
|
||||
currentBatchOutboundAisles.remove();
|
||||
currentBatchInboundAisles.remove();
|
||||
}
|
||||
|
||||
/**
|
||||
* 判断指定巷道是否有入库任务(已下发或执行中)
|
||||
* 入库任务: handle_class in (TwoInTask, TwoInEmpTask), task_status < '07'
|
||||
* 入库任务: handle_class in (TwoInTask, TwoInEmpTask), task_status in ('05','06')
|
||||
* 入库任务通过 point_code2(货位) 关联巷道
|
||||
* 注意: 不包含04状态(未下发)的任务,04状态的同批次任务通过ThreadLocal追踪
|
||||
*/
|
||||
public boolean hasInboundTask(String blockNum) {
|
||||
if (StrUtil.isBlank(blockNum)) {
|
||||
@@ -113,7 +127,7 @@ public class AisleConflictHelper {
|
||||
List<SchBaseTask> tasks = schBaseTaskMapper.selectList(
|
||||
new LambdaQueryWrapper<SchBaseTask>()
|
||||
.in(SchBaseTask::getHandle_class, INBOUND_TASK_CLASSES)
|
||||
.lt(SchBaseTask::getTask_status, TaskStatusEnum.FINISHED.getCode())
|
||||
.in(SchBaseTask::getTask_status, TaskStatusEnum.ISSUE.getCode(), TaskStatusEnum.EXECUTING.getCode())
|
||||
.eq(SchBaseTask::getIs_delete, "0")
|
||||
);
|
||||
for (SchBaseTask task : tasks) {
|
||||
@@ -209,6 +223,7 @@ public class AisleConflictHelper {
|
||||
/**
|
||||
* 获取大托盘可用的入库巷道列表(排除有出库任务的巷道)
|
||||
* 包含 TwoOutTask 和 TwoOutEmpTask
|
||||
* 同时排除当前批次已通过检查的出库巷道(ThreadLocal)
|
||||
*/
|
||||
public List<String> getAvailableLargePalletAisles() {
|
||||
List<SchBaseTask> tasks = schBaseTaskMapper.selectList(
|
||||
@@ -225,6 +240,8 @@ public class AisleConflictHelper {
|
||||
occupiedAisles.add(aisle);
|
||||
}
|
||||
}
|
||||
// 加入当前批次已通过检查的出库巷道
|
||||
occupiedAisles.addAll(currentBatchOutboundAisles.get());
|
||||
|
||||
List<String> availableAisles = new ArrayList<>(LARGE_PALLET_AISLES);
|
||||
availableAisles.removeAll(occupiedAisles);
|
||||
@@ -247,6 +264,7 @@ public class AisleConflictHelper {
|
||||
* @param pointCode1 出库起点(货位位置, 如L1-01-01)
|
||||
* @param pointCode2 出库终点(输送线点位, 如CK2009)
|
||||
* @return true: 可以下发, false: 不可下发
|
||||
* 注意: 通过检查后会自动将巷道记录到当前批次(ThreadLocal),供同批次后续任务检查
|
||||
*/
|
||||
public boolean canDispatchOutbound(String pointCode1, String pointCode2) {
|
||||
// 通过输送线点位判断是否二楼
|
||||
@@ -260,7 +278,8 @@ public class AisleConflictHelper {
|
||||
return true;
|
||||
}
|
||||
|
||||
if (hasInboundTask(blockNum)) {
|
||||
// 检查入库任务: DB(05/06) + 当前批次已通过检查的入库巷道(ThreadLocal)
|
||||
if (hasInboundTask(blockNum) || currentBatchInboundAisles.get().contains(blockNum)) {
|
||||
log.info("巷道[{}]有入库任务,出库任务不下发", blockNum);
|
||||
return false;
|
||||
}
|
||||
@@ -272,8 +291,9 @@ public class AisleConflictHelper {
|
||||
return false;
|
||||
}
|
||||
} else if (LARGE_PALLET.equals(palletType)) {
|
||||
// 获取当前有出库任务的巷道集合
|
||||
// 获取当前有出库任务的巷道集合: DB(05/06) + 当前批次(ThreadLocal)
|
||||
Set<String> occupiedAisles = getLargePalletOutboundAisles();
|
||||
occupiedAisles.addAll(currentBatchOutboundAisles.get());
|
||||
// 如果当前巷道不在已出库集合中,且已有2个巷道在出库,则不下发(保留至少一个巷道能入库)
|
||||
if (!occupiedAisles.contains(blockNum) && occupiedAisles.size() >= 2) {
|
||||
log.info("大托盘出库巷道数已达[{}]个,巷道[{}]出库任务不下发(保留至少一个巷道入库)", occupiedAisles.size(), blockNum);
|
||||
@@ -281,6 +301,8 @@ public class AisleConflictHelper {
|
||||
}
|
||||
}
|
||||
|
||||
// 通过检查,记录当前批次的出库巷道
|
||||
currentBatchOutboundAisles.get().add(blockNum);
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -289,6 +311,7 @@ public class AisleConflictHelper {
|
||||
* @param pointCode1 入库起点(输送线点位, 如RK2011)
|
||||
* @param pointCode2 入库终点(货位位置, 如L1-01-01)
|
||||
* @return true: 可以下发, false: 不可下发
|
||||
* 注意: 通过检查后会自动将巷道记录到当前批次(ThreadLocal),供同批次后续任务检查
|
||||
*/
|
||||
public boolean canDispatchInbound(String pointCode1, String pointCode2) {
|
||||
// 通过输送线点位判断是否二楼
|
||||
@@ -304,11 +327,13 @@ public class AisleConflictHelper {
|
||||
|
||||
String palletType = getPalletTypeByBlockNum(blockNum);
|
||||
if (SMALL_PALLET.equals(palletType)) {
|
||||
if (hasOutboundTask(SMALL_PALLET_AISLE)) {
|
||||
// 检查出库任务: DB(05/06) + 当前批次已通过检查的出库巷道(ThreadLocal)
|
||||
if (hasOutboundTask(SMALL_PALLET_AISLE) || currentBatchOutboundAisles.get().contains(SMALL_PALLET_AISLE)) {
|
||||
log.info("小托盘巷道[{}]有出库任务,入库任务不下发", blockNum);
|
||||
return false;
|
||||
}
|
||||
} else if (LARGE_PALLET.equals(palletType)) {
|
||||
// getAvailableLargePalletAisles已包含ThreadLocal排除逻辑
|
||||
List<String> availableAisles = getAvailableLargePalletAisles();
|
||||
if (!availableAisles.contains(blockNum)) {
|
||||
log.info("大托盘巷道[{}]有出库任务,入库任务不下发", blockNum);
|
||||
@@ -316,6 +341,8 @@ public class AisleConflictHelper {
|
||||
}
|
||||
}
|
||||
|
||||
// 通过检查,记录当前批次的入库巷道
|
||||
currentBatchInboundAisles.get().add(blockNum);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@@ -1328,16 +1328,17 @@ public class AcsToWmsServiceImpl implements AcsToWmsService {
|
||||
whereJson.put("material_barcode",containers);
|
||||
String vehicleCode = whereJson.getString("vehicle_code");
|
||||
String deviceCode = whereJson.getString("device_code");
|
||||
|
||||
if (aisleConflictHelper.isSecondFloor(deviceCode)) {
|
||||
if(vehicleCode.startsWith("YNX")) {
|
||||
Integer recommendedBlock = aisleConflictHelper.getRecommendedBlockForInbound(vehicleCode);
|
||||
if (recommendedBlock == null) {
|
||||
throw new BadRequestException("当前所有大托盘巷道都有出库任务,无法分配入库货位");
|
||||
errorMsg.add("当前所有大托盘巷道都有出库任务,无法分配入库货位");
|
||||
}
|
||||
whereJson.put("move_block_num", String.valueOf(recommendedBlock));
|
||||
} else if(vehicleCode.startsWith("YNY")) {
|
||||
if (aisleConflictHelper.hasOutboundTask("4")) {
|
||||
throw new BadRequestException("4号巷道有出库任务,无法分配小托盘入库货位");
|
||||
errorMsg.add("4号巷道有出库任务,无法分配小托盘入库货位");
|
||||
}
|
||||
whereJson.put("move_block_num", "4");
|
||||
}
|
||||
@@ -1356,9 +1357,9 @@ public class AcsToWmsServiceImpl implements AcsToWmsService {
|
||||
JSONObject jsonTaskParam = new JSONObject();
|
||||
//创建异常任务去异常入库口
|
||||
//入库口
|
||||
jsonTaskParam.put("point_code1", "RK1018");
|
||||
jsonTaskParam.put("point_code1", "RK2011");
|
||||
//异常位
|
||||
jsonTaskParam.put("point_code2", "RK1003");
|
||||
jsonTaskParam.put("point_code2", "RK2009");
|
||||
jsonTaskParam.put("vehicle_code", jsonObject.getString("box_no"));
|
||||
jsonTaskParam.put("vehicle_code2", whereJson.getString("vehicle_code"));
|
||||
JSONObject request_param = new JSONObject();
|
||||
@@ -2183,6 +2184,7 @@ public class AcsToWmsServiceImpl implements AcsToWmsService {
|
||||
jsonObject.put("boxHigh", boxDao.getBox_high());
|
||||
jsonObject.put("desiccantTemplate", desiccantTemplate);
|
||||
jsonObject.put("isUncap", isUncap);
|
||||
jsonObject.put("quanlity_in_box", boxDao.getNum());
|
||||
jsonObject.put("type", IOSEnum.ACSTOLMS_TYPE.code("木箱装箱开盒盖位"));
|
||||
jsonObject.put("heightLevel", height);
|
||||
jsonObject.put("material_barcode", boxDao.getBox_no());
|
||||
|
||||
@@ -13,7 +13,7 @@ public enum RegionTypeEnum {
|
||||
B_HKZC("10", "A2烘烤暂存区", "1587360656355627008"),
|
||||
C_HKZC("11", "A3烘烤暂存区", "1587360700223852544"),
|
||||
D_HKZC("12", "A4烘烤暂存区", "1587360741864902656"),
|
||||
ZC01("13", "主存区", "1582991348217286656"),
|
||||
ZC01("13", "主存区", "2071537527294136320"),
|
||||
KTP01("14", "空托盘区", "1582991511971303424"),
|
||||
ZZ01("15", "中转区", "1582995342054526976"),
|
||||
LKRK("16", "密集库入库输送线", "1585164789083148288"),
|
||||
|
||||
@@ -8,6 +8,7 @@ import com.alibaba.fastjson.JSONObject;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import org.nl.b_lms.sch.task.dao.SchBaseTask;
|
||||
import org.nl.b_lms.sch.task.dao.mapper.SchBaseTaskMapper;
|
||||
import org.nl.b_lms.storage_manage.ios.service.iostorInv.util.AisleConflictHelper;
|
||||
import org.nl.modules.wql.util.SpringContextHolder;
|
||||
import org.nl.wms.sch.AcsTaskDto;
|
||||
import org.nl.wms.sch.AcsUtil;
|
||||
@@ -136,8 +137,14 @@ public abstract class AbstractAcsTask {
|
||||
*/
|
||||
|
||||
public JSONObject immediateNotifyAcs(String task_id) {
|
||||
List<AcsTaskDto> singleTaskList = this.schedule();
|
||||
return immediateNotifyAcsList(singleTaskList);
|
||||
AisleConflictHelper aisleConflictHelper = SpringContextHolder.getBean(AisleConflictHelper.class);
|
||||
aisleConflictHelper.clearCurrentBatch();
|
||||
try {
|
||||
List<AcsTaskDto> singleTaskList = this.schedule();
|
||||
return immediateNotifyAcsList(singleTaskList);
|
||||
} finally {
|
||||
aisleConflictHelper.clearCurrentBatch();
|
||||
}
|
||||
}
|
||||
|
||||
public JSONObject immediateNotifyAcsList(List<AcsTaskDto> taskList) {
|
||||
|
||||
@@ -115,7 +115,7 @@ export default {
|
||||
rows: [],
|
||||
dialogDis: true,
|
||||
lock: '',
|
||||
defaultList: ['1582991156504039424', '1645705331612979200']
|
||||
defaultList: ['1582991156504039424', '2071537527294136320']
|
||||
}
|
||||
},
|
||||
watch: {
|
||||
|
||||
@@ -404,7 +404,7 @@ export default {
|
||||
crudPoint.getRegion().then(res => {
|
||||
this.regionList = res
|
||||
})
|
||||
this.$set(this.query, 'region_id', '1582991348217286656')
|
||||
this.$set(this.query, 'region_id', '2071537527294136320')
|
||||
this.crud.toQuery()
|
||||
},
|
||||
methods: {
|
||||
|
||||
@@ -151,7 +151,7 @@ export default {
|
||||
opendtlParam: '',
|
||||
sects: [],
|
||||
rows: [],
|
||||
defaultList: ['1582991156504039424', '1582991348217286656']
|
||||
defaultList: ['1582991156504039424', '2071537527294136320']
|
||||
}
|
||||
},
|
||||
watch: {
|
||||
|
||||
Reference in New Issue
Block a user