add:手持空托盘堆叠

This commit is contained in:
2025-12-30 14:26:08 +08:00
parent 39473900c2
commit 99e959ce52
7 changed files with 141 additions and 58 deletions

View File

@@ -50,6 +50,18 @@ public class PdaCommonController {
public ResponseEntity<Object> inEmptyVehicle(@RequestBody JSONObject whereJson) {
return new ResponseEntity<>(pdaCommonService.inEmptyVehicle(whereJson), HttpStatus.OK);
}
@PostMapping("/queryPointDtl")
@Log("空载具堆叠-查询点位堆叠明细")
@SaIgnore
public ResponseEntity<Object> queryPointDtl() {
return new ResponseEntity<>(pdaCommonService.queryPointDtl(), HttpStatus.OK);
}
@PostMapping("/callStackPlates")
@Log("空载具堆叠-呼叫堆叠")
@SaIgnore
public ResponseEntity<Object> callStackPlates(@RequestBody JSONObject whereJson) {
return new ResponseEntity<>(pdaCommonService.callStackPlates(whereJson), HttpStatus.OK);
}
@PostMapping("/confirmBagAssembly")
@Log("物料组袋-确认组袋")
@SaIgnore

View File

@@ -44,4 +44,20 @@ public interface PdaCommonService {
PdaResponse inEmptyVehicle(JSONObject param);
PdaResponse confirmBucketAssembly(AssemblyBucketParam param);
/**
* 空载具堆叠-查询点位堆叠明细
* @return PdaResponse
*/
PdaResponse queryPointDtl();
/**
* 空载具堆叠-呼叫堆叠
* @param whereJson {
* point_code: 载具点位
* row: {明细}
* }
* @return PdaResponse
*/
PdaResponse callStackPlates(JSONObject whereJson);
}

View File

@@ -2,9 +2,11 @@ package org.nl.wms.pda.general_management.service.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.NumberUtil;
import cn.hutool.core.util.ObjectUtil;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
@@ -25,9 +27,14 @@ import org.nl.wms.pda.general_management.service.dto.AssemblyBagParam;
import org.nl.wms.pda.general_management.service.dto.AssemblyBucketParam;
import org.nl.wms.pda.general_management.service.dto.AssemblyPalletParam;
import org.nl.wms.pda.util.PdaResponse;
import org.nl.wms.sch_manage.enums.TaskStatus;
import org.nl.wms.sch_manage.service.ISchBasePointService;
import org.nl.wms.sch_manage.service.ISchBaseTaskService;
import org.nl.wms.sch_manage.service.dao.SchBasePoint;
import org.nl.wms.sch_manage.service.dao.SchBaseTask;
import org.nl.wms.sch_manage.service.util.tasks.EmpStackPlatesTask;
import org.nl.wms.sch_manage.service.util.tasks.EmpVehicleOutTask;
import org.nl.wms.warehouse_management.enums.IOSConstant;
import org.nl.wms.warehouse_management.enums.IOSEnum;
import org.nl.wms.warehouse_management.service.IMdPbGroupplateService;
import org.nl.wms.warehouse_management.service.VehicleInService;
@@ -36,10 +43,13 @@ import org.nl.wms.warehouse_management.service.dao.GroupPlate;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
/**
* @Author: lyd
@@ -72,6 +82,19 @@ public class PdaCommonServiceImpl implements PdaCommonService {
private IMdPbStoragevehicleinfoService storagevehicleinfoService;
@Resource
private IMdPdGroupbucketService groupbucketService;
/**
* 点位服务类
*/
@Resource
private ISchBasePointService iSchBasePointService;
/**
* 空托盘叠盘任务类
*/
@Resource
private EmpStackPlatesTask empStackPlatesTask;
@SneakyThrows
@Override
public PdaResponse callEmptyVehicle(JSONObject param) {
@@ -198,4 +221,65 @@ public class PdaCommonServiceImpl implements PdaCommonService {
groupbucketService.save(groupbucket);
return PdaResponse.requestOk();
}
@Override
public PdaResponse queryPointDtl() {
List<SchBasePoint> pointDaoList = iSchBasePointService.list(
new QueryWrapper<SchBasePoint>().lambda()
.eq(SchBasePoint::getRegion_code, IOSEnum.REGION_CODE.code("空托盘堆叠区域"))
.eq(SchBasePoint::getIs_used, IOSConstant.ONE)
);
List<String> pointCodeList = pointDaoList.stream()
.map(SchBasePoint::getPoint_code)
.collect(Collectors.toList());
// 查询当前正在执行的任务
List<SchBaseTask> taskList = taskService.list(
new QueryWrapper<SchBaseTask>().lambda()
.lt(SchBaseTask::getTask_status, TaskStatus.FINISHED.getCode())
.eq(SchBaseTask::getIs_delete, IOSConstant.ZERO)
.eq(SchBaseTask::getConfig_code, EmpStackPlatesTask.class.getSimpleName())
.in(SchBaseTask::getPoint_code2, pointCodeList)
);
// 需返回的集合
List<JSONObject> resultList = new ArrayList<>();
for (SchBasePoint pointDao : pointDaoList) {
JSONObject json = new JSONObject();
json.put("point_code", pointDao.getPoint_code());
json.put("vehicle_qty", pointDao.getVehicle_qty());
// 查询待堆叠数量
List<SchBaseTask> collectQtyList = taskList.stream()
.filter(row -> row.getPoint_code2().equals(pointDao.getPoint_code()))
.collect(Collectors.toList());
json.put("execution_task", ObjectUtil.isNotEmpty(collectQtyList) ? collectQtyList.size() : 0);
// 计算剩余可堆叠数量
json.put("remaining_qty", NumberUtil.sub(pointDao.getVehicle_max_qty(), pointDao.getVehicle_qty(),json.getIntValue("execution_task")));
resultList.add(json);
}
return PdaResponse.requestParamOk(resultList);
}
@Override
@Transactional
public PdaResponse callStackPlates(JSONObject whereJson) {
// 判断起点点位是否存在
SchBasePoint startPointDao = iSchBasePointService.getById(whereJson.getString("point_code"));
if (ObjectUtil.isEmpty(startPointDao)) {
throw new BadRequestException("当前点位不存在【"+whereJson.getString("point_code")+"");
}
// 计算叠盘位是否还能继续叠盘
JSONObject row = whereJson.getJSONObject("row");
if (row.getIntValue("remaining_qty") == 0) {
throw new BadRequestException("当前堆叠位空托盘数量已满【"+row.getString("point_code")+"");
}
// 生成任务
JSONObject jsonTask = new JSONObject();
jsonTask.put("point_code1", whereJson.getString("point_code"));
jsonTask.put("point_code2", row.getString("point_code"));
empStackPlatesTask.create(jsonTask);
return PdaResponse.requestOk();
}
}

View File

@@ -180,7 +180,9 @@ public class PdaPackagingServiceImpl implements PdaPackagingService {
// 创建agv任务
JSONObject jsonTask = new JSONObject();
jsonTask.put("point_code1", whereJson.getString("point_code"));
jsonTask.put("point_code2", IOSConstant.AGVZJZ001);
// 判断点位是否需要二次配送
SchBasePoint endPoint = iSchBasePointService.getById(whereJson.getString("in_point_code"));
jsonTask.put("point_code2", endPoint.getIs_auto() ? whereJson.getString("in_point_code") : IOSConstant.AGVZJZ001);
jsonTask.put("point_code3", whereJson.getString("in_point_code"));
jsonTask.put("material_id", rows.get(0).getString("material_id"));
jsonTask.put("material_qty", whereJson.getString("total_qty"));
@@ -239,11 +241,11 @@ public class PdaPackagingServiceImpl implements PdaPackagingService {
public PdaResponse packConfirmReturn(JSONObject whereJson) {
SchBasePoint pointDao = iSchBasePointService.getById(whereJson.getString("point_code"));
if (ObjectUtil.isEmpty(pointDao)) {
throw new BadRequestException("当前点位不存在【"+whereJson.getString("point_code")+"");
throw new BadRequestException("当前点位不存在【" + whereJson.getString("point_code") + "");
}
// 判断点位区域是否是外包材区域
if (!pointDao.getRegion_code().equals(IOSEnum.REGION_CODE.code("外包材区域"))) {
throw new BadRequestException("当前点位不属于还回区域点位【"+whereJson.getString("point_code")+"");
throw new BadRequestException("当前点位不属于还回区域点位【" + whereJson.getString("point_code") + "");
}
// 查询当前点位是否有库存
List<MdPdmPackaging> packDaoList = iMdPdmPackagingService.list(

View File

@@ -1,20 +1,20 @@
package org.nl.wms.sch_manage.service.util.tasks;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.NumberUtil;
import cn.hutool.core.util.ObjectUtil;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import org.nl.common.exception.BadRequestException;
import org.nl.common.utils.CodeUtil;
import org.nl.common.utils.SecurityUtils;
import org.nl.config.IdUtil;
import org.nl.wms.basedata_manage.enums.BaseDataEnum;
import org.nl.wms.pdm_management.service.IMdPdmPackagingService;
import org.nl.wms.pdm_management.service.dao.MdPdmPackaging;
import org.nl.wms.sch_manage.enums.TaskEnum;
import org.nl.wms.sch_manage.enums.TaskStatus;
import org.nl.wms.sch_manage.service.ISchBasePointService;
import org.nl.wms.sch_manage.service.ISchBaseTaskService;
import org.nl.wms.sch_manage.service.dao.SchBasePoint;
import org.nl.wms.sch_manage.service.dao.SchBaseTask;
import org.nl.wms.sch_manage.service.util.AbstractTask;
import org.nl.wms.sch_manage.service.util.AcsTaskDto;
@@ -28,24 +28,24 @@ import javax.annotation.Resource;
/**
* <p>
* 内包材送入任务类(中间站至外包材点位)
* 空托盘叠盘任务类
* </p>
*
* @author Liuxy
* @since 2025-12-29
* @since 2025-12-30
*/
@Component(value = "PackagingInTask")
@TaskType("PackagingInTask")
public class PackagingInTask extends AbstractTask {
@Component(value = "EmpStackPlatesTask")
@TaskType("EmpStackPlatesTask")
public class EmpStackPlatesTask extends AbstractTask {
@Autowired
private ISchBaseTaskService taskService;
/**
* 外包材服务
* 点位服务
*/
@Resource
private IMdPdmPackagingService iMdPdmPackagingService;
private ISchBasePointService iSchBasePointService;
@Override
public String create(JSONObject json) {
@@ -53,15 +53,14 @@ public class PackagingInTask extends AbstractTask {
task.setTask_id(IdUtil.getStringId());
task.setTask_code(CodeUtil.getNewCode("TASK_CODE"));
task.setTask_status(TaskStatus.CREATE.getCode());
task.setConfig_code(PackagingInTask.class.getSimpleName());
task.setConfig_code(EmpStackPlatesTask.class.getSimpleName());
task.setPoint_code1(json.getString("point_code1"));
task.setPoint_code2(json.getString("point_code2"));
task.setPoint_code3(json.getString("point_code3"));
task.setVehicle_code(json.getString("vehicle_code"));
task.setMaterial_id(json.getString("material_id"));
task.setMaterial_qty(json.getBigDecimal("material_qty"));
task.setRequest_param(json.toString());
task.setTask_type(TaskEnum.TASK_TYPE.code("料箱"));
task.setTask_type(TaskEnum.TASK_TYPE.code("载具"));
task.setPriority(json.getString("Priority"));
task.setCreate_id(SecurityUtils.getCurrentUserId());
task.setCreate_name(SecurityUtils.getCurrentNickName());
@@ -147,12 +146,10 @@ public class PackagingInTask extends AbstractTask {
taskObj.setTask_status(TaskStatus.FINISHED.getCode());
taskObj.setRemark("已完成");
taskService.updateById(taskObj);
// 更新点位库存
iMdPdmPackagingService.update(
new UpdateWrapper<MdPdmPackaging>().lambda()
.set(MdPdmPackaging::getPoint_code, taskObj.getPoint_code2())
.eq(MdPdmPackaging::getPoint_code, taskObj.getPoint_code3())
);
// 更新当前点位载具数量
SchBasePoint pointDao = iSchBasePointService.getById(taskObj.getPoint_code2());
pointDao.setVehicle_qty(NumberUtil.add(pointDao.getVehicle_qty(), Integer.valueOf(1)).intValue());
iSchBasePointService.updateById(pointDao);
}
@Transactional(rollbackFor = Exception.class)

View File

@@ -14,9 +14,7 @@ import org.nl.wms.pdm_management.service.IMdPdmPackagingService;
import org.nl.wms.pdm_management.service.dao.MdPdmPackaging;
import org.nl.wms.sch_manage.enums.TaskEnum;
import org.nl.wms.sch_manage.enums.TaskStatus;
import org.nl.wms.sch_manage.service.ISchBasePointService;
import org.nl.wms.sch_manage.service.ISchBaseTaskService;
import org.nl.wms.sch_manage.service.dao.SchBasePoint;
import org.nl.wms.sch_manage.service.dao.SchBaseTask;
import org.nl.wms.sch_manage.service.util.AbstractTask;
import org.nl.wms.sch_manage.service.util.AcsTaskDto;
@@ -30,7 +28,7 @@ import javax.annotation.Resource;
/**
* <p>
* 内包材送入中间站任务类
* 内包材送入任务类
* </p>
*
* @author Liuxy
@@ -43,24 +41,12 @@ public class PackagingMiddleTask extends AbstractTask {
@Autowired
private ISchBaseTaskService taskService;
/**
* 点位服务
*/
@Autowired
private ISchBasePointService iSchBasePointService;
/**
* 外包材服务类
*/
@Resource
private IMdPdmPackagingService iMdPdmPackagingService;
/**
* 内包材送入任务类
*/
@Resource
private PackagingInTask packagingInTask;
@Override
public String create(JSONObject json) {
SchBaseTask task = new SchBaseTask();
@@ -161,26 +147,12 @@ public class PackagingMiddleTask extends AbstractTask {
taskObj.setTask_status(TaskStatus.FINISHED.getCode());
taskObj.setRemark("已完成");
taskService.updateById(taskObj);
// 判断第三个点位是否是agv搬运任务
SchBasePoint pointDao = iSchBasePointService.getById(taskObj.getPoint_code3());
if (pointDao.getIs_auto()) {
// 生成中间站至内包材点位agv任务
JSONObject jsonTask = new JSONObject();
jsonTask.put("point_code1", taskObj.getPoint_code2());
jsonTask.put("point_code2", taskObj.getPoint_code3());
jsonTask.put("point_code3", taskObj.getPoint_code1());
jsonTask.put("vehicle_code", taskObj.getVehicle_code());
jsonTask.put("material_id", taskObj.getMaterial_qty());
packagingInTask.create(jsonTask);
} else {
// 直接更新点位库存
iMdPdmPackagingService.update(
new UpdateWrapper<MdPdmPackaging>().lambda()
.set(MdPdmPackaging::getPoint_code, taskObj.getPoint_code3())
.eq(MdPdmPackaging::getPoint_code, taskObj.getPoint_code1())
);
}
// 跟更新库存点位
iMdPdmPackagingService.update(
new UpdateWrapper<MdPdmPackaging>().lambda()
.set(MdPdmPackaging::getPoint_code, taskObj.getPoint_code3())
.eq(MdPdmPackaging::getPoint_code, taskObj.getPoint_code1())
);
}
@Transactional(rollbackFor = Exception.class)

View File

@@ -119,7 +119,7 @@ public enum IOSEnum {
// 区域编码
REGION_CODE(MapOf.of("出入库区域", "INOUR01", "AGV对接区", "AGVDJ01", "临时储存区", "LSCC01"
, "外包材区域", "WBCZC01"
, "外包材区域", "WBCZC01", "空托盘堆叠区域", "EMPDD01"
)),
;