fix: 任务配置

This commit is contained in:
2024-04-08 18:02:53 +08:00
parent 3bcb066862
commit 48375287d9
16 changed files with 154 additions and 225 deletions

View File

@@ -30,14 +30,12 @@ public class SchBaseTaskconfigController {
@GetMapping
@Log("查询任务配置")
public ResponseEntity<Object> query(@RequestParam Map whereJson, PageQuery page){
return new ResponseEntity<>(TableDataInfo.build(schBaseTaskconfigService.queryAll(whereJson,page)),HttpStatus.OK);
}
@PostMapping
@Log("新增任务配置")
public ResponseEntity<Object> create(@Validated @RequestBody SchBaseTaskconfig entity){
schBaseTaskconfigService.create(entity);
return new ResponseEntity<>(HttpStatus.CREATED);
@@ -45,14 +43,12 @@ public class SchBaseTaskconfigController {
@PutMapping
@Log("修改任务配置")
public ResponseEntity<Object> update(@Validated @RequestBody SchBaseTaskconfig entity){
schBaseTaskconfigService.update(entity);
return new ResponseEntity<>(HttpStatus.NO_CONTENT);
}
@Log("删除任务配置")
@DeleteMapping
public ResponseEntity<Object> delete(@RequestBody Set<String> ids) {
schBaseTaskconfigService.deleteAll(ids);

View File

@@ -1,6 +1,7 @@
package org.nl.wms.sch.task.service.dao;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
@@ -23,7 +24,6 @@ public class SchBaseTask implements Serializable {
private static final long serialVersionUID = 1L;
@TableId(value = "task_id", type = IdType.NONE)
private String task_id;
@@ -102,7 +102,7 @@ public class SchBaseTask implements Serializable {
private String remark;
private String is_delete;
private Boolean is_delete;
private String create_id;
@@ -132,4 +132,7 @@ public class SchBaseTask implements Serializable {
private String is_send;
@TableField(exist = false)
private String dtl_type;
}

View File

@@ -64,21 +64,6 @@ public class SchBaseTaskconfigServiceImpl extends ServiceImpl<SchBaseTaskconfigM
String nickName = SecurityUtils.getCurrentNickName();
String now = DateUtil.now();
if (ObjectUtil.isAllEmpty(entity.getStart_region_strs(), entity.getNext_region_strs()))
throw new BadRequestException(LangProcess.msg("point_checkNull_1"));
if (ObjectUtil.isNotEmpty(entity.getStart_region_strs())) {
// 起点区域配置
String startRegion = String.join(",", entity.getStart_region_strs());
entity.setStart_region_str(startRegion);
}
if (ObjectUtil.isNotEmpty(entity.getNext_region_strs())) {
// 终点区域配置
String nextRegion = String.join(",", entity.getNext_region_strs());
entity.setNext_region_str(nextRegion);
}
entity.setConfig_id(IdUtil.getSnowflake(1, 1).nextIdStr());
entity.setCreate_id(currentUserId);
entity.setCreate_name(nickName);

View File

@@ -47,15 +47,13 @@ public abstract class AbstractTask {
@Autowired
private WmsToAcsService wmsToAcsService;
protected abstract List<AcsTaskDto> addTask();
/**
* 任务创建
* 根据配置生成任务,如并发控制等
*
* @throws BadRequestException /
*/
protected abstract void create() throws BadRequestException;
public abstract void create() throws BadRequestException;
/**
* 任务创建
@@ -63,7 +61,7 @@ public abstract class AbstractTask {
*
* @param task /
*/
protected void createCompletion(SchBaseTask task) {
public void createCompletion(SchBaseTask task) {
}
@@ -104,9 +102,9 @@ public abstract class AbstractTask {
taskDto.setNext_device_code2(task.getPoint_code4());
taskDto.setVehicle_code(task.getVehicle_code());
taskDto.setVehicle_code2(task.getVehicle_code2());
this.setTask(task.getConfig_code(), taskDto);
// 如果各类方法对返回参数有不同可以通过调用子类实现的deliveryBeforeProcessing方法来完成赋值也可以是统一封装到参数值中。
this.deliveryBeforeProcessing(task, taskDto);
this.setTask(task.getConfig_code(), taskDto);
list.add(taskDto);
}
try {
@@ -163,7 +161,8 @@ public abstract class AbstractTask {
public void getAllFinishTask() {
List<SchBaseTask> list = taskService.list(new LambdaQueryWrapper<SchBaseTask>()
.eq(SchBaseTask::getTask_status, TaskStatus.START_AND_POINT.getCode()));
.eq(SchBaseTask::getTask_status, TaskStatus.START_AND_POINT.getCode())
.eq(SchBaseTask::getIs_delete, false));
if (ObjectUtil.isEmpty(list)) {
return;
}
@@ -171,6 +170,11 @@ public abstract class AbstractTask {
this.renotifyAcs(list);
}
/**
* 更新任务状态,暴露给外围使用
* @param task_code 任务编码
* @param status 状态
*/
public void updateTaskStatus(String task_code, TaskStatus status) {
this.updateStatus(task_code, status);
}
@@ -255,15 +259,31 @@ public abstract class AbstractTask {
// 申请任务
SchBaseTask task = new SchBaseTask();
// 请求点
String apply_point_code = param.getString("device_code");
String requestNo = param.getString("requestNo");
String config_code = param.getString("config_code");
// 1、校验数据
SchBaseTaskconfig taskConfig = taskConfigService.getOne(new LambdaQueryWrapper<SchBaseTaskconfig>()
.eq(SchBaseTaskconfig::getConfig_code, config_code));
Assert.notNull(taskConfig, "找不到配置文件,请确认[" + config_code + "]配置是否存在!");
// 最大任务数
Integer tcmn = taskConfig.getTask_create_max_num();
// 获取执行中的任务
List<SchBaseTask> unFinishTasksByTaskConfig = taskService.findUnFinishTasksByTaskConfig(
taskConfig.getConfig_code(), apply_point_code, taskConfig.getTask_direction());
Assert.isFalse(unFinishTasksByTaskConfig.size() >= tcmn,
apply_point_code + "该点位申请的任务未完成数已超过上限,无法申请任务");
String vehicleType = param.getString("vehicle_type");
String vehicleCode = TaskUtils.defaultVehicleCode(param.getString("vehicle_code"));
AbstractTask bean = SpringContextHolder.getBean(this.getClass());
// 1、校验数据
// 2、创建申请任务
task.setAcs_trace_id(requestNo);
task.setTask_id(IdUtil.getSnowflake(1, 1).nextIdStr());
task.setTask_code(IdUtil.getSnowflake(1, 1).nextIdStr());
task.setConfig_code(config_code);
task.setCreate_mode(ObjectUtil.isNotEmpty(param.getString("create_mode"))
? param.getString("create_mode") : GeneralDefinition.ACS_CREATION);
task.setVehicle_code(vehicleCode);
@@ -281,7 +301,7 @@ public abstract class AbstractTask {
TaskUtils.setCreateByAcsOrPda(task, param);
// 3、判断是否直接找点下发
// 立即创建吧组盘放到具体位置,免得重复创建
if ("1".equals(param.getString("is_immediate_create"))) {
if (taskConfig.getIs_immediate_create()) {
bean.createCompletion(task);
} else {
// 不需要立即创建

View File

@@ -138,4 +138,5 @@ public class AcsTaskDto {
* 区域
*/
private String product_area;
private String truss_type;
}

View File

@@ -1,7 +1,9 @@
package org.nl.wms.sch.task_manage.task;
import org.nl.wms.sch.task_manage.AbstractTask;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Component;
@@ -13,30 +15,29 @@ import java.util.Map;
* @version 2.0
* @date 2023年05月16日 16:42
* @desc 采用获取注解来标识任务类型,并通过扫描和反射的方式来获取任务实例
* 3.0 采用获取所有bean对象判断是否为AbstractTask
*/
@Component
public class TaskFactory {
public class TaskFactory implements BeanPostProcessor {
private final Map<String, AbstractTask> taskMap;
@Autowired
public TaskFactory(ApplicationContext applicationContext) {
public TaskFactory() {
taskMap = new HashMap<>();
initializeTasks(applicationContext);
}
private void initializeTasks(ApplicationContext applicationContext) {
Map<String, Object> taskBeans = applicationContext.getBeansWithAnnotation(TaskType.class);
for (Object taskBean : taskBeans.values()) {
TaskType taskTypeAnnotation = taskBean.getClass().getAnnotation(TaskType.class);
String taskType = taskTypeAnnotation.value();
taskMap.put(taskType.toUpperCase(), (AbstractTask) taskBean);
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
if (bean instanceof AbstractTask) {
taskMap.put(beanName, (AbstractTask) bean);
}
return bean;
}
public AbstractTask getTask(String taskType) {
if (taskType == null) {
return null;
}
return taskMap.get(taskType.toUpperCase());
return taskMap.get(taskType);
}
}

View File

@@ -1,14 +1,14 @@
package org.nl.wms.sch.task_manage.task.second_floor_area;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.BooleanUtil;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.TypeReference;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.nl.common.exception.BadRequestException;
import org.nl.common.utils.SecurityUtils;
import org.nl.wms.sch.task.service.ISchBaseTaskService;
import org.nl.wms.sch.task.service.dao.SchBaseTask;
import org.nl.wms.sch.task_manage.AbstractTask;
@@ -16,12 +16,13 @@ import org.nl.wms.sch.task_manage.AcsTaskDto;
import org.nl.wms.sch.task_manage.enums.PackageInfoIvtEnum;
import org.nl.wms.sch.task_manage.task.core.TaskStatus;
import org.nl.wms.storage_manage.ios.enums.IOSEnum;
import org.nl.wms.util.TaskUtils;
import org.springframework.stereotype.Component;
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.Map;
/**
@@ -30,55 +31,39 @@ import java.util.List;
* @author gbx
* @since 2024-03-28
*/
@Service()
@RequiredArgsConstructor
@Slf4j
@Component(value = "CallEmpReelTask")
public class CallEmpReelTask extends AbstractTask {
private final String THIS_CLASS = CallEmpReelTask.class.getName();
@Resource
private ISchBaseTaskService taskService;
/**
* 特殊操作
* @param task LMS任务
* @param acsTaskDto ACS任务
*/
@Override
public List<AcsTaskDto> addTask() {
ArrayList<AcsTaskDto> resultList = new ArrayList<>();
List<SchBaseTask> taskList = taskService.list(new LambdaUpdateWrapper<SchBaseTask>().eq(SchBaseTask::getHandle_class, THIS_CLASS)
.eq(SchBaseTask::getTask_status, TaskStatus.START_AND_POINT.getCode())
.eq(SchBaseTask::getIs_delete, 0)
);
taskList.forEach(r -> {
AcsTaskDto dto = AcsTaskDto.builder()
.ext_task_uuid(r.getTask_id().toString())
.task_code(r.getTask_code())
.task_type(r.getAcs_task_type())
.start_device_code(r.getPoint_code1())
.next_device_code(r.getPoint_code2())
.start_device_code2(r.getPoint_code3())
.next_device_code2(r.getPoint_code4())
.vehicle_code(r.getVehicle_code())
.priority(r.getPriority())
.remark(r.getRemark())
.product_area(r.getProduct_area())
//.agv_system_type(PackageInfoIvtEnum.AGV_SYSTEM_TYPE.code("1楼叉车系统"))
//.truss_type(PackageInfoIvtEnum.TRUSS_TYPE.code("点对点任务"))
//.dtl_type(r.getDtl_type())
//.params(r.getParams())
.build();
resultList.add(dto);
});
return resultList;
public void deliveryBeforeProcessing(SchBaseTask task, AcsTaskDto acsTaskDto) {
acsTaskDto.setDtl_type(task.getDtl_type());
acsTaskDto.setTruss_type(PackageInfoIvtEnum.TRUSS_TYPE.code("点对点任务"));
acsTaskDto.setAgv_system_type(PackageInfoIvtEnum.AGV_SYSTEM_TYPE.code("1楼叉车系统"));
acsTaskDto.setParams(JSON.parseObject(task.getRequest_param(),
new TypeReference<Map<String, String>>() {}));
}
@Override
protected void create() throws BadRequestException {
@Transactional(rollbackFor = Exception.class)
public void create() throws BadRequestException {
}
@Override
@Transactional(rollbackFor = Exception.class)
public void updateTaskStatus(String task_code, TaskStatus status) {
SchBaseTask schBaseTask = taskService.getOne(new LambdaUpdateWrapper<SchBaseTask>().eq(SchBaseTask::getTask_code, task_code), false);
protected void updateStatus(String task_code, TaskStatus status) {
SchBaseTask schBaseTask = taskService.getOne(new LambdaUpdateWrapper<SchBaseTask>()
.eq(SchBaseTask::getTask_code, task_code), false);
if (schBaseTask == null) {
throw new BadRequestException("CallEmpReelTask任务更新接口任务号为空");
}
@@ -98,17 +83,10 @@ public class CallEmpReelTask extends AbstractTask {
throw new BadRequestException("CallEmpReelTask任务已执行不能取消");
}
// 更新任务表删除字段
schBaseTask.setIs_delete(IOSEnum.IS_NOTANDYES.code(""));
schBaseTask.setIs_delete(true);
}
schBaseTask.setUpdate_time(DateUtil.now());
schBaseTask.setUpdate_id(SecurityUtils.getCurrentUserId());
schBaseTask.setUpdate_name(SecurityUtils.getCurrentNickName());
taskService.update(schBaseTask);
}
@Override
protected void updateStatus(String task_code, TaskStatus status) {
TaskUtils.setUpdateByDefault(schBaseTask);
taskService.updateById(schBaseTask);
}
@@ -133,16 +111,16 @@ public class CallEmpReelTask extends AbstractTask {
}
//是否立即下发
boolean isSend = !StrUtil.isNotBlank(task.getIs_send()) || BooleanUtil.toBoolean(task.getIs_send());
task.setTask_id(org.nl.common.utils.IdUtil.getStringId());
task.setTask_code(org.nl.common.utils.IdUtil.getStringId());
task.setTask_id(IdUtil.getSnowflake(1,1).nextIdStr());
task.setTask_code(IdUtil.getSnowflake(1,1).nextIdStr());
task.setHandle_class(THIS_CLASS);
task.setCreate_id(SecurityUtils.getCurrentUserId());
task.setCreate_name(SecurityUtils.getCurrentUsername());
task.setCreate_time(DateUtil.now());
task.setIs_send(isSend ? "1" : "0");
task.setAcs_task_type(StrUtil.isEmpty(task.getAcs_task_type()) ? PackageInfoIvtEnum.ACS_TASK_TYPE.code("agv任务") : (task.getAcs_task_type()));
task.setTask_status(StrUtil.isEmpty(task.getTask_status()) ? TaskStatus.START_AND_POINT.getCode() : task.getTask_status());
task.setAcs_task_type(StrUtil.isEmpty(task.getAcs_task_type())
? PackageInfoIvtEnum.ACS_TASK_TYPE.code("agv任务") : (task.getAcs_task_type()));
task.setTask_status(StrUtil.isEmpty(task.getTask_status())
? TaskStatus.START_AND_POINT.getCode() : task.getTask_status());
task.setProduct_area(StrUtil.isEmpty(task.getProduct_area()) ? "A1" : task.getProduct_area());
TaskUtils.setCreateByDefault(task);
taskService.save(task);
//如果目标点位没有空位先创建不下发
if (isSend) {
@@ -158,10 +136,8 @@ public class CallEmpReelTask extends AbstractTask {
throw new BadRequestException("CallEmpReelTask任务强制完成接口任务号为空");
}
schBaseTask.setTask_status(TaskStatus.FINISHED.getCode());
schBaseTask.setUpdate_time(DateUtil.now());
schBaseTask.setUpdate_id(SecurityUtils.getCurrentUserId());
schBaseTask.setUpdate_name(SecurityUtils.getCurrentNickName());
taskService.update(schBaseTask);
TaskUtils.setUpdateByDefault(schBaseTask);
taskService.updateById(schBaseTask);
}
@Override
@@ -172,10 +148,8 @@ public class CallEmpReelTask extends AbstractTask {
throw new BadRequestException("CallEmpReelTask任务取消接口任务号为空");
}
schBaseTask.setTask_status(IOSEnum.ACS_RESULT.code("取消"));
schBaseTask.setUpdate_time(DateUtil.now());
schBaseTask.setUpdate_id(SecurityUtils.getCurrentUserId());
schBaseTask.setUpdate_name(SecurityUtils.getCurrentNickName());
taskService.update(schBaseTask);
TaskUtils.setUpdateByDefault(schBaseTask);
taskService.updateById(schBaseTask);
}

View File

@@ -476,7 +476,7 @@ public class StIvtIostorinvServiceImpl extends ServiceImpl<StIvtIostorinvMapper,
if (!taskDao.getTask_status().equals("20")) throw new BadRequestException("请检查任务状态!");
// 删除任务
taskDao.setIs_delete(IOSEnum.IS_NOTANDYES.code(""));
taskDao.setIs_delete(true);
iSchBaseTaskService.updateById(taskDao);
// 更新分配明细

View File

@@ -34,6 +34,11 @@ public class TaskUtils {
taskObj.setCreate_name(SecurityUtils.getCurrentNickName());
taskObj.setCreate_time(DateUtil.now());
}
public static void setCreateByDefault(SchBaseTask taskObj) {
taskObj.setCreate_id(SecurityUtils.getCurrentUserId());
taskObj.setCreate_name(SecurityUtils.getCurrentNickName());
taskObj.setCreate_time(DateUtil.now());
}
public static void setCreateByAcsOrPda(SchBaseTask taskObj, JSONObject param) {
// 如果是人工创建,会带个用户过来
if (ObjectUtil.isNotEmpty(param.getString("user_id"))) {
@@ -54,6 +59,11 @@ public class TaskUtils {
taskObj.setUpdate_name(SecurityUtils.getCurrentNickName());
taskObj.setUpdate_time(DateUtil.now());
}
public static void setUpdateByDefault(SchBaseTask taskObj) {
taskObj.setUpdate_id(SecurityUtils.getCurrentUserId());
taskObj.setUpdate_name(SecurityUtils.getCurrentNickName());
taskObj.setUpdate_time(DateUtil.now());
}
public static void setGroupUpdateByAcs(SchBaseVehiclematerialgroup groupEntity) {
groupEntity.setUpdate_id(GeneralDefinition.ACS_ID);

View File

@@ -1,8 +1,13 @@
package org.nl;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.TypeReference;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.Map;
/**
* @Author: lyd
* @Description: 单元测试
@@ -15,4 +20,22 @@ public class ApplicationTest {
void contextLoads() {
}
@Test
void testJSONToMap() {
JSONObject pa = new JSONObject();
JSONObject pa2 = new JSONObject();
pa2.put("a", 2);
pa.put("name", "lyd");
pa.put("age", pa2);
String jsonString = pa.toJSONString();
// 使用Fastjson解析JSON字符串
Map<String, String> map = JSON.parseObject(jsonString, new TypeReference<Map<String, String>>() {});
// 输出Map
for (Map.Entry<String, String> entry : map.entrySet()) {
System.out.println(entry.getKey() + " : " + entry.getValue());
}
}
}