feat: 加工下料

This commit is contained in:
2025-12-02 16:02:23 +08:00
parent 96a4a34b18
commit 0a5fe359b2
11 changed files with 289 additions and 5 deletions

View File

@@ -16,6 +16,7 @@
package org.nl.common.utils;
import cn.hutool.core.util.ObjectUtil;
import com.alibaba.fastjson.JSONObject;
import org.hibernate.validator.internal.constraintvalidators.hv.EmailValidator;
import org.nl.common.exception.BadRequestException;
import org.nl.config.language.LangProcess;
@@ -42,4 +43,19 @@ public class ValidationUtil{
public static boolean isEmail(String email) {
return new EmailValidator().isValid(email, null);
}
/**
* 入参校验
*/
public static void assertNotBlankJson(JSONObject json, String message, String... keys) {
if (json == null) {
throw new IllegalArgumentException(message);
}
for (String key : keys) {
String value = json.getString(key);
if (value == null || value.trim().isEmpty()) {
throw new IllegalArgumentException(message);
}
}
}
}

View File

@@ -60,6 +60,12 @@ public class PdaProductionController {
public ResponseEntity<Object> takeTheVehicle(@RequestBody JSONObject whereJson) {
return new ResponseEntity<>(pdaProductionService.takeTheVehicle(whereJson), HttpStatus.OK);
}
@PostMapping("/takeFinish")
@Log("点位取货-取货完成")
@SaIgnore
public ResponseEntity<Object> takeFinish(@RequestBody JSONObject whereJson) {
return new ResponseEntity<>(pdaProductionService.takeFinish(whereJson), HttpStatus.OK);
}
@PostMapping("/getGroupInfo")
@Log("剩料回库-获取物料信息")
@@ -74,4 +80,10 @@ public class PdaProductionController {
public ResponseEntity<Object> leftoverMaterialBack(@RequestBody JSONObject whereJson) {
return new ResponseEntity<>(pdaProductionService.leftoverMaterialBack(whereJson), HttpStatus.OK);
}
@PostMapping("/preProcessingDown")
@Log("预加工下料-下料")
@SaIgnore
public ResponseEntity<Object> preProcessingDown(@RequestBody JSONObject whereJson) {
return new ResponseEntity<>(pdaProductionService.preProcessingDown(whereJson), HttpStatus.OK);
}
}

View File

@@ -51,4 +51,18 @@ public interface PdaProductionService {
* @return
*/
PdaResponse leftoverMaterialBack(JSONObject param);
/**
* 预加工下料
* @param param
* @return
*/
PdaResponse preProcessingDown(JSONObject param);
/**
* 取货完成
* @param param
* @return
*/
PdaResponse takeFinish(JSONObject param);
}

View File

@@ -1,16 +1,13 @@
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.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 com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import lombok.extern.slf4j.Slf4j;
import org.nl.common.exception.BadRequestException;
import org.nl.common.utils.IdUtil;
import org.nl.common.utils.SecurityUtils;
import org.nl.wms.basedata_manage.service.IMdPbStoragevehicleextService;
import org.nl.wms.basedata_manage.service.IMdPbStoragevehicleinfoService;
@@ -22,7 +19,10 @@ import org.nl.wms.pda.general_management.service.PdaPreTreatmentService;
import org.nl.wms.pda.general_management.service.PdaProductionService;
import org.nl.wms.pda.util.PdaResponse;
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.PreProcessingInTask;
import org.nl.wms.warehouse_management.enums.IOSEnum;
import org.nl.wms.warehouse_management.service.IMdPbGroupplateService;
import org.nl.wms.warehouse_management.service.IOutBillService;
@@ -38,6 +38,8 @@ import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import static org.nl.common.utils.ValidationUtil.*;
/**
* @Author: lyd
* @Date: 2025/12/1
@@ -65,6 +67,10 @@ public class PdaProductionServiceImpl implements PdaProductionService {
private VehicleInService vehicleInService;
@Resource
private IRawAssistIStorService rawAssistIStorService;
@Resource
private PreProcessingInTask preProcessingInTask;
@Resource
private ISchBaseTaskService taskService;
@Override
public PdaResponse getGroupInfo(JSONObject param) {
// search;
@@ -253,4 +259,35 @@ public class PdaProductionServiceImpl implements PdaProductionService {
}
return PdaResponse.requestOk();
}
@Override
public PdaResponse preProcessingDown(JSONObject param) {
log.info("加工下料:{}", param);
// vehicle_code、 point_code, region_code, 。。。rows
assertNotBlankJson(param, "请求参数不能为空!", "vehicle_code", "point_code", "sect_code");
String pointCode = param.getString("point_code");
SchBasePoint startPoint = pointService.getByPointCode(pointCode, false);
if (ObjectUtil.isEmpty(startPoint)) {
throw new BadRequestException("当前点位不存在,请检查是否正确!");
}
// 判断任务是否创建
List<SchBaseTask> tasks = taskService.getTaskByQuery(new LambdaQueryWrapper<SchBaseTask>()
.eq(SchBaseTask::getPoint_code1, pointCode));
if (tasks.size() > 0) {
throw new BadRequestException("该点位已创建过任务!");
}
String vehicleCode = param.getString("vehicle_code");
List<JSONObject> res = groupplateService.getPalletViewByVehicleCode(vehicleCode);
if (res.size() == 0) {
throw new BadRequestException("当前托盘号不存在物料信息,请检查!");
}
preProcessingInTask.create(param);
return PdaResponse.requestOk();
}
@Override
public PdaResponse takeFinish(JSONObject param) {
// todo: 下发允许AGV通过
return null;
}
}

View File

@@ -132,4 +132,11 @@ public interface ISchBasePointService extends IService<SchBasePoint> {
* @return
*/
SchBasePoint getByPointCode(String pointCode, boolean flag);
/**
* 获取空位无任务的点位
* @param regionCode
* @return
*/
List<SchBasePoint> getCanUsePointByRegion(String regionCode);
}

View File

@@ -56,4 +56,6 @@ public interface SchBasePointMapper extends BaseMapper<SchBasePoint> {
* @return List<JSONObject>
*/
List<JSONObject> getPointDtl(@Param("param") JSONObject whereJson);
List<SchBasePoint> getCanUsePointByRegion(String regionCode);
}

View File

@@ -110,4 +110,12 @@
</where>
</select>
<select id="getCanUsePointByRegion" resultType="org.nl.wms.sch_manage.service.dao.SchBasePoint">
SELECT
*
FROM
`sch_base_point` p
WHERE p.region_code = #{region_code} AND p.is_used = TRUE
AND p.point_status = '1'
</select>
</mapper>

View File

@@ -317,4 +317,9 @@ public class SchBasePointServiceImpl extends ServiceImpl<SchBasePointMapper, Sch
.eq(flag, SchBasePoint::getIs_used, true);
return getOne(lam);
}
@Override
public List<SchBasePoint> getCanUsePointByRegion(String regionCode) {
return this.baseMapper.getCanUsePointByRegion(regionCode);
}
}

View File

@@ -71,7 +71,7 @@ public class CallMaterialTask extends AbstractTask {
task.setTask_id(IdUtil.getStringId());
task.setTask_code(json.getString("TaskCode"));
task.setTask_status(TaskStatus.CREATE.getCode());
task.setConfig_code(HandOutTask.class.getSimpleName());
task.setConfig_code(CallMaterialTask.class.getSimpleName());
task.setPoint_code1(json.getString("point_code1"));
task.setPoint_code2(json.getString("point_code2"));
task.setVehicle_code(json.getString("vehicle_code"));

View File

@@ -0,0 +1,183 @@
package org.nl.wms.sch_manage.service.util.tasks;
import cn.hutool.core.date.DateUtil;
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.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.ACSTaskTypeEnum;
import org.nl.wms.sch_manage.service.util.AbstractTask;
import org.nl.wms.sch_manage.service.util.AcsTaskDto;
import org.nl.wms.sch_manage.service.util.TaskType;
import org.nl.wms.warehouse_management.enums.IOSConstant;
import org.nl.wms.warehouse_management.enums.IOSEnum;
import org.nl.wms.warehouse_management.service.IRawAssistIStorService;
import org.nl.wms.warehouse_management.service.dao.IOStorInvDis;
import org.nl.wms.warehouse_management.service.dao.mapper.IOStorInvDisMapper;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.List;
/**
* 加工入库
* @Author: lyd
* @Date: 2025/12/2
*/
@Component(value = "PreProcessingInTask")
@TaskType("PreProcessingInTask")
public class PreProcessingInTask extends AbstractTask {
@Resource
private ISchBaseTaskService taskService;
@Resource
private ISchBasePointService pointService;
@Override
public String create(JSONObject json) {
// 获取终点
List<SchBasePoint> points = pointService.getCanUsePointByRegion(json.getString("region_code"));
if (ObjectUtil.isEmpty(points)) {
throw new BadRequestException("暂无可用点位!");
}
SchBasePoint point = points.get(0);
SchBaseTask task = new SchBaseTask();
task.setTask_id(IdUtil.getStringId());
task.setTask_code(CodeUtil.getNewCode("TASK_CODE"));
task.setTask_status(TaskStatus.CREATE.getCode());
task.setConfig_code(PreProcessingInTask.class.getSimpleName());
task.setPoint_code1(json.getString("point_code"));
task.setPoint_code2(point.getPoint_code());
task.setVehicle_code(json.getString("vehicle_code"));
task.setRequest_param(json.toString());
task.setTask_type(TaskEnum.TASK_TYPE.code("料箱"));
task.setPriority("1");
task.setIs_wait("0");
task.setCreate_id(SecurityUtils.getCurrentUserId());
task.setCreate_name(SecurityUtils.getCurrentNickName());
task.setCreate_time(DateUtil.now());
taskService.save(task);
// 下发任务
// this.sendTaskOne(task.getTask_id());
return task.getTask_id();
}
@Override
public AcsTaskDto sendAcsParam(String taskId) {
SchBaseTask taskDao = taskService.getById(taskId);
// 组织下发给acs的数据
AcsTaskDto acsTaskDto = new AcsTaskDto();
acsTaskDto.setExt_task_id(taskDao.getTask_id());
acsTaskDto.setTask_code(taskDao.getTask_code());
acsTaskDto.setStart_device_code(taskDao.getPoint_code1());
acsTaskDto.setNext_device_code(taskDao.getPoint_code2());
acsTaskDto.setVehicle_code(taskDao.getVehicle_code());
acsTaskDto.setVehicle_type(IOSConstant.ONE);
acsTaskDto.setIs_wait(IOSConstant.ZERO);
acsTaskDto.setTask_type(ACSTaskTypeEnum.CTU_TASK.getCode());
acsTaskDto.setPriority(IOSConstant.ONE);
acsTaskDto.setAgv_system_type(IOSConstant.THREE);
acsTaskDto.setIs_get_pause(IOSConstant.ZERO);
acsTaskDto.setIs_put_pause(IOSConstant.ZERO);
return acsTaskDto;
}
@Override
protected void updateStatus(String task_code, TaskStatus status) {
// 校验任务
SchBaseTask taskObj = taskService.getByCode(task_code);
if (taskObj.getTask_status().equals(TaskStatus.FINISHED.getCode())) {
throw new BadRequestException("该任务已完成!");
}
if (taskObj.getTask_status().equals(TaskStatus.CANCELED.getCode())) {
throw new BadRequestException("该任务已取消!");
}
// 根据传来的类型去对任务进行操作
if (status.equals(TaskStatus.EXECUTING)) {
taskObj.setTask_status(TaskStatus.EXECUTING.getCode());
taskObj.setRemark("执行中");
taskService.updateById(taskObj);
}
if (status.equals(TaskStatus.FINISHED)) {
this.finishTask(taskObj);
}
if (status.equals(TaskStatus.CANCELED)) {
this.cancelTask(taskObj);
}
}
private void cancelTask(SchBaseTask taskObj) {
// 取消任务
taskService.update(new LambdaUpdateWrapper<SchBaseTask>()
.set(SchBaseTask::getIs_delete, BaseDataEnum.IS_YES_NOT.code(""))
.set(SchBaseTask::getTask_status, TaskStatus.CANCELED.getCode())
.set(SchBaseTask::getRemark, "已取消")
.eq(SchBaseTask::getTask_id, taskObj.getTask_id())
);
}
private void finishTask(SchBaseTask taskObj) {
// 任务完成
taskObj.setTask_status(TaskStatus.FINISHED.getCode());
taskObj.setRemark("已完成");
taskService.updateById(taskObj);
// 更新起点
pointService.update(
new UpdateWrapper<SchBasePoint>().lambda()
.set(SchBasePoint::getVehicle_code, "")
.set(SchBasePoint::getPoint_status, IOSEnum.POINT_STATUS.code("空位"))
.eq(SchBasePoint::getPoint_code, taskObj.getPoint_code1())
.set(SchBasePoint::getIng_task_code, "")
);
// 更新起点
pointService.update(
new UpdateWrapper<SchBasePoint>().lambda()
.set(SchBasePoint::getVehicle_code, taskObj.getVehicle_code())
.set(SchBasePoint::getPoint_status, IOSEnum.POINT_STATUS.code("有箱有料"))
.eq(SchBasePoint::getPoint_code, taskObj.getPoint_code2())
.set(SchBasePoint::getIng_task_code, "")
);
}
@Override
public void forceFinish(String task_code) {
SchBaseTask taskObj = taskService.getByCode(task_code);
if (ObjectUtil.isEmpty(taskObj)) {
throw new BadRequestException("该任务不存在");
}
this.finishTask(taskObj);
}
@Override
public void cancel(String task_code) {
SchBaseTask taskObj = taskService.getByCode(task_code);
if (ObjectUtil.isEmpty(taskObj)) {
throw new BadRequestException("该任务不存在");
}
if (!TaskStatus.CREATE.getCode().equals(taskObj.getTask_status())) {
throw new BadRequestException("任务状态必须为生成才能取消任务");
}
this.cancelTask(taskObj);
}
@Override
public void taskConfirm(String task_code) {
}
}

View File

@@ -52,7 +52,7 @@ public class RawInTask extends AbstractTask {
task.setTask_id(IdUtil.getStringId());
task.setTask_code(CodeUtil.getNewCode("TASK_CODE"));
task.setTask_status(TaskStatus.CREATED.getCode());
task.setConfig_code(HandInTask.class.getSimpleName());
task.setConfig_code(RawInTask.class.getSimpleName());
task.setPoint_code1(json.getString("point_code1"));
task.setPoint_code2(json.getString("point_code2"));
task.setVehicle_code(json.getString("vehicle_code"));