opt:一楼盘点出入库、二楼action->任务

This commit is contained in:
2026-08-03 08:45:50 +07:00
parent 6726e4931f
commit 285d15af7a
12 changed files with 472 additions and 125 deletions

View File

@@ -51,6 +51,13 @@ public class VehicleTwoController {
return new ResponseEntity<>(vehicleTwoService.twoVehicleIn(whereJson), HttpStatus.OK);
}
@PostMapping("/inventoryCheckIn")
@Log("盘点入库")
@SaIgnore
public ResponseEntity<Object> inventoryCheckIn(@RequestBody JSONObject whereJson) {
return new ResponseEntity<>(vehicleTwoService.inventoryCheckIn(whereJson), HttpStatus.OK);
}
@PostMapping("/boxIn")
@Log("木箱入库")
@SaIgnore

View File

@@ -20,6 +20,17 @@ public interface VehicleTwoService {
*/
JSONObject twoVehicleIn(JSONObject whereJson);
/**
*
* @param whereJson {
* vehicle_code: 载具号
* point_code: 点位
* box_no: 木箱号
* }
* @return JSONObject返回前端参数
*/
JSONObject inventoryCheckIn(JSONObject whereJson);
/**
* 一楼入库空载具入库
* @param whereJson {

View File

@@ -21,6 +21,7 @@ import org.nl.b_lms.sch.point.service.IschBasePointService;
import org.nl.b_lms.sch.task.dao.SchBaseTask;
import org.nl.b_lms.sch.task.service.IschBaseTaskService;
import org.nl.b_lms.sch.tasks.TwoInEmpExcepTask;
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;
@@ -32,6 +33,7 @@ import org.nl.b_lms.storage_manage.md.dao.MdPdStorageVehicleInfo;
import org.nl.b_lms.storage_manage.md.dao.MdPdStoragevehicleext;
import org.nl.b_lms.storage_manage.md.dao.mapper.MdPdStoragevehicleextMapper;
import org.nl.b_lms.storage_manage.md.dao.mapper.MdStorageVehicleInfoMapper;
import org.nl.b_lms.storage_manage.st.dao.StIvtStructattr;
import org.nl.common.enums.SpecEnum;
import org.nl.modules.common.exception.BadRequestException;
import org.nl.modules.common.utils.RedisUtils;
@@ -43,6 +45,7 @@ import org.nl.system.service.param.impl.SysParamServiceImpl;
import org.nl.wms.basedata.st.service.StructattrService;
import org.nl.wms.ext.acs.service.WmsToAcsService;
import org.nl.wms.ext.mes.service.LmsToMesService;
import org.nl.wms.sch.manage.AutoSendFeiShu;
import org.nl.wms.sch.manage.TaskStatusEnum;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@@ -50,10 +53,7 @@ import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Optional;
import java.util.*;
import java.util.stream.Collectors;
@Service
@@ -122,6 +122,9 @@ public class VehicleTwoServiceImpl implements VehicleTwoService {
@Resource
private IschBaseTaskService taskService;
@Autowired
private BoxSSXTask boxSSXTask;
/**
* 空载具出库处理服务
@@ -227,6 +230,107 @@ public class VehicleTwoServiceImpl implements VehicleTwoService {
}
@Override
@Transactional(rollbackFor = Exception.class)
public JSONObject inventoryCheckIn(JSONObject whereJson) {
JSONObject result = new JSONObject();
String point_code = whereJson.getString("point_code");
// 判断起点是否存在
SchBasePoint pointDao = ischBasePointService.getOne(
new QueryWrapper<SchBasePoint>().lambda()
.eq(SchBasePoint::getPoint_code, point_code)
.eq(SchBasePoint::getIs_delete, IOSEnum.IS_NOTANDYES.code(""))
.eq(SchBasePoint::getIs_used, IOSEnum.IS_NOTANDYES.code(""))
);
if (ObjectUtil.isEmpty(pointDao)) {
throw new BadRequestException("点位:" + point_code + "不存在或未启用!");
}
int count = taskService.count(new QueryWrapper<SchBaseTask>()
.eq("point_code1", point_code)
.eq("vehicle_code2", whereJson.getString("vehicle_code"))
.eq("is_delete", "0")
.lt("task_status", TaskStatusEnum.EXECUTING.getCode()));
MdPdStorageVehicleInfo mdPdStorageVehicleInfo = mdStorageVehicleInfoMapper.selectOne(new QueryWrapper<MdPdStorageVehicleInfo>().eq("storagevehicle_code", whereJson.getString("vehicle_code")));
if (ObjectUtil.isEmpty(mdPdStorageVehicleInfo)) {
throw new BadRequestException("载具不存在!");
}
MdPdStoragevehicleext mdPdStoragevehicleext = mdPdStoragevehicleextMapper.selectOne(new QueryWrapper<MdPdStoragevehicleext>().eq("storagevehicle_code", mdPdStorageVehicleInfo.getStoragevehicle_code()));
if (ObjectUtil.isEmpty(mdPdStoragevehicleext)) {
MdPdStoragevehicleext mdPdStoragevehicleextInsert = new MdPdStoragevehicleext();
mdPdStoragevehicleextInsert.setStoragevehicleext_id(org.nl.common.utils.IdUtil.getStringId());
mdPdStoragevehicleextInsert.setStoragevehicle_code(mdPdStorageVehicleInfo.getStoragevehicle_code());
mdPdStoragevehicleextInsert.setStoragevehicle_id(mdPdStorageVehicleInfo.getStoragevehicle_id());
mdPdStoragevehicleextInsert.setStoragevehicle_type(mdPdStorageVehicleInfo.getStoragevehicle_type());
mdPdStoragevehicleextInsert.setPcsn(whereJson.getString("box_no"));
mdPdStoragevehicleextInsert.setDevice_uuid(org.nl.common.utils.IdUtil.getLongId());
mdPdStoragevehicleextInsert.setUpdate_time(DateUtil.now());
mdPdStoragevehicleextInsert.setQty("1");
mdPdStoragevehicleextMapper.insert(mdPdStoragevehicleextInsert);
} else {
String pcsn = mdPdStoragevehicleext.getPcsn();
if (StringUtils.isNotEmpty(pcsn)) {
JSONArray stIvtStructattr = WQLObject.getWQLObject("st_ivt_structattr").query("storagevehicle_code = '" + pcsn + "'").getResultJSONArray(0);
if (stIvtStructattr != null && stIvtStructattr.size() > 0) {
throw new BadRequestException("当前托盘" + whereJson.getString("vehicle_code") + "已经绑定木箱" + pcsn);
}
}
if(StringUtils.isBlank(mdPdStoragevehicleext.getQty())){
mdPdStoragevehicleext.setQty("1");
}
mdPdStoragevehicleext.setPcsn(whereJson.getString("box_no"));
mdPdStoragevehicleext.setDevice_uuid(org.nl.common.utils.IdUtil.getLongId());
mdPdStoragevehicleext.setUpdate_time(DateUtil.now());
mdPdStoragevehicleextMapper.updateById(mdPdStoragevehicleext);
}
if (count > 0) {
throw new BadRequestException(whereJson.getString("vehicle_code") + "存在任务");
}
if(!mdPdStoragevehicleext.getPcsn().equals(whereJson.getString("box_no"))){
throw new BadRequestException("输入的箱号有误,请确认!");
}
List<PdmBiSubpackagerelation> subList = ipdmBiSubpackagerelationService.list(new LambdaQueryWrapper<PdmBiSubpackagerelation>()
.eq(PdmBiSubpackagerelation::getPackage_box_sn, mdPdStoragevehicleext.getPcsn())
.eq(PdmBiSubpackagerelation::getStatus, "3"));
if (null == subList || subList.size() == 0) {
throw new BadRequestException("已出库的子卷包装关系不存在,箱号:" + mdPdStoragevehicleext.getPcsn());
}
List<String> material_barcode = subList.stream()
.filter(Objects::nonNull)
.map(PdmBiSubpackagerelation::getContainer_name)
.filter(str -> str != null && !str.trim().isEmpty())
.collect(Collectors.toList());
whereJson.put("material_barcode", material_barcode);
whereJson.put("bill_type", IOSEnum.IN_TYPE.code("盘点入库"));
if (whereJson.getString("vehicle_code").startsWith("YNY")) {
whereJson.put("move_block_num", "4");
}
if (!whereJson.containsKey("point_code")) {
whereJson.put("point_code", whereJson.getString("device_code"));
}
whereJson.put("device_code", whereJson.getString("point_code"));
inBussManageService.inTask(whereJson);
result.put("message", "入库成功!");
return result;
}
@Override
@Transactional(rollbackFor = Exception.class)
public JSONObject vehicleOut(JSONObject whereJson) {
@@ -260,6 +364,14 @@ public class VehicleTwoServiceImpl implements VehicleTwoService {
whereJson.put("point_code","RK2026");
}
if("RK2005".equals(whereJson.getString("point_code"))){
whereJson.put("point_code","RK2027");
}
if("RK2008".equals(whereJson.getString("point_code"))){
whereJson.put("point_code","RK2028");
}
String point_code = whereJson.getString("point_code");
String vehicle_type = whereJson.getString("vehicle_type");
if( whereJson.getIntValue("layer") >4 || whereJson.getIntValue("layer")<1){
@@ -478,7 +590,9 @@ public class VehicleTwoServiceImpl implements VehicleTwoService {
if (bill_type.equals("0001") || bill_type.equals("0009")) {
//此时执行临时方案
if (IOSEnum.SPECIAL_POINTS.code("2楼手工生产点位").equals(whereJson.getString("point_code"))
if (IOSEnum.SPECIAL_POINTS.code("2楼异常点位").equals(whereJson.getString("point_code"))
||IOSEnum.SPECIAL_POINTS.code("2楼装箱入库点1").equals(whereJson.getString("point_code"))
||IOSEnum.SPECIAL_POINTS.code("2楼装箱入库点2").equals(whereJson.getString("point_code"))
||IOSEnum.VEHICLE_TYPE_SCAN_POINT.code("1").equals(whereJson.getString("point_code"))) {
return reBackIn(whereJson);
}
@@ -553,6 +667,7 @@ public class VehicleTwoServiceImpl implements VehicleTwoService {
mdPdStoragevehicleextInsert.setDevice_uuid(org.nl.common.utils.IdUtil.getLongId());
mdPdStoragevehicleextInsert.setUpdate_time(DateUtil.now());
mdPdStoragevehicleextInsert.setRemark("reBackIn");
mdPdStoragevehicleextInsert.setQty("1");
mdPdStoragevehicleextMapper.insert(mdPdStoragevehicleextInsert);
} else {
@@ -563,6 +678,9 @@ public class VehicleTwoServiceImpl implements VehicleTwoService {
throw new BadRequestException("当前托盘" + whereJson.getString("vehicle_code") + "已经绑定木箱" + pcsn);
}
}
if (StringUtils.isBlank(mdPdStoragevehicleext.getQty())) {
mdPdStoragevehicleext.setQty("1");
}
mdPdStoragevehicleext.setPcsn(whereJson.getString("box_no"));
mdPdStoragevehicleext.setDevice_uuid(org.nl.common.utils.IdUtil.getLongId());
mdPdStoragevehicleext.setUpdate_time(DateUtil.now());
@@ -574,40 +692,71 @@ public class VehicleTwoServiceImpl implements VehicleTwoService {
whereJson.put("device_code","RK2026");
}
JSONArray rows = new JSONArray();
if("RK2005".equals(whereJson.getString("device_code"))){
whereJson.put("device_code","RK2027");
}
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);
if("RK2008".equals(whereJson.getString("device_code"))){
whereJson.put("device_code","RK2028");
}
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");
if(!"RK2026".equals(whereJson.getString("device_code"))
&& !"RK2027".equals(whereJson.getString("device_code"))
&& !"RK2028".equals(whereJson.getString("device_code"))) {
JSONArray rows = new JSONArray();
rows.add(jsonObject1);
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 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");
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(jsonObject2);
rows.add(jsonObject1);
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");
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(jsonObject3);
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);
} else {
JSONObject param = new JSONObject();
param.put("type", "4");
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"));
JSONObject jsonParam = new JSONObject();
jsonParam.put("start_device_code", whereJson.getString("device_code"));
jsonParam.put("next_device_code", "RK2011");
jsonParam.put("vehicle_code2", whereJson.getString("box_no"));
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);
}
wmsToAcsService.action(rows);
JSONObject result = new JSONObject();
result.put("message", "入库成功!");
return result;

View File

@@ -7,6 +7,7 @@ import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import lombok.extern.slf4j.Slf4j;
import org.nl.b_lms.sch.task.dao.SchBaseTask;
@@ -16,6 +17,8 @@ import org.nl.b_lms.storage_manage.ios.service.iostorInv.dao.StIvtIostorinvdis;
import org.nl.b_lms.storage_manage.ios.service.iostorInv.dao.mapper.StIvtIostorinvdisMapper;
import org.nl.b_lms.storage_manage.ios.service.iostorInv.impl.StIvtIostorinvOutServiceImpl;
import org.nl.b_lms.storage_manage.ios.service.iostorInv.util.impl.LashManageServiceImpl;
import org.nl.b_lms.storage_manage.md.dao.MdPdStoragevehicleext;
import org.nl.b_lms.storage_manage.md.dao.mapper.MdPdStoragevehicleextMapper;
import org.nl.b_lms.storage_manage.st.dao.StIvtStructattr;
import org.nl.b_lms.storage_manage.st.dao.mapper.StIvtStructattrMapper;
import org.nl.common.utils.RedissonUtils;
@@ -55,6 +58,9 @@ public class TwoOutTask extends AbstractAcsTask {
@Autowired
StIvtStructattrMapper stIvtStructattrMapper;
@Autowired
private MdPdStoragevehicleextMapper mdPdStoragevehicleextMapper;
@Override
@@ -218,6 +224,7 @@ public class TwoOutTask extends AbstractAcsTask {
}
if (StrUtil.equals(status, TaskStatusEnum.FINISHED.getCode())) {
RedissonUtils.lock(c -> {
StIvtIostorinvOutServiceImpl bean = SpringContextHolder.getBean(StIvtIostorinvOutServiceImpl.class);
JSONObject jsonObject = (JSONObject) JSONObject.toJSON(jsonTask);
bean.finishTask(jsonObject);
@@ -235,6 +242,12 @@ public class TwoOutTask extends AbstractAcsTask {
stIvtStructattrMapper.updateById(stIvtStructattr);
}
// 更新载具信息表
MdPdStoragevehicleext mdPdStoragevehicleext = mdPdStoragevehicleextMapper.selectOne(new LambdaQueryWrapper<MdPdStoragevehicleext>()
.eq(MdPdStoragevehicleext::getPcsn, jsonTask.getVehicle_code()));
mdPdStoragevehicleext.setPcsn("");
mdPdStoragevehicleextMapper.updateById(mdPdStoragevehicleext);
JSONObject parse = (JSONObject) JSONObject.parse(jsonTask.getRequest_param());
JSONObject jsonParam = new JSONObject();
jsonParam.put("device_code",jsonTask.getPoint_code2());
@@ -262,7 +275,9 @@ public class TwoOutTask extends AbstractAcsTask {
if (!"RK2009".equals(jsonTask.getPoint_code2())
&&!"RK1010".equals(jsonTask.getPoint_code2())
&&!"RK1003".equals(jsonTask.getPoint_code2())) {
&&!"RK1003".equals(jsonTask.getPoint_code2())
&& !"RK2005".equals(jsonTask.getPoint_code2())
&& !"RK2008".equals(jsonTask.getPoint_code2())) {
LashManageServiceImpl bean1 = SpringContextHolder.getBean(LashManageServiceImpl.class);
bean1.createHeapTask(jsonParam);

View File

@@ -0,0 +1,82 @@
package org.nl.b_lms.sch.tasks.auto;
import cn.hutool.core.collection.CollectionUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
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.common.utils.RedissonUtils;
import org.nl.wms.sch.AcsTaskDto;
import org.nl.wms.sch.manage.AbstractAcsTask;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
@Slf4j
@Component
public class AutoSendTask extends Prun {
// 注入spring上下文 获取所有任务子类Bean
@Autowired
private ApplicationContext applicationContext;
@Autowired
private SchBaseTaskMapper schBaseTaskMapper;
@Override
public void run() {
try {
RedissonUtils.lock(c -> {
log.info("start_immediateNotifyAcs task......");
// 获取全部继承AbstractAcsTask的Bean
Map<String, AbstractAcsTask> allTaskBeans = applicationContext.getBeansOfType(AbstractAcsTask.class);
List<AcsTaskDto> totalAllTask = new ArrayList<>();
List<SchBaseTask> waitingTaskList = schBaseTaskMapper.selectList(new LambdaQueryWrapper<SchBaseTask>()
.eq(SchBaseTask::getTask_status,"04").eq(SchBaseTask::getIs_delete, "0"));
// 遍历采集所有业务任务
for (AbstractAcsTask task : allTaskBeans.values()) {
String cc = task.getClass().getSimpleName();
int count = (int) waitingTaskList.stream()
.filter(a -> !StringUtils.isEmpty(a.getHandle_class() )
&& task.getClass().getName().contains(a.getHandle_class()))
.count();
if(count == 0){
continue;
}
try {
List<AcsTaskDto> taskList = task.schedule();
if (CollectionUtil.isNotEmpty(taskList)) {
totalAllTask.addAll(taskList);
log.info("{} 读取待下发任务数量:{}", task.getClass().getSimpleName(), taskList.size());
}
} catch (Exception e) {
log.error("{} 任务查询异常", task.getClass().getSimpleName(), e);
}
}
if (CollectionUtil.isEmpty(totalAllTask)) {
log.info("暂无ACS任务需要下发");
return;
}
// 取出任意一个任务实例调用父类下发过滤方法(父类通用逻辑,任意实例均可)
AbstractAcsTask anyTaskInstance = allTaskBeans.values().iterator().next();
anyTaskInstance.immediateNotifyAcsList(totalAllTask);
}, "AutoSendTask", 30, this);
} catch (Exception ex) {
log.error("定时下发ACS任务整体异常", ex);
}
}
}

View File

@@ -1,27 +0,0 @@
package org.nl.b_lms.sch.tasks.auto;
import lombok.extern.slf4j.Slf4j;
import org.nl.b_lms.sch.tasks.TwoOutHeapTask;
import org.nl.b_lms.sch.tasks.first_floor_area.auto.Prun;
import org.nl.common.utils.RedissonUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Slf4j
@Component
public class AutoTwoFloorSendTask extends Prun {
@Autowired
private TwoOutHeapTask twoOutHeapTask;
@Override
public void run() {
try {
RedissonUtils.lock(c -> {
log.info("start_sendTaskAcs task......");
twoOutHeapTask.sendTaskAcs(null,true);
},"resendrgv", 30, this);
}catch (Exception ex){
log.error(ex.getMessage());
}
}
}

View File

@@ -37,13 +37,13 @@ public enum IOSEnum {
//入库单据类型
IN_TYPE(MapOf.of("生产入库", "0001", "退货入库", "0002", "报废入库", "0003", "调拨入库", "0004",
"拆箱入库", "0005", "返检入库", "0006", "改切入库", "0007", "手工入库", "0009","换标入库", "0012"
"拆箱入库", "0005", "返检入库", "0006", "改切入库", "0007", "手工入库", "0009","换标入库", "0012","盘点入库", "0016"
)),
//出库单据类型
OUT_TYPE(MapOf.of("发货出库", "1001", "改切出库", "1003", "调拨出库", "1004", "拆箱出库", "1005",
"返检出库", "1006", "超期报废", "1007", "退货报废", "1008", "质量问题报废", "1010", "其他报废", "1002",
"手工出库", "1009","转单出库", "1020","贴标出库", "1021","管控出库", "1099","换标出库", "1012"
"手工出库", "1009","转单出库", "1020","贴标出库", "1021","管控出库", "1099","换标出库", "1012","盘点出库","1016"
)),
//移库单据类型
@@ -123,9 +123,9 @@ public enum IOSEnum {
OUT_HANGER(MapOf.of("行架位1", "CK1134","行架位2", "CK1138")),
// 点位
POINT_CODE(MapOf.of("退货入库位", "KMXRKW2", "1125","CK1125", "1124","CK1124","木箱装箱开盒盖位","CK2024","空木箱上二楼终点","RK2004")),
POINT_CODE(MapOf.of("退货入库位", "KMXRKW2", "1125","CK1125", "1124","CK1124","空木箱上二楼终点","RK2004")),
TYPE_POINT_CODE(MapOf.of("RK1005", "KMXRKW1", "RK1012","KMXRKW1","木箱装箱开盒盖位","CK2024")),
TYPE_POINT_CODE(MapOf.of("RK1005", "KMXRKW1", "RK1012","KMXRKW1")),
//acs申请任务
@@ -141,6 +141,10 @@ public enum IOSEnum {
,"退货异常申请行架对接位至NG位","9",
"1楼换标入库","10")),
LMSTOACS_TYPE(MapOf.of(
"盘点出库","11"
)),
// acs外部系统用户
EXT_ACS(MapOf.of("acs", "2","kc","康成")),
@@ -156,7 +160,9 @@ public enum IOSEnum {
)),
//特殊出入库点位
SPECIAL_POINTS(MapOf.of("异常出库口", "CKYC","退货入库口","CKTH","退货行架对接位","THHJDJ","2楼手工生产点位","RK2009","2楼扫码称称重点位","RK2026")),
SPECIAL_POINTS(MapOf.of("异常出库口", "CKYC","退货入库口","CKTH","退货行架对接位","THHJDJ","2楼异常点位","RK2009",
"2楼装箱入库点1","RK2005",
"2楼装箱入库点2","RK2008","2楼扫码称称重点位","RK2026")),

View File

@@ -1039,6 +1039,7 @@ public class StIvtIostorinvOutServiceImpl extends ServiceImpl<StIvtIostorinvOutM
createOutIos(disDaoList, mstDao);
}
/*
* 如果为返检出库或者改切出库删除对应的包装关系
*/
@@ -1370,6 +1371,8 @@ public class StIvtIostorinvOutServiceImpl extends ServiceImpl<StIvtIostorinvOutM
jsonTaskParam.put("isRePrintPackageBoxLabel", IOSEnum.IS_NOTANDYES.code(""));
//是否需要拆包重打子卷标签
jsonTaskParam.put("isUnPackBox", IOSEnum.IS_NOTANDYES.code(""));
} else if(mst.getBill_type().equals(IOSEnum.OUT_TYPE.code("盘点出库"))){
jsonTaskParam.put("type", IOSEnum.LMSTOACS_TYPE.code("盘点出库"));
}
request_param.put("bill_type", mst.getBill_type());
request_param.put("containerType", boxDao.getVehicle_type());

View File

@@ -220,34 +220,72 @@ public class InBoxManageServiceImpl implements InBoxManageService {
String boxType = "";
// 1. 获取三个条码
String up_box_no = whereJson.getString("up_box_no");
String middle_box_no = whereJson.getString("middle_box_no");
String down_box_no = whereJson.getString("down_box_no");
// ========== 规则1下条码不能为空 ==========
if (StringUtils.isBlank(down_box_no)) {
throw new BadRequestException("下条码不能为空");
}
if (down_box_no.equals(up_box_no)) {
throw new BadRequestException("木箱号有相同,请重新扫码!");
}
// ========== 规则2中条码不为空 → 上条码必须不为空;中为空 → 上必须为空 ==========
boolean middleNotBlank = StringUtils.isNotBlank(middle_box_no);
boolean upNotBlank = StringUtils.isNotBlank(up_box_no);
List<String> split ;
if(StringUtils.isNotBlank(up_box_no)) {
split = Arrays.asList(down_box_no, up_box_no);
if (middleNotBlank) {
// 有中条码,上条码必填
if (!upNotBlank) {
throw new BadRequestException("录入中条码时,上条码不能为空");
}
} else {
split = Collections.singletonList(down_box_no);
}
//查询仓库是否存在相同木箱
for (String boxSn : split) {
JSONArray stIvtStructattr = WQLObject.getWQLObject("st_ivt_structattr").query("storagevehicle_code = '" + boxSn + "'").getResultJSONArray(0);
if (stIvtStructattr != null && stIvtStructattr.size() > 0) {
throw new BadRequestException("当前木箱已经存在库中" + stIvtStructattr.getJSONObject(0).getString("struct_code"));
// 中条码为空,上条码必须也为空
if (upNotBlank) {
throw new BadRequestException("未录入中条码,不允许填写上条码");
}
}
// ========== 规则3存在重复木箱号校验只校验非空条码之间 ==========
List<String> tempAll = Arrays.asList(up_box_no, middle_box_no, down_box_no);
// 过滤空值后判断是否存在重复
List<String> noBlankList = new ArrayList<>();
for (String code : tempAll) {
if (StringUtils.isNotBlank(code)) {
noBlankList.add(code);
}
}
// 去重后长度和原长度不一致 = 有重复
long distinctCount = noBlankList.stream().distinct().count();
if (distinctCount != noBlankList.size()) {
throw new BadRequestException("木箱号有相同,请重新扫码!");
}
// ========== 最终组装List顺序【上、中、下】自动剔除空字符串 ==========
List<String> split = new ArrayList<>();
if (StringUtils.isNotBlank(up_box_no)) {
split.add(up_box_no);
}
if (StringUtils.isNotBlank(middle_box_no)) {
split.add(middle_box_no);
}
if (StringUtils.isNotBlank(down_box_no)) {
split.add(down_box_no);
}
//查询仓库是否存在相同木箱
// for (String boxSn : split) {
// JSONArray stIvtStructattr = WQLObject.getWQLObject("st_ivt_structattr").query("storagevehicle_code = '" + boxSn + "'").getResultJSONArray(0);
// if (stIvtStructattr != null && stIvtStructattr.size() > 0) {
// throw new BadRequestException("当前木箱已经存在库中" + stIvtStructattr.getJSONObject(0).getString("struct_code"));
// }
// }
for (int i = 0; i < split.size(); i++) {
String boxNO = split.get(i);
if(StringUtils.isBlank(boxNO)){
continue;
}
JSONObject jo = new JSONObject();
jo.put("box_no", boxNO);
//调用MES接口插入或更新木箱信息
@@ -259,6 +297,9 @@ public class InBoxManageServiceImpl implements InBoxManageService {
for (int i = 0; i < split.size(); i++) {
String boxNo = split.get(i);
if(StringUtils.isBlank(boxNo)){
continue;
}
BstIvtBoxinfo boxinfo = iBstIvtBoxinfoService.getOne(
new QueryWrapper<BstIvtBoxinfo>().lambda()
.eq(BstIvtBoxinfo::getBox_no, boxNo));
@@ -278,6 +319,8 @@ public class InBoxManageServiceImpl implements InBoxManageService {
}
//如果小木箱入库时没有小托盘时候是否考虑叫大托盘
// 查询木箱信息
TwoInBoxTrussTask taskBean = SpringContextHolder.getBean(TwoInBoxTrussTask.class);
BstIvtBoxinfo boxDao = iBstIvtBoxinfoService.getOne(
new QueryWrapper<BstIvtBoxinfo>().lambda()
.eq(BstIvtBoxinfo::getBox_no, split.get(0))
@@ -286,6 +329,7 @@ public class InBoxManageServiceImpl implements InBoxManageService {
throw new BadRequestException("木箱不存在!");
}
//查询当前入库拆叠盘位的托盘类型是否一致如果一致
String vehicle_type = boxDao.getVehicle_type();
@@ -296,40 +340,8 @@ public class InBoxManageServiceImpl implements InBoxManageService {
JSONArray device_ja = new JSONArray();
device_ja.add(device_jo);
// JSONObject device_data = wmsToAcsService.getPointStatus(device_ja);
// JSONObject data = device_data.getJSONArray("data").getJSONObject(0);
// AcsToWmsService acsToWmsService = SpringContextHolder.getBean(AcsToWmsService.class);
//如果此时拆叠盘位为空
// if (data.getIntValue("qty") == 0 && data.getIntValue("move") == 0) {
// //生成空托盘出库任务
// JSONObject apply_jo = new JSONObject();
// apply_jo.put("device_code", IOSEnum.VEHICLE_TYPE_POINT.code(vehicle_type));
// apply_jo.put("type", "3");
// apply_jo.put("container_type", vehicle_type);
// acsToWmsService.applyTwo(apply_jo);
// } else {
// if (!data.getString("container_type").equals(vehicle_type)) {
// // if (data.getString("container_type").equals("0")) {
// // throw new BadRequestException("当前电气反馈的托盘类型为0请检查");
// // }
// //给ACS下发拆叠盘位的空托盘入库信号并进行空托盘出库
// JSONArray action_rows = new JSONArray();
// JSONObject action_jo = new JSONObject();
// action_jo.put("device_code", IOSEnum.VEHICLE_TYPE_POINT.code(vehicle_type));
// action_jo.put("code", "to_command");
// action_jo.put("product_area", IOSEnum.PRODUCT_AREA.code("BLK"));
// action_jo.put("value", "4");
// action_rows.add(action_jo);
// wmsToAcsService.action(action_rows);
//
// //生成空托盘出库任务
// JSONObject apply_jo = new JSONObject();
// apply_jo.put("device_code", IOSEnum.VEHICLE_TYPE_POINT.code(vehicle_type));
// apply_jo.put("type", "3");
// apply_jo.put("container_type", vehicle_type);
// acsToWmsService.applyTwo(apply_jo);
// }
// }
String boxListString = split.stream().collect(Collectors.joining(","));
JSONObject taskParam = new JSONObject();
taskParam.put("task_type", "010713");
@@ -337,14 +349,14 @@ public class InBoxManageServiceImpl implements InBoxManageService {
//都强制到1005
taskParam.put("next_device_code", IOSEnum.VEHICLE_TYPE_SCAN_POINT.code("1"));
taskParam.put("vehicle_code", down_box_no);
taskParam.put("vehicle_code", boxListString);
JSONObject param = new JSONObject();
param.put("layer", split.size());
param.put("length", boxDao.getBox_length());
param.put("width", boxDao.getBox_width());
param.put("height", boxDao.getBox_high());
param.put("containerType", boxDao.getVehicle_type());
param.put("barcode",down_box_no + "-9");
param.put("barcode", boxListString);
//新增逻辑 需要确认
param.put("type", "1");
//根据木箱高度,判断入库仓位的高度
@@ -361,8 +373,8 @@ public class InBoxManageServiceImpl implements InBoxManageService {
}
param.put("heightLevel", height);
taskParam.put("request_param", param.toString());
TwoInBoxTrussTask taskBean = SpringContextHolder.getBean(TwoInBoxTrussTask.class);
taskBean.createTask(taskParam);
taskBean.immediateNotifyAcs(null);
}

View File

@@ -84,7 +84,8 @@ public class InVehicleManageServiceImpl implements InVehicleManageService {
jsonParam.put("sect_id", RegionTypeEnum.TWO_BZC01.getId());
jsonParam.put("vehicle_type", whereJson.getString("vehicle_type"));
if("2".equals(whereJson.getString("vehicle_type"))) {
jsonParam.put("move_block_num","3");
//todo 默认需要调整,根据当前的出库任务确认如果是2楼入库则需要判断出库任务如果出库任务
//jsonParam.put("move_block_num","3");
} else {
jsonParam.put("move_block_num","4");
}

View File

@@ -1322,8 +1322,8 @@ public class AcsToWmsServiceImpl implements AcsToWmsService {
whereJson.put("bill_type", IOSEnum.IN_TYPE.code("生产入库"));
whereJson.put("material_barcode",containers);
if(whereJson.getString("vehicle_code").startsWith("YNX")) {
//todo 默认需要调整
whereJson.put("move_block_num", "1");
//todo 默认需要调整,根据当前的出库任务确认如果是2楼入库则需要判断出库任务如果出库任务
//whereJson.put("move_block_num", "1");
} else if(whereJson.getString("vehicle_code").startsWith("YNY")) {
whereJson.put("move_block_num", "4");
}
@@ -1457,6 +1457,7 @@ public class AcsToWmsServiceImpl implements AcsToWmsService {
mdPdStoragevehicleextInsert.setPcsn(whereJson.getString("box_no"));
mdPdStoragevehicleextInsert.setDevice_uuid(org.nl.common.utils.IdUtil.getLongId());
mdPdStoragevehicleextInsert.setUpdate_time(DateUtil.now());
mdPdStoragevehicleextInsert.setQty("1");
mdPdStoragevehicleextMapper.insert(mdPdStoragevehicleextInsert);
} else {
@@ -1467,6 +1468,10 @@ public class AcsToWmsServiceImpl implements AcsToWmsService {
throw new BadRequestException("当前托盘" + whereJson.getString("vehicle_code") + "已经绑定木箱" + pcsn);
}
}
if(StringUtils.isBlank(mdPdStoragevehicleext.getQty())){
mdPdStoragevehicleext.setQty("1");
}
mdPdStoragevehicleext.setPcsn(whereJson.getString("box_no"));
mdPdStoragevehicleext.setDevice_uuid(org.nl.common.utils.IdUtil.getLongId());
mdPdStoragevehicleext.setUpdate_time(DateUtil.now());
@@ -1474,7 +1479,8 @@ public class AcsToWmsServiceImpl implements AcsToWmsService {
}
//优先巷道
if(whereJson.getString("vehicle_code").startsWith("YNX")) {
whereJson.put("move_block_num", "1");
//todo 默认需要调整,根据当前的出库任务确认如果是2楼入库则需要判断出库任务如果出库任务
//whereJson.put("move_block_num", "1");
} else if(whereJson.getString("vehicle_code").startsWith("YNY")) {
whereJson.put("move_block_num", "4");
}
@@ -1484,12 +1490,12 @@ public class AcsToWmsServiceImpl implements AcsToWmsService {
} else if (type.equals(IOSEnum.ACSTOLMS_TYPE.code("木箱装箱开盒盖位"))) {
//校验
String next_device_code;
if (StringUtils.isNotBlank(whereJson.getString("material_barcode")) && whereJson.getString("material_barcode").contains("-")) {
// if (StringUtils.isNotBlank(whereJson.getString("material_barcode")) && whereJson.getString("material_barcode").contains("-")) {
next_device_code = IOSEnum.POINT_CODE.code("空木箱上二楼终点");
whereJson.put("material_barcode", whereJson.getString("material_barcode").split("-")[0]);
} else {
next_device_code = IOSEnum.POINT_CODE.code("木箱装箱开盒盖位");
}
// } else {
// next_device_code = IOSEnum.POINT_CODE.code("木箱装箱开盒盖位");
// }
BstIvtBoxinfo boxDao = iBstIvtBoxinfoService.getOne(
new QueryWrapper<BstIvtBoxinfo>().lambda()
@@ -1521,6 +1527,7 @@ public class AcsToWmsServiceImpl implements AcsToWmsService {
mdPdStoragevehicleextInsert.setPcsn(boxDao.getBox_no());
mdPdStoragevehicleextInsert.setDevice_uuid(org.nl.common.utils.IdUtil.getLongId());
mdPdStoragevehicleextInsert.setUpdate_time(DateUtil.now());
mdPdStoragevehicleextInsert.setQty("1");
mdPdStoragevehicleextMapper.insert(mdPdStoragevehicleextInsert);
} else {
@@ -1531,6 +1538,10 @@ public class AcsToWmsServiceImpl implements AcsToWmsService {
throw new BadRequestException("当前托盘" + whereJson.getString("vehicle_code") + "已经绑定木箱" + pcsn);
}
}
if(StringUtils.isBlank(mdPdStoragevehicleext.getQty())){
mdPdStoragevehicleext.setQty("1");
}
mdPdStoragevehicleext.setPcsn(boxDao.getBox_no());
mdPdStoragevehicleext.setDevice_uuid(org.nl.common.utils.IdUtil.getLongId());
mdPdStoragevehicleext.setUpdate_time(DateUtil.now());

View File

@@ -1,14 +1,28 @@
package org.nl.wms.sch.manage;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.ObjectUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
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.sch.tasks.TwoOutHeapTask;
import org.nl.common.utils.CollectionUtils;
import org.nl.modules.wql.util.SpringContextHolder;
import org.nl.system.service.param.impl.SysParamServiceImpl;
import org.nl.wms.sch.AcsTaskDto;
import org.nl.wms.sch.AcsUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
/**
* Title: AbstractAcsTask.java Description:任务抽象类
@@ -23,6 +37,19 @@ public abstract class AbstractAcsTask {
@Autowired
AcsUtil acsUtil;
private SchBaseTaskMapper schBaseTaskMapper;
@Autowired
private ApplicationContext applicationContext;
public SchBaseTaskMapper getSchBaseTaskMapper() {
if (schBaseTaskMapper == null) {
schBaseTaskMapper = applicationContext.getBean(SchBaseTaskMapper.class);
}
return schBaseTaskMapper;
}
/**
* @discription 在如果任务无法形成会一直定时刷新判断
* @author ldjun
@@ -111,13 +138,63 @@ public abstract class AbstractAcsTask {
/**
*
*/
public JSONObject immediateNotifyAcs(String task_id) {
List<AcsTaskDto> singleTaskList = this.schedule();
return immediateNotifyAcsList(singleTaskList);
}
public JSONObject immediateNotifyAcsList(List<AcsTaskDto> taskList) {
try {
Thread.sleep(1000);
} catch (Exception ex) {
}
List<AcsTaskDto> taskList = this.schedule();
//查询正在执行中的任务
List<String> status = Stream.of("05","06")
.collect(Collectors.toList());
List<SchBaseTask> workingTaskList = SpringContextHolder.getBean(SchBaseTaskMapper.class).selectList(new LambdaQueryWrapper<SchBaseTask>()
.in(SchBaseTask::getTask_status, status).eq(SchBaseTask::getIs_delete, "0"));
List<String> oneFloorReturnBigVehicleInTaskStartPoint = Arrays.asList("KMXRKW1","KMXRKW2","KMXRKW3","KMXRKW4","RK1012","RK1005","RK1010","RK1003");
List<String> oneFloorReturnSmallVehicleInTaskStartPoint = Arrays.asList("KMXRKW1","KMXRKW2","KMXRKW3","KMXRKW4","RK1005","RK1003");
List<String> oneFloorReturnBigVehicleOutTaskStartPoint = Arrays.asList("KMXRKW1","RK1010");
List<String> oneFloorReturnSmallVehicleOutTaskStartPoint = Arrays.asList("KMXRKW1","RK1003");
//查询正在执行中的1楼大托盘入库任务
List<SchBaseTask> inBigTaskList = workingTaskList.stream()
.filter(task->oneFloorReturnBigVehicleInTaskStartPoint.contains(task.getPoint_code1())
&& !task.getPoint_code2().contains("KMXRKW")).collect(Collectors.toList());
List<SchBaseTask> inSmallTaskList = workingTaskList.stream()
.filter(task->oneFloorReturnSmallVehicleInTaskStartPoint.contains(task.getPoint_code1())
&& !task.getPoint_code2().contains("KMXRKW")).collect(Collectors.toList());
List<SchBaseTask> outBigTaskList = workingTaskList.stream().filter(task->oneFloorReturnBigVehicleOutTaskStartPoint.contains(task.getPoint_code2())).collect(Collectors.toList());
List<SchBaseTask> outSmallTaskList = workingTaskList.stream().filter(task->oneFloorReturnSmallVehicleOutTaskStartPoint.contains(task.getPoint_code2())).collect(Collectors.toList());
Iterator<AcsTaskDto> it = taskList.iterator();
while (it.hasNext()) {
AcsTaskDto acsTaskDto = it.next();
if(CollectionUtil.isNotEmpty(inBigTaskList) && oneFloorReturnBigVehicleOutTaskStartPoint.contains(acsTaskDto.getNext_device_code())){
it.remove(); //
}
else if(CollectionUtil.isNotEmpty(inSmallTaskList)&& oneFloorReturnSmallVehicleOutTaskStartPoint.contains(acsTaskDto.getNext_device_code())){
it.remove(); //
}
else if(CollectionUtil.isNotEmpty(outBigTaskList)&& oneFloorReturnBigVehicleInTaskStartPoint.contains(acsTaskDto.getStart_device_code())){
it.remove();
}
else if(CollectionUtil.isNotEmpty(outSmallTaskList)&& oneFloorReturnSmallVehicleInTaskStartPoint.contains(acsTaskDto.getStart_device_code())){
it.remove();
}
}
if (ObjectUtil.isNotEmpty(taskList)) {
JSONArray arr = JSONArray.parseArray(JSON.toJSONString(taskList));
if (acsUtil == null) {