opt: 优化代码以及demo类

This commit is contained in:
2025-09-24 19:33:36 +08:00
parent df225f1645
commit e69f55c046
13 changed files with 238 additions and 74 deletions

View File

@@ -119,9 +119,13 @@ public class AcsToWmsServiceImpl implements AcsToWmsService {
if (ObjectUtil.isEmpty(taskInfo)) {
throw new BadRequestException("任务信息不能为空!");
}
SchBaseTask taskObj = taskService.getByCode(taskInfo.getString("task_code"));
String taskCode = taskInfo.getString("task_code");
if (ObjectUtil.isEmpty(taskCode)) {
throw new BadRequestException("任务编码不能为空");
}
SchBaseTask taskObj = taskService.getByCode(taskCode);
if (ObjectUtil.isEmpty(taskObj)) {
throw new BadRequestException("未找到任务编码为 [" + taskInfo.getString("task_code") + "] 的任务");
throw new BadRequestException("未找到任务编码为 [" + taskCode + "] 的任务");
}
// 任务处理类
String processingClass = taskObj.getConfig_code();
@@ -146,10 +150,10 @@ public class AcsToWmsServiceImpl implements AcsToWmsService {
AbstractTask abstractTask = taskFactory.getTask(processingClass);
// 更新任务
try {
abstractTask.updateTaskStatus(taskInfo, status);
abstractTask.updateTaskStatus(taskCode, status);
} catch (Exception e) {
log.error("任务状态更新失败: {}", message);
return BaseResponse.responseError(requestNo, "任务:[" + taskInfo.getString("task_code") + "]状态更新失败," + message);
return BaseResponse.responseError(requestNo, "任务:[" + taskCode + "]状态更新失败," + message);
}
return BaseResponse.responseOk(requestNo, "任务状态反馈成功!");
}

View File

@@ -55,7 +55,7 @@ public class SchBasePoint implements Serializable {
private String vehicle_type;
/** 载具编码 */
private String storagevehicle_code;
private String vehicle_code;
/** 载具数量 */
private Integer vehicle_qty;

View File

@@ -134,7 +134,7 @@ public class SchBasePointServiceImpl extends ServiceImpl<SchBasePointMapper, Sch
// 根据点位状态来判断更新内容
if (ObjectUtil.isNotEmpty(pointStatus) && pointStatus.equals(PointStatusEnum.EMPTY_POINT.getCode())) {
entity.setVehicle_type("");
entity.setStoragevehicle_code("");
entity.setVehicle_code("");
entity.setVehicle_qty(0);
}
pointMapper.updateById(entity);

View File

@@ -29,9 +29,6 @@ public class SchBaseTask implements Serializable {
/** 任务编码 */
private String task_code;
/** 任务类型 */
private String task_type;
/** 任务状态 */
private String task_status;
@@ -53,8 +50,8 @@ public class SchBaseTask implements Serializable {
/** 载具类型 */
private String vehicle_type;
/** 组盘id */
private String group_id;
/** 载具数 */
private Integer vehicle_qty;
/** 载具编码 */
private String vehicle_code;
@@ -65,7 +62,7 @@ public class SchBaseTask implements Serializable {
/** 车号 */
private String car_no;
/** 组盘物料数据 */
/** 组盘物料数据要么是数据要么是id */
private String group_data;
/** 任务组id */
@@ -75,7 +72,7 @@ public class SchBaseTask implements Serializable {
private BigDecimal task_group_seq;
/** acs链路id */
private String acs_trace_id;
// private String acs_trace_id;
/** 请求参数 */
private String request_param;
@@ -84,6 +81,7 @@ public class SchBaseTask implements Serializable {
private String response_param;
/** 备注 */
private String remark;
private String finished_type;
/** 是否删除 */
private Boolean is_delete;
@@ -109,6 +107,9 @@ public class SchBaseTask implements Serializable {
/** 配置表 -> 优先级 (默认会将配置表设置进来,如果需要自行更改则可在业务中设置) */
private String priority;
/** 物料 */
private String material_code;
/** 配置表 -> acs任务类型 */
@TableField(exist = false)
private String acs_task_type;

View File

@@ -60,7 +60,7 @@ public class SchBaseTaskconfig implements Serializable {
private String priority;
/** 最大任务数量 */
private Integer task_create_max_num;

View File

@@ -64,39 +64,6 @@ public class SchBaseTaskServiceImpl extends ServiceImpl<SchBaseTaskMapper, SchBa
IPage<SchBaseTask> pages = new Page<>(page.getPage() + 1, page.getSize());
pages = schBaseTaskMapper.selectPageLeftJoin(pages, whereJson, collect);
return pages;
// String task_code = ObjectUtil.isNotEmpty(whereJson.get("task_code"))
// ? whereJson.get("task_code").toString() : null;
// String vehicle_code = ObjectUtil.isNotEmpty(whereJson.get("vehicle_code"))
// ? whereJson.get("vehicle_code").toString() : null;
// String point_code = ObjectUtil.isNotEmpty(whereJson.get("point_code"))
// ? whereJson.get("point_code").toString() : null;
// String begin_time = ObjectUtil.isNotEmpty(whereJson.get("begin_time"))
// ? whereJson.get("begin_time").toString() : null;
// String end_time = ObjectUtil.isNotEmpty(whereJson.get("end_time"))
// ? whereJson.get("end_time").toString() : null;
// String more_task_status = ObjectUtil.isNotEmpty(whereJson.get("more_task_status"))
// ? whereJson.get("more_task_status").toString() : null;
// List<String> collect = ObjectUtil.isNotEmpty(more_task_status)
// ? Arrays.stream(more_task_status.split(",")).collect(Collectors.toList()) : null;
// String unFinished = null;
// if (collect != null) {
// if (collect.contains(TaskStatus.UNFINISHED.getCode())) {
// collect = null;
// unFinished = TaskStatus.EXECUTING.getCode();
// }
// }
// LambdaQueryWrapper<SchBaseTask> lam = new LambdaQueryWrapper<>();
// lam.eq(ObjectUtil.isNotEmpty(task_code), SchBaseTask::getTask_code, task_code)
// .eq(ObjectUtil.isNotEmpty(vehicle_code), SchBaseTask::getVehicle_code, vehicle_code)
// .eq(ObjectUtil.isNotEmpty(point_code), SchBaseTask::getPoint_code1, point_code)
// .ge(ObjectUtil.isNotEmpty(begin_time), SchBaseTask::getCreate_time, begin_time)
// .le(ObjectUtil.isNotEmpty(end_time), SchBaseTask::getCreate_time, end_time)
// .in(ObjectUtil.isNotEmpty(collect), SchBaseTask::getTask_status, collect)
// .le(ObjectUtil.isNotEmpty(unFinished), SchBaseTask::getTask_status, unFinished)
// .orderByDesc(SchBaseTask::getUpdate_time);
// IPage<SchBaseTask> pages = new Page<>(page.getPage() + 1, page.getSize());
// schBaseTaskMapper.selectPage(pages, lam);
// return pages;
}

View File

@@ -173,31 +173,19 @@ public abstract class AbstractTask {
this.renotifyAcs(list);
}
/**
* 更新任务状态,暴露给外围使用
* @param taskObj 任务信息
* @param status 状态
*/
public void updateTaskStatus(JSONObject taskObj, TaskStatus status) {
this.updateStatus(taskObj, status);
}
/**
* 自动生成任务
*/
protected void autoCreate() {
// 考虑不通过此定时器
}
/**
* 修改状态
* 以下改为public会出现自动注入类出现问题
*
* @param taskObj 任务信息
* @param status 状态
* 更新任务状态,暴露给外围使用
* @param task_code 任务信息
* @param status 状态
*/
public abstract void updateStatus(JSONObject taskObj, TaskStatus status);
public abstract void updateTaskStatus(String task_code, TaskStatus status);
/**
@@ -230,7 +218,7 @@ public abstract class AbstractTask {
*
* @param task_code 任务标识
* @return
* @discription 强制结束完成任务
* @discription 完成任务
* @author ldjun
* @created 2020年6月19日 上午10:34:58
*/
@@ -271,13 +259,10 @@ public abstract class AbstractTask {
.eq(SchBaseTaskconfig::getConfig_code, configCode));
Assert.notNull(taskConfig, LangProcess.msg("common_configTip", configCode));
// 最大任务数
Integer tcmn = taskConfig.getTask_create_max_num();
// 获取执行中的任务(由配置文件设置,一般是最大值)
List<SchBaseTask> unFinishTasksByTaskConfig = taskService.findUnFinishTasksByTaskConfig(
taskConfig.getConfig_code(), taskConfig.getTask_direction());
Assert.isFalse(unFinishTasksByTaskConfig.size() >= tcmn, LangProcess.msg("common_maxTaskTip", applyPointCode));
Assert.isFalse(unFinishTasksByTaskConfig.size() >= taskConfig.getTask_create_max_num(), LangProcess.msg("common_maxTaskTip", applyPointCode));
// 校验同个点位,同种任务是否多次请求创建任务固定只能1个任务
List<SchBaseTask> applyPointTask = taskService.findUnFinishTasksByTaskConfig(
@@ -291,7 +276,7 @@ public abstract class AbstractTask {
AbstractTask bean = SpringContextHolder.getBean(this.getClass());
// 2、创建申请任务
task.setAcs_trace_id(requestNo);
// task.setAcs_trace_id(requestNo);
task.setTask_id(IdUtil.getSnowflake(1, 1).nextIdStr());
task.setTask_code(IdUtil.getSnowflake(1, 1).nextIdStr());
task.setConfig_code(configCode);
@@ -309,7 +294,7 @@ public abstract class AbstractTask {
} else {
// 不需要立即创建
// 设置组盘 - 需要的话由子类自行实现
task.setGroup_id(bean.setGroupPlate(param));
task.setGroup_data(bean.setGroupPlate(param));
// 创建一条单点任务。
taskService.save(task);
bean.create();

View File

@@ -50,4 +50,13 @@ public class GeneralDefinition {
public static final String TASK_FINISH = "任务完成";
/** 任务取消 */
public static final String TASK_CANCEL = "任务取消";
// 载具类型
/**
* 料盅
*/
public static final String MATERIAL_CUP = "LZ";
/**
* 钢托盘
*/
public static final String STEEL_TRAY = "GTP";
}

View File

@@ -12,7 +12,7 @@ public enum TaskStatus {
/**
* 申请
*/
APPLY("1", "申请", "确认起点或者终点"),
APPLY("1", "申请", "申请"),
/**
* 创建完成
*/

View File

@@ -0,0 +1,184 @@
package org.nl.wms.sch.task_manage.task.tasks;
import cn.hutool.core.util.ObjectUtil;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import org.nl.common.exception.BadRequestException;
import org.nl.system.service.notice.ISysNoticeService;
import org.nl.wms.sch.point.service.ISchBasePointService;
import org.nl.wms.sch.point.service.dao.SchBasePoint;
import org.nl.wms.sch.task.service.ISchBaseTaskService;
import org.nl.wms.sch.task.service.ISchBaseTaskconfigService;
import org.nl.wms.sch.task.service.dao.SchBaseTask;
import org.nl.wms.sch.task.service.dao.SchBaseTaskconfig;
import org.nl.wms.sch.task_manage.AbstractTask;
import org.nl.wms.sch.task_manage.AcsTaskDto;
import org.nl.wms.sch.task_manage.GeneralDefinition;
import org.nl.wms.sch.task_manage.enums.NoticeTypeEnum;
import org.nl.wms.sch.task_manage.enums.PointStatusEnum;
import org.nl.wms.sch.task_manage.enums.TaskFinishedTypeEnum;
import org.nl.wms.sch.task_manage.task.core.TaskStatus;
import org.nl.wms.util.PointUtils;
import org.nl.wms.util.TaskUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
/**
* Demo任务类
* @Author: lyd
* @Date: 2025/9/24
*/
@Component(value = "DemoTask")
public class DemoTask extends AbstractTask {
private static final String TASK_CONFIG_CODE = "DemoTask";
@Autowired
private ISchBaseTaskService taskService;
@Autowired
private ISchBaseTaskconfigService taskConfigService;
@Autowired
private ISchBasePointService pointService;
@Autowired
private ISysNoticeService noticeService;
@Override
public void deliveryBeforeProcessing(SchBaseTask task, AcsTaskDto acsTaskDto) {
// 这里些需要设置的内容一般是特殊处理的内容放到task#request_param中
}
@Override
public void createCompletion(SchBaseTask task) {
// 立即创建任务会调用此方法
System.out.println(11);
}
@Override
public void create() throws BadRequestException {
// 创建任务,这里是为了半条任务使用
List<SchBaseTask> tasks = taskService.findTasksByTaskStatus(TASK_CONFIG_CODE, TaskStatus.APPLY);
// 配置信息
SchBaseTaskconfig taskConfig = taskConfigService.getOne(new LambdaQueryWrapper<SchBaseTaskconfig>()
.eq(SchBaseTaskconfig::getConfig_code, TASK_CONFIG_CODE));
for (SchBaseTask task : tasks) {
TaskUtils.setUpdateByAcs(task);
List<String> nextRegionStr = Arrays.stream(taskConfig.getNext_region_str().split(","))
.collect(Collectors.toList());
// 进行找点创建任务,补齐任务数据
// ....
// 找终点
SchBasePoint point = findNextPoint(nextRegionStr);
if (ObjectUtil.isEmpty(point)) {
task.setRemark("未找到所需点位!");
taskService.updateById(task);
// 消息通知 (这里不报错,可以选择通过通知的方式发送到前端,可以不用,因为似乎没用)
noticeService.createNotice(task.getRemark(), TASK_CONFIG_CODE + task.getPoint_code1(),
NoticeTypeEnum.WARN.getCode());
continue;
}
// 设置终点并修改创建成功状态
task.setPoint_code2(point.getPoint_code());
// 需要自行定义
task.setVehicle_type(GeneralDefinition.STEEL_TRAY);
task.setTask_status(TaskStatus.CREATED.getCode());
task.setRemark("");
taskService.updateById(task);
// 点位上锁,如果不采用这种方式,则不需要设置,但是找点位的时候需要根据任务来
point.setIng_task_code(task.getTask_code());
PointUtils.setUpdateByAcs(point);
pointService.updateById(point);
}
}
private SchBasePoint findNextPoint(List<String> nextRegionStr) {
return null;
}
@Override
@Transactional(rollbackFor = Exception.class)
public void updateTaskStatus(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("执行中");
TaskUtils.setUpdateByAcs(taskObj);
taskService.updateById(taskObj);
}
if (status.equals(TaskStatus.FINISHED)) {
this.finishTask(taskObj, TaskFinishedTypeEnum.AUTO_ACS);
}
if (status.equals(TaskStatus.CANCELED)) {
this.cancelTask(taskObj, TaskFinishedTypeEnum.AUTO_ACS);
}
}
@Override
public void forceFinish(String task_code) {
SchBaseTask taskObj = taskService.getByCode(task_code);
if (ObjectUtil.isEmpty(taskObj)) {
throw new BadRequestException("该任务不存在");
}
this.finishTask(taskObj, TaskFinishedTypeEnum.MANUAL_PC);
}
@Override
public void cancel(String task_code) {
SchBaseTask taskObj = taskService.getByCode(task_code);
if (ObjectUtil.isEmpty(taskObj)) {
throw new BadRequestException("该任务不存在");
}
this.cancelTask(taskObj, TaskFinishedTypeEnum.MANUAL_PC);
}
public void finishTask(SchBaseTask taskObj, TaskFinishedTypeEnum taskFinishedType) {
// 获取参数
String endPoint = taskObj.getPoint_code2();
SchBasePoint endPointObj = pointService.getById(endPoint);
// 设置载具类型、点位状态、释放点位
if (ObjectUtil.isNotEmpty(endPoint)) {
// 如果不跟据此字段,可以不用清除
endPointObj.setIng_task_code("");
endPointObj.setVehicle_type(taskObj.getVehicle_type());
endPointObj.setVehicle_qty(1);
endPointObj.setVehicle_code(taskObj.getVehicle_code());
endPointObj.setPoint_status(PointStatusEnum.EMPTY_VEHICLE.getCode());
PointUtils.setUpdateByType(endPointObj, taskFinishedType);
pointService.updateById(endPointObj);
}
taskObj.setTask_status(TaskStatus.FINISHED.getCode());
taskObj.setRemark(GeneralDefinition.TASK_FINISH);
taskObj.setFinished_type(taskFinishedType.getCode());
// 区分完成者
TaskUtils.setUpdateByType(taskObj, taskFinishedType);
taskService.updateById(taskObj);
}
public void cancelTask(SchBaseTask taskObj, TaskFinishedTypeEnum taskFinishedType) {
// 获取参数
String endPoint = taskObj.getPoint_code2();
SchBasePoint endPointObj = pointService.getById(endPoint);
// 释放点位
if (ObjectUtil.isNotEmpty(endPoint)) {
// 如果不跟据此字段,可以不用清除
endPointObj.setIng_task_code("");
PointUtils.setUpdateByType(endPointObj, taskFinishedType);
pointService.updateById(endPointObj);
}
taskObj.setRemark(GeneralDefinition.TASK_CANCEL);
taskObj.setTask_status(TaskStatus.CANCELED.getCode());
taskObj.setFinished_type(taskFinishedType.getCode());
TaskUtils.setUpdateByType(taskObj, taskFinishedType);
taskService.updateById(taskObj);
}
}

View File

@@ -0,0 +1,6 @@
/**
* 任务存放位置
* @Author: lyd
* @Date: 2025/9/24
*/
package org.nl.wms.sch.task_manage.task.tasks;

View File

@@ -48,7 +48,7 @@ public class PointUtils {
SchBasePointServiceImpl pointService = SpringContextHolder.getBean(SchBasePointServiceImpl.class);
point.setPoint_status(PointStatusEnum.EMPTY_POINT.getCode());
point.setVehicle_type("");
point.setStoragevehicle_code("");
point.setVehicle_code("");
point.setIng_task_code("");
point.setVehicle_qty(0);
point.setUpdate_time(DateUtil.now());
@@ -70,7 +70,7 @@ public class PointUtils {
String parentPointCode = point.getParent_point_code();
SchBasePoint basePoint = pointService.getById(parentPointCode);
point.setVehicle_type("");
point.setStoragevehicle_code("");
point.setVehicle_code("");
point.setIng_task_code("");
point.setVehicle_qty(point.getVehicle_qty() == 5 ? point.getVehicle_qty() : point.getVehicle_qty() + 1);
// 等到新的点执行第一托的时候才判断另一个点满足5个托盘的时候就清空

View File

@@ -4,6 +4,9 @@ import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import org.junit.jupiter.api.Test;
import org.nl.wms.sch.task_manage.AbstractTask;
import org.nl.wms.sch.task_manage.task.TaskFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.Map;
@@ -16,8 +19,13 @@ import java.util.Map;
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class ApplicationTest {
@Autowired
private TaskFactory taskFactory;
@Test
void contextLoads() {
AbstractTask demoTask = taskFactory.getTask("DemoTask");
demoTask.apply(new JSONObject());
}
@Test