diff --git a/nladmin-system/doc/wms.xls b/nladmin-system/doc/wms.xls index b01cdb9..995b66a 100644 Binary files a/nladmin-system/doc/wms.xls and b/nladmin-system/doc/wms.xls differ diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/common/utils/SecurityUtils.java b/nladmin-system/nlsso-server/src/main/java/org/nl/common/utils/SecurityUtils.java index b434369..67f854f 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/common/utils/SecurityUtils.java +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/common/utils/SecurityUtils.java @@ -49,7 +49,7 @@ public class SecurityUtils { * @return 系统用户名称 */ public static String getCurrentNickName() { - return getCurrentUser().getPresonName(); + return getCurrentUser().getPreson_name(); } /** diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/common/utils/dto/CurrentUser.java b/nladmin-system/nlsso-server/src/main/java/org/nl/common/utils/dto/CurrentUser.java index 440752f..c305dc5 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/common/utils/dto/CurrentUser.java +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/common/utils/dto/CurrentUser.java @@ -22,7 +22,7 @@ public class CurrentUser implements Serializable { //账号 private String username; //姓名 - private String presonName; + private String preson_name; //用户详细信息 private SysUser user; diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/system/service/dept/impl/SysDeptServiceImpl.java b/nladmin-system/nlsso-server/src/main/java/org/nl/system/service/dept/impl/SysDeptServiceImpl.java index 93ea266..36a46bb 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/system/service/dept/impl/SysDeptServiceImpl.java +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/system/service/dept/impl/SysDeptServiceImpl.java @@ -168,7 +168,7 @@ public class SysDeptServiceImpl extends ServiceImpl impl dept.setDept_id(IdUtil.getStringId()); CurrentUser user = SecurityUtils.getCurrentUser(); dept.setCreate_id(user.getId()); - dept.setCreate_name(user.getPresonName()); + dept.setCreate_name(user.getPreson_name()); dept.setCreate_time(new Date()); this.save(dept); // 清理缓存 diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/system/service/secutiry/impl/OnlineUserService.java b/nladmin-system/nlsso-server/src/main/java/org/nl/system/service/secutiry/impl/OnlineUserService.java index b63ef55..0b6a493 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/system/service/secutiry/impl/OnlineUserService.java +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/system/service/secutiry/impl/OnlineUserService.java @@ -244,7 +244,7 @@ public class OnlineUserService { CurrentUser user = new CurrentUser(); user.setId(userInfo.getUser_id()); user.setUsername(userInfo.getUsername()); - user.setPresonName((userInfo.getPerson_name())); + user.setPreson_name((userInfo.getPerson_name())); user.setUser(userInfo); user.setPermissions(permissionList); diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/group/service/dao/SchBaseVehiclematerialgroup.java b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/group/service/dao/SchBaseVehiclematerialgroup.java index 2dfc2ad..4f71d0a 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/group/service/dao/SchBaseVehiclematerialgroup.java +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/group/service/dao/SchBaseVehiclematerialgroup.java @@ -8,28 +8,33 @@ import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; -import java.math.BigDecimal; import java.io.Serializable; +import java.math.BigDecimal; /** -* @description / -* @author lyd -* @date 2023-05-16 -**/ + * @author lyd + * @description / + * @date 2023-05-16 + **/ @Data @EqualsAndHashCode(callSuper = false) @TableName("sch_base_vehiclematerialgroup") public class SchBaseVehiclematerialgroup implements Serializable { - private static final long serialVersionUID = 1L; + @TableId(value = "group_id", type = IdType.NONE) + @ApiModelProperty(value = "组盘标识") + private String group_id; - @TableId(value = "vehicle_code", type = IdType.NONE) @ApiModelProperty(value = "载具编码") private String vehicle_code; @ApiModelProperty(value = "物料标识") private String material_id; + @ApiModelProperty(value = "载具类型") + private String vehicle_type; + + @ApiModelProperty(value = "子载具编码") private String child_vehicle_code; @@ -52,10 +57,10 @@ public class SchBaseVehiclematerialgroup implements Serializable { private String instorage_time; @ApiModelProperty(value = "静置时间(分钟)") - private BigDecimal standing_time; + private Integer standing_time; @ApiModelProperty(value = "物料数量") - private BigDecimal material_qty; + private Integer material_qty; @ApiModelProperty(value = "物料重量") private BigDecimal material_weight; @@ -64,7 +69,7 @@ public class SchBaseVehiclematerialgroup implements Serializable { private String workorder_code; @ApiModelProperty(value = "组盘次数") - private BigDecimal group_number; + private Integer group_number; @ApiModelProperty(value = "任务编码") private String task_code; @@ -108,6 +113,9 @@ public class SchBaseVehiclematerialgroup implements Serializable { @ApiModelProperty(value = "备注") private String remark; + @ApiModelProperty(value = "1:待绑定,2:已绑定,3:已解绑") + private String group_bind_material_status; + @ApiModelProperty(value = "是否删除") private Boolean is_delete; @@ -129,6 +137,7 @@ public class SchBaseVehiclematerialgroup implements Serializable { @ApiModelProperty(value = "修改时间") private String update_time; + @TableField(exist = false) private String material_name; @TableField(exist = false) diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/group/service/dto/SchBaseVehiclematerialgroupDto.java b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/group/service/dto/SchBaseVehiclematerialgroupDto.java index d4e5509..9da91f8 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/group/service/dto/SchBaseVehiclematerialgroupDto.java +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/group/service/dto/SchBaseVehiclematerialgroupDto.java @@ -12,6 +12,9 @@ import java.io.Serializable; @Data public class SchBaseVehiclematerialgroupDto implements Serializable { + /** 组盘id */ + private String group_id; + /** 载具编码 */ private String vehicle_code; diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/group/service/impl/SchBaseVehiclematerialgroupServiceImpl.java b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/group/service/impl/SchBaseVehiclematerialgroupServiceImpl.java index a830d83..f729ac1 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/group/service/impl/SchBaseVehiclematerialgroupServiceImpl.java +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/group/service/impl/SchBaseVehiclematerialgroupServiceImpl.java @@ -2,6 +2,7 @@ package org.nl.wms.sch.group.service.impl; import cn.hutool.core.date.DateUtil; import cn.hutool.core.lang.Assert; +import cn.hutool.core.util.IdUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; @@ -41,15 +42,11 @@ public class SchBaseVehiclematerialgroupServiceImpl extends ServiceImpl() - .eq(SchBaseVehiclematerialgroup::getVehicle_code, entity.getVehicle_code()) - .eq(SchBaseVehiclematerialgroup::getIs_delete, false)); - Assert.isNull(schBaseVehiclematerialgroup, "载具编码[" + entity.getVehicle_code() + "]已存在"); - String currentUserId = SecurityUtils.getCurrentUserId(); String nickName = SecurityUtils.getCurrentNickName(); String now = DateUtil.now(); + entity.setGroup_id(IdUtil.getSnowflake(1,1).nextIdStr()); entity.setCreate_id(currentUserId); entity.setCreate_name(nickName); entity.setCreate_time(now); @@ -61,16 +58,12 @@ public class SchBaseVehiclematerialgroupServiceImpl extends ServiceImpl lam = new LambdaQueryWrapper<>(); lam.like(ObjectUtil.isNotEmpty(blurry), SchBasePoint::getPoint_code, blurry) .or(ObjectUtil.isNotEmpty(blurry), lam1 -> lam1.like(SchBasePoint::getPoint_name, blurry)) @@ -58,7 +58,12 @@ public class SchBasePointServiceImpl extends ServiceImpl slam.isNull(SchBasePoint::getIng_task_code) + .or() + .eq(SchBasePoint::getIng_task_code, "")) + .and(lock_type, slam -> slam.isNotNull(SchBasePoint::getIng_task_code) + .ne(SchBasePoint::getIng_task_code, "")); IPage pages = new Page<>(page.getPage() + 1, page.getSize()); pointMapper.selectPage(pages, lam); // 可以存放的载具类型 @@ -122,8 +127,10 @@ public class SchBasePointServiceImpl extends ServiceImpl(HttpStatus.OK); } + @GetMapping("/taskStatusList") + @Log("任务状态下拉框") + @ApiOperation("任务状态下拉框") + @SaIgnore + //@SaCheckPermission("@el.check('schBaseTask:list')") + public ResponseEntity getTaskStatusList(){ + return new ResponseEntity<>(TableDataInfo.build(schBaseTaskService.getTaskStatusList()),HttpStatus.OK); + } + @PostMapping("/apply") @Log("新增任务管理") @ApiOperation("新增任务管理") @@ -78,4 +87,13 @@ public class SchBaseTaskController { return new ResponseEntity<>(HttpStatus.CREATED); } + @PutMapping("/operation") + @Log("任务操作") + @ApiOperation("任务操作") + //@SaCheckPermission("task:edit") + public ResponseEntity update(@RequestBody Map map) { + schBaseTaskService.operation(map); + return new ResponseEntity<>(HttpStatus.NO_CONTENT); + } + } diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task/service/ISchBaseTaskService.java b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task/service/ISchBaseTaskService.java index 457c585..b04e381 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task/service/ISchBaseTaskService.java +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task/service/ISchBaseTaskService.java @@ -1,5 +1,6 @@ package org.nl.wms.sch.task.service; +import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.metadata.IPage; import org.nl.common.domain.query.PageQuery; @@ -67,6 +68,15 @@ public interface ISchBaseTaskService extends IService { */ List findUnFinishTasksByTaskConfig(String config_code, String task_code); + /** + * 根据任务配置查询同台设备未完成的任务列表 + * + * @param config_code 任务配置 + * @param device_code 设备 + * @return + */ + List findUnFinishTasksByTaskConfig(String config_code, String device_code, String direction); + List findTasksByTaskStatus(String config_code, TaskStatus status); @@ -76,4 +86,17 @@ public interface ISchBaseTaskService extends IService { * @param param / */ void apply(JSONObject param); + + /** + * 获取任务状态下拉框 + * @return + */ + JSONArray getTaskStatusList(); + + /** + * 任务操作 + * + * @param param + */ + void operation(Map param); } diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task/service/dao/SchBaseTaskconfig.java b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task/service/dao/SchBaseTaskconfig.java index 45caffb..cd1885b 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task/service/dao/SchBaseTaskconfig.java +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task/service/dao/SchBaseTaskconfig.java @@ -43,6 +43,9 @@ public class SchBaseTaskconfig implements Serializable { @ApiModelProperty(value = "任务类型") private String task_type; + @ApiModelProperty(value = "任务方向") + private String task_direction; + @ApiModelProperty(value = "优先级") private String priority; diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task/service/dto/SchBaseTaskconfigDto.java b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task/service/dto/SchBaseTaskconfigDto.java index d146744..a559dbd 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task/service/dto/SchBaseTaskconfigDto.java +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task/service/dto/SchBaseTaskconfigDto.java @@ -33,6 +33,9 @@ public class SchBaseTaskconfigDto implements Serializable { /** 优先级 */ private String priority; + /** 任务方向 **/ + private String task_direction; + /** 允许最大任务生成数 */ private Integer task_create_max_num; diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task/service/impl/SchBaseTaskServiceImpl.java b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task/service/impl/SchBaseTaskServiceImpl.java index d42b4e7..58238d8 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task/service/impl/SchBaseTaskServiceImpl.java +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task/service/impl/SchBaseTaskServiceImpl.java @@ -4,6 +4,7 @@ import cn.hutool.core.date.DateUtil; import cn.hutool.core.lang.Assert; import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; @@ -14,8 +15,8 @@ import org.nl.common.domain.query.PageQuery; 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.mapper.SchBaseTaskMapper; import org.nl.wms.sch.task.service.dao.SchBaseTask; +import org.nl.wms.sch.task.service.dao.mapper.SchBaseTaskMapper; import org.nl.wms.sch.task.service.dao.mapper.SchBaseTaskconfigMapper; import org.nl.wms.sch.task_manage.AbstractTask; import org.nl.wms.sch.task_manage.task.TaskFactory; @@ -23,9 +24,11 @@ import org.nl.wms.sch.task_manage.task.core.TaskStatus; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import java.util.Arrays; import java.util.List; import java.util.Map; import java.util.Set; +import java.util.stream.Collectors; /** * @author lyd @@ -41,6 +44,9 @@ public class SchBaseTaskServiceImpl extends ServiceImpl queryAll(Map whereJson, PageQuery page) { String task_code = ObjectUtil.isNotEmpty(whereJson.get("task_code")) ? whereJson.get("task_code").toString() : null; @@ -48,12 +54,16 @@ public class SchBaseTaskServiceImpl extends ServiceImpl collect = ObjectUtil.isNotEmpty(more_task_status)?Arrays.stream(more_task_status.split(",")).collect(Collectors.toList()):null; LambdaQueryWrapper 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); + .le(ObjectUtil.isNotEmpty(end_time), SchBaseTask::getCreate_time, end_time) + .in(ObjectUtil.isNotEmpty(collect), SchBaseTask::getTask_status, collect) + .orderByDesc(SchBaseTask::getUpdate_time); IPage pages = new Page<>(page.getPage() + 1, page.getSize()); schBaseTaskMapper.selectPage(pages, lam); return pages; @@ -104,6 +114,19 @@ public class SchBaseTaskServiceImpl extends ServiceImpl findUnFinishTasksByTaskConfig(String config_code, String device_code, String direction) { + Assert.notNull(config_code, "任务配置编码不能为空!"); + LambdaQueryWrapper lam = new LambdaQueryWrapper<>(); + lam.eq(SchBaseTask::getConfig_code, config_code) + .lt(SchBaseTask::getTask_status, TaskStatus.FINISHED.getCode()) + .eq(direction.equals("1"), SchBaseTask::getPoint_code1, device_code) + .eq(direction.equals("2"), SchBaseTask::getPoint_code2, device_code) + .eq(SchBaseTask::getIs_delete, false); + List schBaseTasks = schBaseTaskMapper.selectList(lam); + return schBaseTasks; + } + @Override public List findTasksByTaskStatus(String config_code, TaskStatus status) { Assert.notNull(config_code, "任务配置编码不能为空!"); @@ -121,7 +144,6 @@ public class SchBaseTaskServiceImpl extends ServiceImpl param) { + String task_code = ObjectUtil.isNotEmpty(param.get("task_code")) ? param.get("task_code").toString() : null; + String method_name = ObjectUtil.isNotEmpty(param.get("method_name")) ? param.get("method_name").toString() : null; + // 根据标识找到任务 + SchBaseTask taskOne = schBaseTaskMapper.selectById(task_code); + if (Integer.parseInt(taskOne.getTask_status()) >= Integer.parseInt(TaskStatus.FINISHED.getCode())) { + throw new BadRequestException("任务已完成或已取消!"); + } + // 根据配置去工厂类获得类对象 + String processing_class = "YZQLTask"; + String message = ""; + // 根据任务类型获取对应的任务操作类 + AbstractTask abstractTask = taskFactory.getTask(processing_class); + // 调用每个任务类的method_name()强制结束方法 + JSONObject result; + switch (method_name) { + case "immediateNotifyAcs": + // + break; + case "forceFinish": // 强制完成 + abstractTask.forceFinish(task_code); + break; + case "cancel": + abstractTask.cancel(task_code); + break; + default: + break; + } + } + } diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/AbstractTask.java b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/AbstractTask.java index ac2e2a3..674ed4b 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/AbstractTask.java +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/AbstractTask.java @@ -1,18 +1,24 @@ package org.nl.wms.sch.task_manage; import cn.hutool.core.lang.Assert; -import cn.hutool.core.util.StrUtil; -import com.alibaba.fastjson.JSON; +import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; -import org.nl.config.SpringContextHolder; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import org.nl.common.exception.BadRequestException; +import org.nl.common.utils.SecurityUtils; +import org.nl.wms.pdm.service.IPdmBdWorkorderService; +import org.nl.wms.pdm.service.dao.PdmBdWorkorder; +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.service.impl.SchBaseTaskServiceImpl; -import org.nl.wms.sch.task.service.impl.SchBaseTaskconfigServiceImpl; +import org.nl.wms.sch.task_manage.enums.TaskDirectionEnum; import org.nl.wms.sch.task_manage.task.AcsUtil; import org.nl.wms.sch.task_manage.task.core.TaskStatus; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; import java.util.ArrayList; import java.util.List; @@ -23,16 +29,22 @@ import java.util.List; * @date 2023年05月16日 16:42 * @desc desc */ - +@Component public abstract class AbstractTask { @Autowired private ISchBaseTaskService taskService; + @Autowired + private ISchBaseTaskconfigService taskConfigService; + @Autowired + private ISchBasePointService pointService; + @Autowired + private IPdmBdWorkorderService workorderService; /** * 任务创建 * 根据配置生成任务,如并发控制等 */ - protected abstract void create(); + protected abstract void create() throws BadRequestException; /** * 下发 @@ -116,7 +128,7 @@ public abstract class AbstractTask { } private AcsTaskDto setTask(String config_code, AcsTaskDto taskDto) { - SchBaseTaskconfig taskConfig = SpringContextHolder.getBean(SchBaseTaskconfigServiceImpl.class).getById(config_code); + SchBaseTaskconfig taskConfig = taskConfigService.getById(config_code); taskDto.setPriority(taskConfig.getPriority()); taskDto.setTask_type(taskConfig.getAcs_task_type()); taskDto.setRoute_plan_code("normal"); @@ -140,7 +152,7 @@ public abstract class AbstractTask { } - protected abstract void updateStatus(String config_code, TaskStatus status); + protected abstract void updateStatus(String task_code, TaskStatus status); /** * 寻找合适的点位 @@ -150,34 +162,98 @@ public abstract class AbstractTask { protected abstract List findPoints(); - public void apply(JSONObject param) { - String point_code = ""; - String config_code = "HNMLTask"; - //1、校验数据 - SchBaseTaskconfig taskConfig = SpringContextHolder.getBean(SchBaseTaskconfigServiceImpl.class).getById(config_code); - Integer tcmn = taskConfig.getTask_create_max_num(); - SchBaseTaskServiceImpl taskService = SpringContextHolder.getBean(SchBaseTaskServiceImpl.class); - List unFinishTasksByTaskConfig = taskService.findUnFinishTasksByTaskConfig(taskConfig.getConfig_code()); - - Assert.isFalse(unFinishTasksByTaskConfig.size() > tcmn, "该点位申请的任务未完成数已超过上限,无法申请任务"); - - - SchBaseTask task = new SchBaseTask(); - task.setAcs_trace_id(""); - task.setConfig_code(config_code); - task.setCreate_id(""); - task.setCreate_mode(""); - task.setPoint_code1(""); - task.setVehicle_code(""); - task.setTask_status(TaskStatus.APPLY.getCode()); - SpringContextHolder.getBean(SchBaseTaskServiceImpl.class).create(task); - //1、如果是送料,检测载具状态 - //2、送空载具 - //3、叫料 - //4、叫空载具 - - //校验 + /** + * 设置起点或者终点 + * + * @param taskConfig + * @param task + * @param apply_point_code + */ + protected void setTaskPoint(SchBaseTaskconfig taskConfig, SchBaseTask task, String apply_point_code) { + String taskDirection = taskConfig.getTask_direction(); + if (TaskDirectionEnum.SEND.getValue().equals(taskDirection)) { + task.setPoint_code1(apply_point_code); + } else { + task.setPoint_code2(apply_point_code); + } } + /** + * @param task_code 任务标识 + * @return + * @discription 强制结束完成任务 + * @author ldjun + * @created 2020年6月19日 上午10:34:58 + */ + public abstract void forceFinish(String task_code); + + /** + * 取消任务,货物搬回原点 + * + * @param task_code + */ + public abstract void cancel(String task_code); + + + /** + * 申请任务 + * + * @param param + * @throws BadRequestException + */ + public void apply(JSONObject param) throws BadRequestException { + // 申请任务 + SchBaseTask task = new SchBaseTask(); // 任务实体 + String apply_point_code = param.getString("device_code"); + String config_code = "YZQLTask"; + // 1、校验数据 + SchBaseTaskconfig taskConfig = taskConfigService.getById(config_code); + // 最大任务数 + Integer tcmn = taskConfig.getTask_create_max_num(); + List unFinishTasksByTaskConfig = taskService + .findUnFinishTasksByTaskConfig(taskConfig.getConfig_code(), apply_point_code, taskConfig.getTask_direction()); + + Assert.isFalse(unFinishTasksByTaskConfig.size() >= tcmn, "该点位申请的任务未完成数已超过上限,无法申请任务"); + // 获取设备 + SchBasePoint pointObj = pointService.getOne(new LambdaQueryWrapper().eq(SchBasePoint::getPoint_code, apply_point_code)); + // 判断是否校验工单 + if (taskConfig.getIs_check_workorder()) { + // 校验工单 + // 根据设备的父点位编码找到工单设备 + SchBasePoint one = pointService + .getOne(new LambdaQueryWrapper().eq(SchBasePoint::getPoint_code, pointObj.getParent_point_code())); + // 查找当前设备、生产中、 + PdmBdWorkorder workorder = workorderService.getOne(new LambdaQueryWrapper() + .eq(PdmBdWorkorder::getPoint_code, one.getPoint_code()) + .eq(PdmBdWorkorder::getWorkorder_status, "3")); + if (ObjectUtil.isEmpty(workorder)) { + throw new BadRequestException("当前设备工单未生产!"); + } + // 将组盘所需的数据装成jsonObject跟着任务走 + param.put("material_id", workorder.getMaterial_id()); // 物料标识 + param.put("standing_time", workorder.getStanding_time()); // 静置时间 + param.put("workorder_code", workorder.getWorkorder_code()); // 静置时间 + param.put("vehicle_type", workorder.getVehicle_type()); // 载具类型 + // 设置任务数据 + task.setVehicle_type(workorder.getVehicle_type()); + } + // 2、创建申请任务 + task.setAcs_trace_id(""); + task.setConfig_code(config_code); + task.setCreate_id(SecurityUtils.getCurrentUserId()); + task.setCreate_mode(""); + task.setVehicle_code(param.getString("vehicle_code")); + task.setTask_status(TaskStatus.APPLY.getCode()); + // 设置起/终点 + this.setTaskPoint(taskConfig, task, apply_point_code); + task.setExt_group_data(JSONObject.toJSONString(param)); + taskService.create(task); + + // 3、判断是否直接找点下发 + if (taskConfig.getIs_immediate_create()) { + this.create(); + } + } + } diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/AutoCreateTask.java b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/AutoCreateTask.java index 27e829c..b0d2197 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/AutoCreateTask.java +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/AutoCreateTask.java @@ -4,6 +4,7 @@ package org.nl.wms.sch.task_manage; import cn.hutool.core.util.ObjectUtil; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; +import org.nl.config.SpringContextHolder; import org.reflections.Reflections; import org.springframework.stereotype.Component; @@ -38,7 +39,10 @@ public class AutoCreateTask { subTypes.forEach(clz -> { // 调用AbstractAcsTask类的每个子类的schedule()方法 try { - Object obj = clz.newInstance(); + Object obj = SpringContextHolder.getBean(clz); +// if (ObjectUtil.isEmpty(obj)) { // 如果spring中获取不到,就用newInstance创建 +// obj = clz.newInstance(); +// } //Method m = obj.getClass().getDeclaredMethod("schedule"); Method m = obj.getClass().getMethod("schedule"); List tasks = (List) m.invoke(obj); diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/enums/GroupBindMaterialStatusEnum.java b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/enums/GroupBindMaterialStatusEnum.java new file mode 100644 index 0000000..4415856 --- /dev/null +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/enums/GroupBindMaterialStatusEnum.java @@ -0,0 +1,42 @@ +package org.nl.wms.sch.task_manage.enums; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import lombok.Getter; +import org.nl.config.SpringContextHolder; +import org.nl.system.service.dict.dao.Dict; +import org.nl.system.service.dict.impl.SysDictServiceImpl; + +import java.util.List; + +/** + * @Author: lyd + * @Description: 组盘绑定物料状态枚举 + * @Date: 2023/5/25 + */ +@Getter +public enum GroupBindMaterialStatusEnum { + /** + * 待绑定 + */WAIT_BIND, + /** + * 已绑定 + */BOUND, + /** + * 已解绑 + */UNBOUND; + + private String value; + private String label; + + static { + SysDictServiceImpl bean = SpringContextHolder.getBean(SysDictServiceImpl.class); + List taskDirection = bean.list(new LambdaQueryWrapper() + .eq(Dict::getCode, "group_bind_material_status") + .orderByAsc(Dict::getDict_sort)); + GroupBindMaterialStatusEnum[] values = GroupBindMaterialStatusEnum.values(); + for (int i = 0; i < values.length; i++) { + values[i].value = taskDirection.get(i).getValue(); + values[i].label = taskDirection.get(i).getLabel(); + } + } +} diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/enums/GroupStatusEnum.java b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/enums/GroupStatusEnum.java new file mode 100644 index 0000000..1e0c579 --- /dev/null +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/enums/GroupStatusEnum.java @@ -0,0 +1,23 @@ +package org.nl.wms.sch.task_manage.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * @Author: lyd + * @Description: 组盘状态枚举 + * @Date: 2023/5/24 + */ +@Getter +@AllArgsConstructor +public enum GroupStatusEnum { + OUT_SYSTEM("1", "系统外"), + IN_STORAGE("2", "存储中"), + IN_PROCESS("3", "处理中"), + IN_CARRY("4", "搬运中"), + DISCHARGE_MATERIAL("5", "可放料"), + CABLE_RETRIEVABLE_MATERIAL("6", "可取料"); + + private final String type; + private final String name; +} diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/enums/PointStatusEnum.java b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/enums/PointStatusEnum.java new file mode 100644 index 0000000..b324f18 --- /dev/null +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/enums/PointStatusEnum.java @@ -0,0 +1,21 @@ +package org.nl.wms.sch.task_manage.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * @Author: lyd + * @Description: + * @Date: 2023/5/25 + */ +@Getter +@AllArgsConstructor +public enum PointStatusEnum { + + EMPTY_POINT("1", "空位"), + FULL_POINT("2", "有料"), + EMPTY_VEHICLE("3", "空载具"); + + private final String value; + private final String label; +} diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/enums/TaskDirectionEnum.java b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/enums/TaskDirectionEnum.java new file mode 100644 index 0000000..19a6e3e --- /dev/null +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/enums/TaskDirectionEnum.java @@ -0,0 +1,47 @@ +package org.nl.wms.sch.task_manage.enums; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import lombok.AllArgsConstructor; +import lombok.Getter; +import org.nl.config.SpringContextHolder; +import org.nl.system.service.dict.dao.Dict; +import org.nl.system.service.dict.impl.SysDictServiceImpl; + +import java.util.List; + +/** + * @Author: lyd + * @Description: 任务配置 - 任务去向枚举 + * @Date: 2023/5/25 + */ +@Getter +public enum TaskDirectionEnum { + + /** + * 送货 + */ + SEND, + /** + * 取货 + */ + CALL, + /** + * 移货 + */ + MOVE; + + private String value; + private String label; + + static { + SysDictServiceImpl bean = SpringContextHolder.getBean(SysDictServiceImpl.class); + List taskDirection = bean.list(new LambdaQueryWrapper() + .eq(Dict::getCode, "task_direction") + .orderByAsc(Dict::getDict_sort)); + TaskDirectionEnum[] values = TaskDirectionEnum.values(); + for (int i = 0; i < values.length; i++) { + values[i].value = taskDirection.get(i).getValue(); + values[i].label = taskDirection.get(i).getLabel(); + } + } +} diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/TaskFactory.java b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/TaskFactory.java index a81e91b..e14e40b 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/TaskFactory.java +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/TaskFactory.java @@ -1,7 +1,11 @@ package org.nl.wms.sch.task_manage.task; import org.nl.wms.sch.task_manage.AbstractTask; -import org.nl.wms.sch.task_manage.task.tasks.HNMLTask; +import org.nl.wms.sch.task_manage.task.tasks.hn.HNMLTask; +import org.nl.wms.sch.task_manage.task.tasks.hn.HNQKTask; +import org.nl.wms.sch.task_manage.task.tasks.yz.YZQLTask; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; /** * @author ldjun @@ -9,14 +13,25 @@ import org.nl.wms.sch.task_manage.task.tasks.HNMLTask; * @date 2023年05月16日 16:42 * @desc desc */ +@Component public class TaskFactory { + + @Autowired + private HNMLTask hnmlTask; + + @Autowired + private YZQLTask yzqlTask; + //使用 getShape 方法获取形状类型的对象 public AbstractTask getTask(String taskType) { if (taskType == null) { return null; } if (taskType.equalsIgnoreCase("HNMLTask")) { - return new HNMLTask(); + return hnmlTask; + } + if (taskType.equalsIgnoreCase("YZQLTask")) { + return yzqlTask; } return null; } diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/core/TaskStatus.java b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/core/TaskStatus.java index c4ae7c2..a6ad4c5 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/core/TaskStatus.java +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/core/TaskStatus.java @@ -5,7 +5,7 @@ public enum TaskStatus { CREATED("2", "创建完成", "创建完成"), ISSUED("3", "下发", "下发"), EXECUTING("4", "执行中", "执行中"), - FINISHED("5", "完成", "执行中"), + FINISHED("5", "完成", "完成"), CANCELED("6", "已取消", "已取消"); @@ -42,4 +42,4 @@ public enum TaskStatus { public void setDesc(String desc) { this.desc = desc; } -} \ No newline at end of file +} diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/HNMLTask.java b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/HNMLTask.java deleted file mode 100644 index 9d84892..0000000 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/HNMLTask.java +++ /dev/null @@ -1,84 +0,0 @@ -package org.nl.wms.sch.task_manage.task.tasks; - -import cn.hutool.core.util.ObjectUtil; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import org.nl.config.SpringContextHolder; -import org.nl.wms.sch.point.service.ISchBasePointService; -import org.nl.wms.sch.point.service.dao.SchBasePoint; -import org.nl.wms.sch.point.service.impl.SchBasePointServiceImpl; -import org.nl.wms.sch.task.service.ISchBaseTaskService; -import org.nl.wms.sch.task.service.dao.SchBaseTask; -import org.nl.wms.sch.task.service.dao.SchBaseTaskconfig; -import org.nl.wms.sch.task.service.impl.SchBaseTaskServiceImpl; -import org.nl.wms.sch.task.service.impl.SchBaseTaskconfigServiceImpl; -import org.nl.wms.sch.task_manage.AbstractTask; -import org.nl.wms.sch.task_manage.task.core.TaskStatus; - -import java.util.List; - -/** - * @author ldjun 混碾满料任务 - * @version 1.0 - * @date 2023年05月16日 16:44 - * @desc desc - */ -public class HNMLTask extends AbstractTask { - private static String TASK_CONFIG_CODE = "HNMLTask"; - - @Override - protected void updateStatus(String task_code, TaskStatus status) { - ISchBaseTaskService taskService = SpringContextHolder.getBean(SchBaseTaskServiceImpl.class); - taskService.updateById(null); - - } - - @Override - protected void create() { - ISchBaseTaskService taskService = SpringContextHolder.getBean(SchBaseTaskServiceImpl.class); - ISchBasePointService pointService = SpringContextHolder.getBean(SchBasePointServiceImpl.class); - List tasks = taskService.findTasksByTaskStatus(TASK_CONFIG_CODE, TaskStatus.APPLY); - - SchBaseTaskconfig taskConfig = SpringContextHolder.getBean(SchBaseTaskconfigServiceImpl.class).getById(TASK_CONFIG_CODE); - for (SchBaseTask task : tasks) { - String[] nextRegionStr = taskConfig.getNext_region_str().split(","); - - - SchBasePoint point = getSchBasePoint(pointService, nextRegionStr); - if (ObjectUtil.isEmpty(point)) continue; - - task.setPoint_code2(point.getPoint_code()); - - - taskService.update(task); - - point.setIng_task_code(task.getTask_code()); - pointService.update(point); - - //下发 - this.renotifyAcs(task); - - } - - } - - private SchBasePoint getSchBasePoint(ISchBasePointService pointService, String[] nextRegionStr) { - for (String nextRegion : nextRegionStr) { - LambdaQueryWrapper lam = new LambdaQueryWrapper<>(); - lam.eq(SchBasePoint::getRegion_code, nextRegion) - .eq(SchBasePoint::getPoint_status, "1"); - SchBasePoint p = pointService.getBaseMapper().selectOne(lam); - if (p != null) return p; - } - return null; - } - - @Override - protected void issue() { - - } - - @Override - protected List findPoints() { - return null; - } -} diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/HNQKTask.java b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/HNQKTask.java deleted file mode 100644 index 5429c90..0000000 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/HNQKTask.java +++ /dev/null @@ -1,6 +0,0 @@ -package org.nl.wms.sch.task_manage.task.tasks;/** -* @Author: lyd -* @Description: -* @Date: 2023/5/19 -*/public class HNQKTask { -} diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/hn/HNMLTask.java b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/hn/HNMLTask.java new file mode 100644 index 0000000..2faeec2 --- /dev/null +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/hn/HNMLTask.java @@ -0,0 +1,206 @@ +package org.nl.wms.sch.task_manage.task.tasks.hn; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import lombok.Data; +import org.nl.common.enums.wms.PointStatusEnum; +import org.nl.common.exception.BadRequestException; +import org.nl.wms.sch.group.service.ISchBaseVehiclematerialgroupService; +import org.nl.wms.sch.group.service.dao.SchBaseVehiclematerialgroup; +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.enums.GroupStatusEnum; +import org.nl.wms.sch.task_manage.task.core.TaskStatus; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.math.BigDecimal; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +/** + * @author ldjun 混碾满料任务 + * @version 1.0 + * @date 2023年05月16日 16:44 + * @desc desc + */ +@Component +@Data +public class HNMLTask extends AbstractTask { + + private static String TASK_CONFIG_CODE = "HNMLTask"; + + // 空位 + private final String EMPTY_POINT = "1"; + // 有料 + private final String FULL_POINT = "2"; + // 空载具 + private final String EMPTY_VEHICLE = "3"; + @Autowired + private ISchBasePointService pointService; + @Autowired + private ISchBaseTaskService taskService; + @Autowired + private ISchBaseTaskconfigService taskConfigService; + @Autowired + private ISchBaseVehiclematerialgroupService vehiclematerialgroupService; + + @Override + protected void updateStatus(String task_code, TaskStatus status) { + // 校验任务 + SchBaseTask taskObj = taskService.getById(task_code); + if (taskObj.getTask_status().equals(TaskStatus.FINISHED.getCode())) { + throw new BadRequestException("该任务已完成!"); + } + if (taskObj.getTask_status().equals(TaskStatus.CANCELED.getCode())) { + throw new BadRequestException("该任务已取消!"); + } + // 获取参数 + String endPoint = taskObj.getPoint_code2(); // 终点 + JSONObject extGroupData = ObjectUtil.isNotEmpty(taskObj.getExt_group_data()) + ? JSONObject.parseObject(taskObj.getExt_group_data()) + : null; + // 载具编码:没有就创建一个 + String vehicle_code = ObjectUtil.isNotEmpty(taskObj.getVehicle_code()) ? taskObj.getVehicle_code() : IdUtil.getSnowflake(1, 1).nextIdStr(); + SchBaseTaskconfig configObj = taskConfigService.getById(TASK_CONFIG_CODE); + SchBasePoint endPointObj = pointService.getById(endPoint); + // 根据传来的类型去对任务进行操作 + if (status.equals(TaskStatus.EXECUTING)) { // 执行中 + taskObj.setTask_status(TaskStatus.EXECUTING.getCode()); + taskObj.setRemark("执行中"); + } + if (status.equals(TaskStatus.FINISHED)) { // 完成 + // 要把数据存到组盘表 + SchBaseVehiclematerialgroup groupEntity = new SchBaseVehiclematerialgroup(); + groupEntity.setMaterial_id(ObjectUtil.isNotEmpty(extGroupData) && ObjectUtil.isNotEmpty(extGroupData.getString("material_id")) + ? extGroupData.getString("material_id") + : ""); + groupEntity.setStanding_time(ObjectUtil.isNotEmpty(extGroupData) && ObjectUtil.isNotEmpty(extGroupData.getString("standing_time")) + ? extGroupData.getInteger("standing_time") + : 0); + groupEntity.setIs_full(ObjectUtil.isNotEmpty(extGroupData) + ? extGroupData.getBoolean("is_full") + : true); + groupEntity.setMaterial_qty(ObjectUtil.isNotEmpty(extGroupData) + ? extGroupData.getInteger("material_qty") + : 0); + groupEntity.setMaterial_weight(ObjectUtil.isNotEmpty(extGroupData) + ? extGroupData.getBigDecimal("material_weight") + : BigDecimal.valueOf(0)); + groupEntity.setWorkorder_code(ObjectUtil.isNotEmpty(extGroupData) && ObjectUtil.isNotEmpty(extGroupData.getString("workorder_code")) + ? extGroupData.getString("workorder_code") + : ""); + groupEntity.setVehicle_code(vehicle_code); + groupEntity.setVehicle_type(taskObj.getVehicle_type()); + groupEntity.setPoint_code(endPoint); + groupEntity.setPoint_name(endPointObj.getPoint_name()); + groupEntity.setPcsn(IdUtil.simpleUUID()); + groupEntity.setInstorage_time(DateUtil.now()); + groupEntity.setTask_code(taskObj.getTask_code()); + groupEntity.setGroup_status(GroupStatusEnum.IN_STORAGE.getType()); // 暂时不维护。 + groupEntity.setIs_delete(false); + vehiclematerialgroupService.create(groupEntity); + // 终点去除正在执行的任务, 设置载具编码、载具类型、载具数量 + if (ObjectUtil.isNotEmpty(endPointObj)) { + endPointObj.setIng_task_code(""); + endPointObj.setVehicle_code(vehicle_code); + endPointObj.setVehicle_type(taskObj.getVehicle_type()); + endPointObj.setVehicle_qty(1); + endPointObj.setPoint_status(PointStatusEnum.FULL_MATERIAL.getValue()); // 有料 + pointService.updateById(endPointObj); + } + taskObj.setRemark("任务完成"); + taskObj.setTask_status(TaskStatus.FINISHED.getCode()); + } + if (status.equals(TaskStatus.CANCELED)) { // 取消 + SchBasePoint one = ObjectUtil.isNotEmpty(endPoint) + ? pointService.getOne(new LambdaQueryWrapper().eq(SchBasePoint::getPoint_code, endPoint)) + : null; + if (one != null) { + one.setIng_task_code(""); + pointService.updateById(one); + } + taskObj.setRemark("任务取消"); + taskObj.setTask_status(TaskStatus.CANCELED.getCode()); + } + taskObj.setUpdate_time(DateUtil.now()); + taskService.updateById(taskObj); + + } + + /** + * 具体业务 + */ + @Override + protected void create() { // 找点+下发、 定时任务 + // 获取任务 + List tasks = taskService.findTasksByTaskStatus(TASK_CONFIG_CODE, TaskStatus.APPLY); + // 配置信息 + SchBaseTaskconfig taskConfig = taskConfigService.getById(TASK_CONFIG_CODE); + for (SchBaseTask task : tasks) { + List nextRegionStr = Arrays.stream(taskConfig.getNext_region_str().split(",")).collect(Collectors.toList()); + // 找终点 + SchBasePoint point = findNextPoint(nextRegionStr); + if (ObjectUtil.isEmpty(point)) { + task.setRemark("未找到所需点位!"); + taskService.update(task); + // 消息通知 + continue; + } + // 设置终点并修改创建成功状态 + task.setPoint_code2(point.getPoint_code()); + task.setTask_status(TaskStatus.CREATED.getCode()); + taskService.update(task); + + point.setIng_task_code(task.getTask_code()); + pointService.update(point); + + //下发 +// this.renotifyAcs(task); + } + + } + + private SchBasePoint findNextPoint(List nextRegionStr) { + LambdaQueryWrapper lam = new LambdaQueryWrapper<>(); + lam.in(SchBasePoint::getRegion_code, nextRegionStr) + .eq(SchBasePoint::getPoint_status, EMPTY_POINT) + .and(la -> la.isNull(SchBasePoint::getIng_task_code) // 当前执行的任务为空或者NULL,有数据表示锁住 + .or() + .eq(SchBasePoint::getIng_task_code, "")) + .orderByAsc(SchBasePoint::getIn_order_seq) + .orderByAsc(SchBasePoint::getPoint_code); + List schBasePoints = pointService.list(lam); + return ObjectUtil.isNotEmpty(schBasePoints) ? schBasePoints.get(0) : null; + } + + @Override + protected void issue() { + + } + + @Override + protected List findPoints() { + return null; + } + + @Override + public void forceFinish(String task_code) { + this.updateStatus(task_code, TaskStatus.FINISHED); + } + + @Override + public void cancel(String task_code) { + this.updateStatus(task_code, TaskStatus.CANCELED); + } + +} diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/hn/HNQKTask.java b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/hn/HNQKTask.java new file mode 100644 index 0000000..2c01561 --- /dev/null +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/hn/HNQKTask.java @@ -0,0 +1,139 @@ +package org.nl.wms.sch.task_manage.task.tasks.hn; + +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.wms.sch.group.service.ISchBaseVehiclematerialgroupService; +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.task.core.TaskStatus; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +/** + * @Author: lyd + * @Description: 混捻缺空:呼叫空载具 + * @Date: 2023/5/19 + */ +@Component +public class HNQKTask extends AbstractTask { + private static String TASK_CONFIG_CODE = "HNQKTask"; + + // 空位 + private final String EMPTY_POINT = "1"; + // 有料 + private final String FULL_POINT = "2"; + // 空载具 + private final String EMPTY_VEHICLE = "3"; + + @Autowired + private ISchBasePointService pointService; + @Autowired + private ISchBaseTaskService taskService; + @Autowired + private ISchBaseTaskconfigService taskConfigService; + @Autowired + private ISchBaseVehiclematerialgroupService vehiclematerialgroupService; + + /** + * 具体业务 + */ + @Override + protected void create() { + // 获取任务 + List tasks = taskService.findTasksByTaskStatus(TASK_CONFIG_CODE, TaskStatus.APPLY); + // 配置信息 + SchBaseTaskconfig taskConfig = taskConfigService.getById(TASK_CONFIG_CODE); + for (SchBaseTask task : tasks) { + List startRegionStr = Arrays.stream(taskConfig.getStart_region_str().split(",")).collect(Collectors.toList()); + // 找终点 + SchBasePoint point = findStartPoint(startRegionStr); + if (ObjectUtil.isEmpty(point)) { + task.setRemark("未找到所需点位!"); + taskService.update(task); + // 消息通知 + continue; + } + // 设置终点并修改创建成功状态 + task.setPoint_code1(point.getPoint_code()); + task.setTask_status(TaskStatus.CREATED.getCode()); + taskService.update(task); + + point.setIng_task_code(task.getTask_code()); + pointService.update(point); + + //下发 +// this.renotifyAcs(task); + } + } + + /** + * 找起点 + * @param startRegionStr + * @return + */ + private SchBasePoint findStartPoint(List startRegionStr) { + LambdaQueryWrapper lam = new LambdaQueryWrapper<>(); + lam.in(SchBasePoint::getRegion_code, startRegionStr) + .eq(SchBasePoint::getPoint_status, EMPTY_VEHICLE) + // 可添加对托盘类型的校验 + .eq(SchBasePoint::getVehicle_type, "1") + .and(la -> la.isNull(SchBasePoint::getIng_task_code) // 当前执行的任务为空或者NULL,有数据表示锁住 + .or() + .eq(SchBasePoint::getIng_task_code, "")) + .orderByAsc(SchBasePoint::getIn_order_seq) + .orderByAsc(SchBasePoint::getPoint_code); + List schBasePoints = pointService.list(lam); + return ObjectUtil.isNotEmpty(schBasePoints) ? schBasePoints.get(0) : null; + } + + @Override + protected void issue() { + + } + + @Override + protected void updateStatus(String task_code, TaskStatus status) { + // 校验任务 + SchBaseTask taskObj = taskService.getById(task_code); + if (taskObj.getTask_status().equals(TaskStatus.FINISHED.getCode())) { + throw new BadRequestException("该任务已完成!"); + } + if (taskObj.getTask_status().equals(TaskStatus.CANCELED.getCode())) { + throw new BadRequestException("该任务已取消!"); + } + // 获取参数 + String pointCode1 = taskObj.getPoint_code1(); // 获取起点 + // 获取外部参数 + JSONObject extGroupData = ObjectUtil.isNotEmpty(taskObj.getExt_group_data()) + ? JSONObject.parseObject(taskObj.getExt_group_data()) + : null; + + } + + @Override + protected List findPoints() { + return null; + } + + @Override + public void forceFinish(String task_code) { + this.updateStatus(task_code, TaskStatus.FINISHED); + } + + @Override + public void cancel(String task_code) { + this.updateStatus(task_code, TaskStatus.CANCELED); + } +} + diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/yz/YZQLTask.java b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/yz/YZQLTask.java new file mode 100644 index 0000000..e9969cf --- /dev/null +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/yz/YZQLTask.java @@ -0,0 +1,185 @@ +package org.nl.wms.sch.task_manage.task.tasks.yz; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.lang.Assert; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import lombok.extern.slf4j.Slf4j; +import org.nl.common.exception.BadRequestException; +import org.nl.wms.sch.group.service.ISchBaseVehiclematerialgroupService; +import org.nl.wms.sch.group.service.dao.SchBaseVehiclematerialgroup; +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.enums.GroupBindMaterialStatusEnum; +import org.nl.wms.sch.task_manage.task.core.TaskStatus; +import org.nl.wms.utils.PointUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +/** + * @Author: lyd + * @Description: 压制缺料任务 + * @Date: 2023/5/25 + */ +@Slf4j +@Component +public class YZQLTask extends AbstractTask { + private static String TASK_CONFIG_CODE = "YZQLTask"; + + // 空位 + private final String EMPTY_POINT = "1"; + // 有料 + private final String FULL_POINT = "2"; + // 空载具 + private final String EMPTY_VEHICLE = "3"; + @Autowired + private ISchBasePointService pointService; + @Autowired + private ISchBaseTaskService taskService; + @Autowired + private ISchBaseTaskconfigService taskConfigService; + @Autowired + private ISchBaseVehiclematerialgroupService vehiclematerialgroupService; + @Override + protected void create() throws BadRequestException { + // 获取任务 + List tasks = taskService.findTasksByTaskStatus(TASK_CONFIG_CODE, TaskStatus.APPLY); + // 配置信息 + SchBaseTaskconfig taskConfig = taskConfigService.getById(TASK_CONFIG_CODE); + for (SchBaseTask task : tasks) { + List startRegionStr = Arrays.stream(taskConfig.getStart_region_str().split(",")).collect(Collectors.toList()); + // 找起点 + String extGroupData = task.getExt_group_data(); + JSONObject jsonObject = JSONObject.parseObject(extGroupData); + SchBasePoint point = findStartPoint(startRegionStr, jsonObject); + if (ObjectUtil.isEmpty(point)) { + task.setRemark("未找到所需点位!"); + taskService.update(task); + // 消息通知 + continue; + } + // 设置起点并修改创建成功状态 + task.setPoint_code1(point.getPoint_code()); + task.setTask_status(TaskStatus.CREATED.getCode()); + task.setVehicle_code(point.getVehicle_code()); + taskService.update(task); + + point.setIng_task_code(task.getTask_code()); + pointService.update(point); + + //下发 +// this.renotifyAcs(task); + } + } + + /** + * 找起点业务:根据起点区域寻找所需点位 + * @param startRegionStr : 区域列表 + * @param extGroupData : 外部参数,包含条件所需的信息 + * @description : JSONObject获取不到就是null + * @return + */ + private SchBasePoint findStartPoint(List startRegionStr, JSONObject extGroupData) { + String materialId = extGroupData.getString("material_id"); + String vehicleType = extGroupData.getString("vehicle_type"); + int standingTime = extGroupData.getInteger("standing_time"); // 静置时间 + Assert.notNull(materialId, "物料不能为空!"); + Assert.notNull(vehicleType, "载具类型不能为空!"); + Assert.notNull(standingTime, "静置时间不能为空!"); + // 找到所需要物料的载具编号 + List list = vehiclematerialgroupService.list(new LambdaQueryWrapper() + .eq(SchBaseVehiclematerialgroup::getMaterial_id, materialId) + .eq(SchBaseVehiclematerialgroup::getVehicle_type, vehicleType) + .eq(SchBaseVehiclematerialgroup::getGroup_bind_material_status, GroupBindMaterialStatusEnum.BOUND.getValue()) + .apply("DATE_ADD(instorage_time, INTERVAL " + standingTime + " MINUTE) <= NOW()") + .orderByAsc(SchBaseVehiclematerialgroup::getPoint_code)); + // 获取第一个 + SchBaseVehiclematerialgroup vehiclematerialgroup = ObjectUtil.isNotEmpty(list) ? list.get(0) : null; + if (ObjectUtil.isEmpty(vehiclematerialgroup)) return null; + SchBasePoint one = pointService.getOne(new LambdaQueryWrapper() + .in(SchBasePoint::getRegion_code, startRegionStr) + .eq(SchBasePoint::getPoint_status, FULL_POINT) + .eq(SchBasePoint::getVehicle_code, vehiclematerialgroup.getVehicle_code()) + .eq(SchBasePoint::getVehicle_type, vehicleType)); + return one; + } + + @Override + protected void issue() { + + } + + @Override + protected void updateStatus(String task_code, TaskStatus status) { + // 校验任务 + SchBaseTask taskObj = taskService.getById(task_code); + if (taskObj.getTask_status().equals(TaskStatus.FINISHED.getCode())) { + throw new BadRequestException("该任务已完成!"); + } + if (taskObj.getTask_status().equals(TaskStatus.CANCELED.getCode())) { + throw new BadRequestException("该任务已取消!"); + } + // 获取参数 + String startPoint = taskObj.getPoint_code1(); // 起点 + JSONObject extGroupData = ObjectUtil.isNotEmpty(taskObj.getExt_group_data()) + ? JSONObject.parseObject(taskObj.getExt_group_data()) + : null; + SchBasePoint startPointObj = pointService.getById(startPoint); + // 根据传来的类型去对任务进行操作 + if (status.equals(TaskStatus.EXECUTING)) { // 执行中 + taskObj.setTask_status(TaskStatus.EXECUTING.getCode()); + taskObj.setRemark("执行中"); + } + if (status.equals(TaskStatus.FINISHED)) { // 完成 + // 任务上有载具编码 -> 获取当前载具编码的组盘信息 + SchBaseVehiclematerialgroup one = vehiclematerialgroupService.getOne(new LambdaQueryWrapper() + .eq(SchBaseVehiclematerialgroup::getVehicle_code, taskObj.getVehicle_code()) + .eq(SchBaseVehiclematerialgroup::getVehicle_type, taskObj.getVehicle_type()) + .eq(SchBaseVehiclematerialgroup::getGroup_bind_material_status, GroupBindMaterialStatusEnum.BOUND.getValue())); + // 将载具设置为已解绑 + one.setGroup_bind_material_status(GroupBindMaterialStatusEnum.UNBOUND.getValue()); + vehiclematerialgroupService.update(one); + // 释放点位,将点位设置为空位,清空数据 + if (ObjectUtil.isNotEmpty(startPointObj)) { + PointUtil.clearPoint(startPointObj); + } + // 任务修改成完成 + taskObj.setTask_status(TaskStatus.FINISHED.getCode()); + } + if (status.equals(TaskStatus.CANCELED)) { // 取消 + taskObj.setTask_status(TaskStatus.CANCELED.getCode()); + // 释放点位,起点正在执行的任务清空 + if (ObjectUtil.isNotEmpty(startPointObj)) { + startPointObj.setIng_task_code(""); + pointService.updateById(startPointObj); + } + } + taskObj.setUpdate_time(DateUtil.now()); + taskService.updateById(taskObj); + } + + @Override + protected List findPoints() { + return null; + } + + @Override + public void forceFinish(String task_code) { + this.updateStatus(task_code, TaskStatus.FINISHED); + } + + @Override + public void cancel(String task_code) { + this.updateStatus(task_code, TaskStatus.CANCELED); + } +} diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/utils/MyEventListener.java b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/utils/MyEventListener.java new file mode 100644 index 0000000..3ca2263 --- /dev/null +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/utils/MyEventListener.java @@ -0,0 +1,20 @@ +package org.nl.wms.utils; + +import org.springframework.context.ApplicationContext; +import org.springframework.context.event.ContextRefreshedEvent; +import org.springframework.context.event.EventListener; +import org.springframework.stereotype.Component; + +/** + * @Author: lyd + * @Description: 监听事件,用来debug查看bean工厂等信息 + * @Date: 2023/5/23 + */ +@Component +public class MyEventListener { + + @EventListener + public void handleContextRefresh(ContextRefreshedEvent event) { + ApplicationContext applicationContext = event.getApplicationContext(); + } +} diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/utils/PointUtil.java b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/utils/PointUtil.java index b6f25fd..4a2ede5 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/wms/utils/PointUtil.java +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/wms/utils/PointUtil.java @@ -1,6 +1,11 @@ package org.nl.wms.utils; +import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONObject; +import org.nl.config.SpringContextHolder; +import org.nl.wms.sch.point.service.dao.SchBasePoint; +import org.nl.wms.sch.point.service.impl.SchBasePointServiceImpl; +import org.nl.wms.sch.task_manage.enums.PointStatusEnum; /** * @Author: lyd @@ -25,4 +30,19 @@ public class PointUtil { // 设置 return statusArr.getString(label); } + + /** + * 清空点位 + * @param point + */ + public static void clearPoint(SchBasePoint point) { + SchBasePointServiceImpl pointService = SpringContextHolder.getBean(SchBasePointServiceImpl.class); + point.setPoint_status(PointStatusEnum.EMPTY_POINT.getValue()); + point.setVehicle_type(""); + point.setVehicle_code(""); + point.setIng_task_code(""); + point.setVehicle_qty(0); + point.setUpdate_time(DateUtil.now()); + pointService.updateById(point); + } } diff --git a/nladmin-system/nlsso-server/src/test/java/org/nl/enums/GetEnumOnSqlTest.java b/nladmin-system/nlsso-server/src/test/java/org/nl/enums/GetEnumOnSqlTest.java new file mode 100644 index 0000000..f979ebc --- /dev/null +++ b/nladmin-system/nlsso-server/src/test/java/org/nl/enums/GetEnumOnSqlTest.java @@ -0,0 +1,30 @@ +package org.nl.enums; + +import org.junit.jupiter.api.Test; +import org.nl.wms.sch.task_manage.enums.GroupBindMaterialStatusEnum; +import org.nl.wms.sch.task_manage.enums.TaskDirectionEnum; +import org.springframework.boot.test.context.SpringBootTest; + +/** + * @Author: lyd + * @Description: + * @Date: 2023/5/25 + */ +@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) +public class GetEnumOnSqlTest { + @Test + public void TaskDirectionEnum() { + TaskDirectionEnum[] values = TaskDirectionEnum.values(); + for (TaskDirectionEnum value : values) { + System.out.println(value.getValue() + ", " + value.getLabel()); + } + } + + @Test + public void GroupBindMaterialStatusEnum() { + GroupBindMaterialStatusEnum[] values = GroupBindMaterialStatusEnum.values(); + for (GroupBindMaterialStatusEnum value : values) { + System.out.println(value.getValue() + ", " + value.getLabel()); + } + } +} diff --git a/nladmin-ui/src/views/wms/pdm/workerorder/index.vue b/nladmin-ui/src/views/wms/pdm/workerorder/index.vue index c351347..1cb6448 100644 --- a/nladmin-ui/src/views/wms/pdm/workerorder/index.vue +++ b/nladmin-ui/src/views/wms/pdm/workerorder/index.vue @@ -249,7 +249,11 @@ prop="workorder_status" label="工单状态" :min-width="flexWidth('workorder_status',crud.data,'工单状态')" - /> + > + +