From 756438253dd9ec09dfa55edbbd42dbfe2ac19981 Mon Sep 17 00:00:00 2001 From: songxiaopeng <1393756821@qq.com> Date: Fri, 15 Mar 2024 17:56:08 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BB=BB=E5=8A=A1=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ext/service/impl/AcsToWmsServiceImpl.java | 74 +++--- .../point/service/ISchBasePointService.java | 1 + .../service/impl/SchBasePointServiceImpl.java | 28 ++- .../nl/wms/sch/task_manage/AbstractTask.java | 50 ++-- .../sch/task_manage/task/tasks/CYJKTask.java | 179 ++++++++++++++ .../sch/task_manage/task/tasks/CYXLTask.java | 231 ++++++++++++++++++ .../sch/task_manage/task/tasks/FJSLTask.java | 182 ++++++++++++++ .../sch/task_manage/task/tasks/FJXLTask.java | 225 +++++++++++++++++ .../sch/task_manage/task/tasks/LKZYTask.java | 178 ++++++++++++++ .../sch/task_manage/task/tasks/QGJKTask.java | 178 ++++++++++++++ .../sch/task_manage/task/tasks/QGXLTask.java | 225 +++++++++++++++++ .../sch/task_manage/task/tasks/ZWJKTask.java | 231 ++++++++++++++++++ .../sch/task_manage/task/tasks/ZWSLTask.java | 178 ++++++++++++++ .../sch/task_manage/task/tasks/ZWXLTask.java | 225 +++++++++++++++++ .../task/tasks/mapper/PointMapper.xml | 2 +- .../main/resources/config/application-dev.yml | 2 +- 16 files changed, 2126 insertions(+), 63 deletions(-) create mode 100644 lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/CYJKTask.java create mode 100644 lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/CYXLTask.java create mode 100644 lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/FJSLTask.java create mode 100644 lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/FJXLTask.java create mode 100644 lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/LKZYTask.java create mode 100644 lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/QGJKTask.java create mode 100644 lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/QGXLTask.java create mode 100644 lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/ZWJKTask.java create mode 100644 lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/ZWSLTask.java create mode 100644 lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/ZWXLTask.java diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext/service/impl/AcsToWmsServiceImpl.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext/service/impl/AcsToWmsServiceImpl.java index 01b0b7a..a6418d6 100644 --- a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext/service/impl/AcsToWmsServiceImpl.java +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/ext/service/impl/AcsToWmsServiceImpl.java @@ -9,6 +9,7 @@ import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang.StringUtils; import org.nl.common.exception.BadRequestException; import org.nl.system.service.logicflow.dao.Stage; import org.nl.system.service.notice.ISysNoticeService; @@ -86,30 +87,37 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { @Override public BaseResponse acsApply(JSONObject param) { - String requestNo = param.getString("requestNo"); - String requestMethodCode = param.getString("request_medthod_code"); // 获取请求方法名 - String requestMethodName = param.getString("request_medthod_name"); - BaseResponse result = BaseResponse.build(requestNo); - String device_code = param.getString("device_code"); - param.put("config_code",requestMethodCode); + String taskCode = param.getString("task_code"); + String startDeviceCode = param.getString("start_device_code"); + String nextDeviceCode = param.getString("next_device_code"); + //获取任务类型 + String taskType = param.getString("taskType"); + if (StringUtils.isEmpty(taskCode)) { + throw new BadRequestException("任务号不能为空!"); + } + if (StringUtils.isEmpty(startDeviceCode) && StringUtils.isEmpty(nextDeviceCode)) { + throw new BadRequestException("设备号不能为空!"); + } + if (ObjectUtil.isEmpty(taskType)) { + throw new BadRequestException("任务类型不能为空!"); + } + BaseResponse result = BaseResponse.build(taskCode); + param.put("config_code", taskType); try { - if(ObjectUtil.isEmpty(requestMethodCode)){ - throw new BadRequestException("任务类型不正确!requestMethodCode:"+requestMethodName+",device_code:"+device_code); - } - AbstractTask task = taskFactory.getTask(requestMethodCode); + AbstractTask task = taskFactory.getTask(taskType); // 执行创建任务 task.apply(param); } catch (Exception e) { - String message = e.getMessage(); - log.error("ACS请求LMS出现错误: {}", message); + String message = e.getMessage(); + log.error("IOT请求LMS出现错误: {}", message); result.setCode(HttpStatus.HTTP_BAD_REQUEST); result.setMessage(message); - result.setRequestNo(requestNo); + result.setRequestNo(taskCode); // 消息通知 - noticeService.createNotice("异常信息:" + message, "acsApply: " + param.getString("request_medthod_code"), + noticeService.createNotice("异常信息:" + message, "iotApply: " + param.getString("request_medthod_code"), NoticeTypeEnum.EXCEPTION.getCode()); } - return result; + return result; } /** @@ -152,7 +160,7 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { try { abstractTask.updateTaskStatus(taskObj.getTask_id(), status); } catch (Exception e) { - log.error("任务状态更新失败: {}{}", e,e.getMessage()); + log.error("任务状态更新失败: {}{}", e, e.getMessage()); return BaseResponse.responseError(requestNo, "任务:[" + taskId + "]状态更新失败," + message); } return BaseResponse.responseOk(requestNo, "任务状态反馈成功!"); @@ -165,19 +173,19 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { public BaseResponse notify(JSONObject param) { String requestNo = param.getString("requestNo"); log.info("notifyAcs - 请求参数 {}", param); - Integer type=param.getInteger("type"); + Integer type = param.getInteger("type"); String device_code = param.getString("device_code"); String state = param.getString("state"); - switch(type) { + switch (type) { case 1: //自动门反馈设备状态,将对应十个固化室工位的状态修改为传入状态 - String ghs_device_code="GHS"+device_code.substring(device_code.length()-2); - pointMapper.updatePointStatus(ghs_device_code,state); + String ghs_device_code = "GHS" + device_code.substring(device_code.length() - 2); + pointMapper.updatePointStatus(ghs_device_code, state); break; case 2: //正极板对接位反馈设备有无货 - device_code=device_code.substring(0,device_code.length()-2); - pointMapper.updatePointVehicleQty(device_code,state); + device_code = device_code.substring(0, device_code.length() - 2); + pointMapper.updatePointVehicleQty(device_code, state); break; default: break; @@ -188,7 +196,7 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { /** * 任务阶段反馈最新点位 * todo - * */ + */ @Override public BaseResponse feedbackState(JSONObject param) { @@ -196,26 +204,26 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { String taskId = param.getString("taskId"); BaseResponse result = BaseResponse.build(requestNo); try { - SchBaseTask schBaseTask=taskService.getById(taskId); - if(ObjectUtil.isEmpty(schBaseTask)){ - throw new BadRequestException("任务不存在!taskId:"+taskId); + SchBaseTask schBaseTask = taskService.getById(taskId); + if (ObjectUtil.isEmpty(schBaseTask)) { + throw new BadRequestException("任务不存在!taskId:" + taskId); } if (Integer.parseInt(schBaseTask.getTask_status()) >= Integer.parseInt(TaskStatus.FINISHED.getCode())) { throw new BadRequestException("任务已完成或已取消!"); } AbstractTask task = taskFactory.getTask(schBaseTask.getConfig_code()); // 执行创建任务 - task.feedbackState(param,schBaseTask,result); + task.feedbackState(param, schBaseTask, result); taskService.update(schBaseTask); - Map map=new HashMap<>(); - map.put("start_point",schBaseTask.getPoint_code1()); - map.put("next_point",schBaseTask.getPoint_code2()); - map.put("start_height",schBaseTask.getPoint_code1_height()); - map.put("next_height",schBaseTask.getPoint_code2_height()); + Map map = new HashMap<>(); + map.put("start_point", schBaseTask.getPoint_code1()); + map.put("next_point", schBaseTask.getPoint_code2()); + map.put("start_height", schBaseTask.getPoint_code1_height()); + map.put("next_height", schBaseTask.getPoint_code2_height()); result.setParameters(map); } catch (Exception e) { String message = e.getMessage(); - log.error("ACS请求LMS出现错误: {}{}", e.getMessage(),e); + log.error("ACS请求LMS出现错误: {}{}", e.getMessage(), e); result.setCode(HttpStatus.HTTP_BAD_REQUEST); result.setMessage(message); result.setRequestNo(requestNo); diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/point/service/ISchBasePointService.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/point/service/ISchBasePointService.java index 4e9ad65..42b66b7 100644 --- a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/point/service/ISchBasePointService.java +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/point/service/ISchBasePointService.java @@ -62,4 +62,5 @@ public interface ISchBasePointService extends IService { */ void updateStatus(JSONObject jsonObject); + SchBasePoint selectByExtPointCode(String deviceCode); } diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/point/service/impl/SchBasePointServiceImpl.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/point/service/impl/SchBasePointServiceImpl.java index 0d6afcc..c38a54f 100644 --- a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/point/service/impl/SchBasePointServiceImpl.java +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/point/service/impl/SchBasePointServiceImpl.java @@ -6,6 +6,7 @@ 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.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; @@ -31,10 +32,10 @@ import java.util.Set; import java.util.stream.Collectors; /** -* @description 服务实现 -* @author lyd -* @date 2023-05-15 -**/ + * @author lyd + * @description 服务实现 + * @date 2023-05-15 + **/ @Slf4j @Service public class SchBasePointServiceImpl extends ServiceImpl implements ISchBasePointService { @@ -46,7 +47,7 @@ public class SchBasePointServiceImpl extends ServiceImpl queryAll(Map whereJson, PageQuery page){ + public IPage queryAll(Map whereJson, PageQuery page) { String blurry = ObjectUtil.isNotEmpty(whereJson.get("blurry")) ? whereJson.get("blurry").toString() : null; String workshop_code = ObjectUtil.isNotEmpty(whereJson.get("workshop_code")) ? whereJson.get("workshop_code").toString() : null; String region_code = ObjectUtil.isNotEmpty(whereJson.get("region_code")) ? whereJson.get("region_code").toString() : null; @@ -190,14 +191,23 @@ public class SchBasePointServiceImpl extends ServiceImpl updateWrapper = new UpdateWrapper<>(); - updateWrapper.like("point_code","GHS"+device_code.substring(device_code.length()-2)); - updateWrapper.set("point_status",state); - pointMapper.update(null,updateWrapper); + updateWrapper.like("point_code", "GHS" + device_code.substring(device_code.length() - 2)); + updateWrapper.set("point_status", state); + pointMapper.update(null, updateWrapper); } } + @Override + public SchBasePoint selectByExtPointCode(String deviceCode) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(SchBasePoint::getExt_point_code,deviceCode) + .eq(SchBasePoint::getIs_used,"1"); + + return pointMapper.selectOne(queryWrapper); + } + } diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/AbstractTask.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/AbstractTask.java index 8a316fe..2ca01fb 100644 --- a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/AbstractTask.java +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/AbstractTask.java @@ -4,6 +4,7 @@ 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 org.apache.commons.lang.StringUtils; import org.nl.common.exception.BadRequestException; import org.nl.wms.database.material.service.IMdBaseMaterialService; import org.nl.wms.database.material.service.dao.MdBaseMaterial; @@ -131,11 +132,11 @@ public abstract class AbstractTask { * @param task * @param apply_point_code */ - protected void setTaskPoint(SchBaseTaskconfig taskConfig, SchBaseTask task, String apply_point_code,JSONObject param) { + protected void setTaskPoint(SchBaseTaskconfig taskConfig, SchBaseTask task, String apply_point_code, JSONObject param) { String taskDirection = taskConfig.getTask_direction(); if (TaskDirectionEnum.SEND.getValue().equals(taskDirection)) { task.setPoint_code1(apply_point_code); - } else if(TaskDirectionEnum.CALL.getValue().equals(taskDirection)) { + } else if (TaskDirectionEnum.CALL.getValue().equals(taskDirection)) { task.setPoint_code2(apply_point_code); } else { task.setPoint_code1(param.getString("start_point")); @@ -167,25 +168,36 @@ public abstract class AbstractTask { * @throws BadRequestException */ public void apply(JSONObject param) throws BadRequestException { - // 申请任务 - SchBaseTask task = new SchBaseTask(); // 任务实体 - String apply_point_code = param.getString("device_code"); // 请求点 - String config_code = param.getString("config_code"); + String startDeviceCode = param.getString("start_device_code"); + String nextDeviceCode = param.getString("next_device_code"); + SchBaseTask task = new SchBaseTask(); + // 请求点 + String applyPointCode = ""; + if (!StringUtils.isEmpty(startDeviceCode)) { + applyPointCode = startDeviceCode; + task.setPoint_code1(startDeviceCode); + } + if (!StringUtils.isEmpty(nextDeviceCode)) { + applyPointCode = nextDeviceCode; + task.setPoint_code2(nextDeviceCode); + } + String configCode = param.getString("config_code"); // 1、校验数据 SchBaseTaskconfig taskConfig = taskConfigService.getOne(new LambdaQueryWrapper() - .eq(SchBaseTaskconfig::getConfig_code, config_code)); - Assert.notNull(taskConfig, "找不到配置文件,请确认[" + config_code + "]配置是否存在!"); + .eq(SchBaseTaskconfig::getConfig_code, configCode)); + Assert.notNull(taskConfig, "找不到配置文件,请确认[" + configCode + "]配置是否存在!"); // 最大任务数 - Integer tcmn = taskConfig.getTask_create_max_num(); + Integer maxNum = taskConfig.getTask_create_max_num(); // 获取执行中的任务 List unFinishTasksByTaskConfig = taskService.findUnFinishTasksByTaskConfig( - taskConfig.getConfig_code(), apply_point_code, taskConfig.getTask_direction()); + taskConfig.getConfig_code(), applyPointCode, taskConfig.getTask_direction()); - Assert.isFalse(unFinishTasksByTaskConfig.size() >= tcmn, + Assert.isFalse(unFinishTasksByTaskConfig.size() >= maxNum, "该点位申请的任务未完成数已超过上限,无法申请任务"); // 获取对接位点位对象 SchBasePoint pointObj = pointService.getOne(new LambdaQueryWrapper() - .eq(SchBasePoint::getPoint_code, apply_point_code)); + .eq(SchBasePoint::getPoint_code, applyPointCode)); + // 判断是否校验工单 if (taskConfig.getIs_check_workorder()) { // 校验工单 @@ -199,8 +211,8 @@ public abstract class AbstractTask { if (ObjectUtil.isEmpty(workorder)) { throw new BadRequestException("设备" + one.getPoint_code() + "工单未生产!"); } - MdBaseMaterial mdBaseMaterial=materialService.getOne(new LambdaQueryWrapper() - .eq(MdBaseMaterial::getMaterial_id,workorder.getMaterial_id())); + MdBaseMaterial mdBaseMaterial = materialService.getOne(new LambdaQueryWrapper() + .eq(MdBaseMaterial::getMaterial_id, workorder.getMaterial_id())); param.put("workorder_code", workorder.getWorkorder_code()); // 静置时间 // 设置任务数据 task.setVehicle_type(workorder.getVehicle_type()); @@ -212,7 +224,7 @@ public abstract class AbstractTask { } // 2、创建申请任务 task.setAcs_trace_id(param.getString("acs_trace_id")); - task.setConfig_code(config_code); + task.setConfig_code(configCode); task.setCreate_mode(param.getString("create_mode")); task.setVehicle_code(param.getString("vehicle_code")); task.setVehicle_qty(param.getInteger("vehicle_qty")); @@ -220,7 +232,7 @@ public abstract class AbstractTask { task.setTask_status(TaskStatus.APPLY.getCode()); task.setWorkshop_code(taskConfig.getWorkshop_code()); // 车间编码 // 设置起/终点 - this.setTaskPoint(taskConfig, task, apply_point_code,param); +// this.setTaskPoint(taskConfig, task, applyPointCode, param); task.setExt_group_data(JSONObject.toJSONString(param)); taskService.create(task); @@ -240,10 +252,10 @@ public abstract class AbstractTask { * @param param * @throws BadRequestException */ - public void feedbackState(JSONObject param,SchBaseTask schBaseTask, BaseResponse result) throws BadRequestException { - this.feedbackTaskState(param,schBaseTask,result); + public void feedbackState(JSONObject param, SchBaseTask schBaseTask, BaseResponse result) throws BadRequestException { + this.feedbackTaskState(param, schBaseTask, result); } - protected abstract void feedbackTaskState(JSONObject param,SchBaseTask schBaseTask,BaseResponse result); + protected abstract void feedbackTaskState(JSONObject param, SchBaseTask schBaseTask, BaseResponse result); } diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/CYJKTask.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/CYJKTask.java new file mode 100644 index 0000000..9716fbc --- /dev/null +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/CYJKTask.java @@ -0,0 +1,179 @@ +package org.nl.wms.sch.task_manage.task.tasks; + +import cn.hutool.core.date.DateUtil; +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.ext.service.WmsToAcsService; +import org.nl.wms.ext.service.dto.to.BaseResponse; +import org.nl.wms.pdm.service.IPdmBdWorkorderService; +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.GeneralDefinition; +import org.nl.wms.sch.task_manage.enums.GroupBindMaterialStatusEnum; +import org.nl.wms.sch.task_manage.enums.PointStatusEnum; +import org.nl.wms.sch.task_manage.task.TaskType; +import org.nl.wms.sch.task_manage.task.core.TaskStatus; +import org.nl.wms.sch.task_manage.task.tasks.mapper.PointMapper; +import org.nl.wms.util.PointUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Component; + +import java.util.List; + +/** + * @Author: sxp + * @Description: 冲压机叫空盘 + * @Date: 2023/1/24 + */ +@Slf4j +@Component +@TaskType("CYJKTask") +@Lazy +public class CYJKTask extends AbstractTask { + private static String TASK_CONFIG_CODE = "CYJKTask"; + /** + * 入口 + */ + private static String ENTRANCE = "1"; + @Autowired + private ISchBasePointService pointService; + @Autowired + private ISchBaseTaskService taskService; + @Autowired + private ISchBaseTaskconfigService taskConfigService; + @Autowired + private IPdmBdWorkorderService workorderService; + @Autowired + private ISchBaseVehiclematerialgroupService vehiclematerialgroupService; + @Autowired + private PointMapper pointMapper; + @Autowired + private WmsToAcsService wmsToAcsService; + + @Override +// @Transactional(rollbackFor = Exception.class) + protected void create() throws BadRequestException { + // 获取任务 + List tasks = taskService.findTasksByTaskStatus(TASK_CONFIG_CODE, TaskStatus.APPLY); + // 配置信息 + SchBaseTaskconfig taskConfig = taskConfigService.getOne(new LambdaQueryWrapper() + .eq(SchBaseTaskconfig::getConfig_code, TASK_CONFIG_CODE)); + for (SchBaseTask task : tasks) { + SchBasePoint point = findStartPoint(taskConfig.getStart_region_str()); + if (ObjectUtil.isEmpty(point)) { + task.setRemark("未找到所需点位!"); + taskService.update(task); + // 消息通知 + log.info("冲压机叫空盘未找到所需点位!"); + continue; + } + // 设置起点并修改创建成功状态 + task.setPoint_code1(point.getPoint_code()); + task.setTask_status(TaskStatus.CREATED.getCode()); + task.setRemark(""); + taskService.update(task); + //发起任务时先把点位占用,防止发起重复任务 + point.setIng_task_code(task.getTask_code()); + point.setUpdate_id(GeneralDefinition.ACS_ID); + point.setUpdate_name(GeneralDefinition.ACS_NAME); + point.setUpdate_time(DateUtil.now()); + pointService.update(point); + //下发 + this.renotifyAcs(task); + } + } + + //查找空托盘 + private SchBasePoint findStartPoint(String startRegionStr) { + LambdaQueryWrapper lam = new LambdaQueryWrapper<>(); + lam.in(SchBasePoint::getRegion_code, startRegionStr) + .eq(SchBasePoint::getPoint_status, PointStatusEnum.EMPTY_VEHICLE.getCode()) + .and(la -> la.isNull(SchBasePoint::getIng_task_code) + .or() + .eq(SchBasePoint::getIng_task_code, "")) + .eq(SchBasePoint::getIs_used, true); + List schBasePoints = pointService.list(lam); + return ObjectUtil.isNotEmpty(schBasePoints) ? schBasePoints.get(0) : null; + } + + + @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(); // 获取起点 + String endPoint = taskObj.getPoint_code2(); // 获取终点 + SchBasePoint startPointObj = pointService.getById(startPoint); + SchBasePoint endPointObj = pointService.getById(endPoint); + // 根据传来的类型去对任务进行操作 + if (status.equals(TaskStatus.EXECUTING)) { // 执行中 + taskObj.setTask_status(TaskStatus.EXECUTING.getCode()); + taskObj.setRemark("执行中"); + } + if (status.equals(TaskStatus.FINISHED)) { // 完成 + // 终点解锁 + endPointObj.setIng_task_code(""); + endPointObj.setVehicle_code(taskObj.getVehicle_code()); + endPointObj.setVehicle_code2(taskObj.getVehicle_code2()); + endPointObj.setVehicle_qty(1); + endPointObj.setUpdate_time(DateUtil.now()); + pointService.update(endPointObj); + // 起点清空 + startPointObj.setVehicle_code(""); + startPointObj.setVehicle_code2(""); + startPointObj.setIng_task_code(""); + startPointObj.setUpdate_time(DateUtil.now()); + pointService.updateById(startPointObj); + // 任务完成 + taskObj.setTask_status(TaskStatus.FINISHED.getCode()); + taskObj.setRemark("任务完成"); + } + if (status.equals(TaskStatus.CANCELED)) { // 取消 + // 终点解锁 + if (ObjectUtil.isNotEmpty(endPointObj)) { + endPointObj.setIng_task_code(""); + pointService.update(endPointObj); + } + // 起点解锁 + if (ObjectUtil.isNotEmpty(startPointObj)) { + startPointObj.setIng_task_code(""); + pointService.update(startPointObj); + } + taskObj.setRemark("任务取消"); + taskObj.setTask_status(TaskStatus.CANCELED.getCode()); + } + taskService.update(taskObj); + } + + @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); + } + + @Override + protected void feedbackTaskState(JSONObject param, SchBaseTask schBaseTask, BaseResponse result) { + //该场景无需重算等待点 + } +} diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/CYXLTask.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/CYXLTask.java new file mode 100644 index 0000000..38d5597 --- /dev/null +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/CYXLTask.java @@ -0,0 +1,231 @@ +package org.nl.wms.sch.task_manage.task.tasks; + +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 freemarker.template.utility.StringUtil; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang.StringUtils; +import org.nl.common.exception.BadRequestException; +import org.nl.wms.ext.service.AcsToWmsService; +import org.nl.wms.ext.service.dto.to.BaseResponse; +import org.nl.wms.pdm.service.IPdmBdWorkorderService; +import org.nl.wms.pdm.service.dao.PdmBdWorkorder; +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.enums.GroupStatusEnum; +import org.nl.wms.sch.task_manage.enums.PointStatusEnum; +import org.nl.wms.sch.task_manage.task.TaskType; +import org.nl.wms.sch.task_manage.task.core.TaskStatus; +import org.nl.wms.sch.task_manage.task.tasks.mapper.PointMapper; +import org.nl.wms.util.PointUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.math.BigDecimal; +import java.util.Arrays; +import java.util.List; + +/** + * @Author: sxp + * @Description: 冲压下料 + * @Date: 2024/3/11 + */ +@Slf4j +@Component +@TaskType("CYXLTask") +@Lazy +public class CYXLTask extends AbstractTask { + private static String TASK_CONFIG_CODE = "CYXLTask"; + /** + * 入口 + */ + private static String ENTRANCE = "1"; + @Autowired + private ISchBasePointService pointService; + @Autowired + private ISchBaseTaskService taskService; + @Autowired + private ISchBaseTaskconfigService taskConfigService; + @Autowired + private IPdmBdWorkorderService workorderService; + @Autowired + private ISchBaseVehiclematerialgroupService vehiclematerialgroupService; + + @Override + protected void create() throws BadRequestException { + List tasks = taskService.findTasksByTaskStatus(TASK_CONFIG_CODE, TaskStatus.APPLY); + SchBaseTaskconfig taskConfig = taskConfigService.getOne(new LambdaQueryWrapper() + .eq(SchBaseTaskconfig::getConfig_code, TASK_CONFIG_CODE)); + for (SchBaseTask task : tasks) { + SchBasePoint point = findNextPoint(taskConfig.getNext_region_str()); + if (ObjectUtil.isEmpty(point)) { + task.setRemark("未找到所需点位!"); + taskService.update(task); + log.info("冲压下料入库未找到当前符合条件的点位!"); + continue; + } + task.setPoint_code2(point.getPoint_code()); + task.setTask_status(TaskStatus.CREATED.getCode()); + task.setRemark(""); + taskService.update(task); + //发起任务时先把点位占用,防止发起重复任务 + point.setIng_task_code(task.getTask_code()); + pointService.update(point); + this.renotifyAcs(task); + } + } + + /** + * 判断目标点位 + * + * @return + */ + private SchBasePoint findNextPoint(String nextReginStr) { + //todo 区域优先级 + String[] reginList = nextReginStr.split(","); + LambdaQueryWrapper lam = new LambdaQueryWrapper<>(); + lam.in(SchBasePoint::getRegion_code, Arrays.asList(reginList)) + .eq(SchBasePoint::getPoint_status, PointStatusEnum.EMPTY_POINT.getCode()) + .and(la -> la.isNull(SchBasePoint::getIng_task_code) // 当前执行的任务为空或者NULL,有数据表示锁住 + .or() + .eq(SchBasePoint::getIng_task_code, "")) + .eq(SchBasePoint::getIs_used, true) + .orderByAsc(SchBasePoint::getIn_order_seq) + .orderByAsc(SchBasePoint::getPoint_code); + List schBasePoints = pointService.list(lam); + for (SchBasePoint schBasePoint : schBasePoints) { + if (schBasePoint.getVehicle_qty() == 0) { + log.info("冲压下料入库找到当前符合条件的点位{}", schBasePoint.getPoint_code()); + return schBasePoint; + } + } + return null; + } + + @Override +// @Transactional(rollbackFor = Exception.class) + 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("该任务已取消!"); + } + // 获取参数 + 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(); +// PdmBdWorkorder workorderCode = null; +// if (extGroupData != null) { +// workorderCode = ObjectUtil.isNotEmpty(extGroupData.getString("workorder_code")) +// ? workorderService.getOne(new LambdaQueryWrapper() +// .eq(PdmBdWorkorder::getWorkorder_code, extGroupData.getString("workorder_code"))) +// : null; +// } + String startPoint = taskObj.getPoint_code1(); // 获取起点 + String endPoint = ObjectUtil.isNotEmpty(taskObj.getPoint_code2()) ? taskObj.getPoint_code2().substring(0, taskObj.getPoint_code2().length() - 2) : "0"; // 获取终点 + SchBasePoint startPointObj = pointService.getById(startPoint); + SchBasePoint endPointObj = pointService.getById(endPoint); + // 根据传来的类型去对任务进行操作 + if (status.equals(TaskStatus.EXECUTING)) { // 执行中 + taskObj.setTask_status(TaskStatus.EXECUTING.getCode()); + taskObj.setRemark("执行中"); + } + if (status.equals(TaskStatus.FINISHED)) { // 完成 + // 起点清空 + if (ObjectUtil.isNotEmpty(startPointObj)) { + PointUtils.clearPoint(startPointObj); + } + // 终点解锁 + endPointObj.setIng_task_code(""); + endPointObj.setVehicle_code(ObjectUtil.isEmpty(endPointObj.getVehicle_code()) ? vehicle_code + "," : endPointObj.getVehicle_code() + vehicle_code + ","); + endPointObj.setVehicle_qty(1); + pointService.update(endPointObj); + // 要把数据存到组盘表 -> 改造公共方法,返回id + + SchBaseVehiclematerialgroup groupEntity = new SchBaseVehiclematerialgroup(); + groupEntity.setGroup_id(IdUtil.getSnowflake(1, 1).nextIdStr()); + groupEntity.setCreate_id("2"); + groupEntity.setCreate_name("ACS"); + groupEntity.setCreate_time(DateUtil.now()); +// groupEntity.setMaterial_id(ObjectUtil.isNotEmpty(workorderCode) +// ? workorderCode.getMaterial_id() +// : ""); +// groupEntity.setStanding_time(ObjectUtil.isNotEmpty(workorderCode) +// ? workorderCode.getStanding_time() +// : 0); +// groupEntity.setMaterial_weight(ObjectUtil.isNotEmpty(extGroupData) +// ? extGroupData.getBigDecimal("material_qty") +// : BigDecimal.valueOf(0)); +// groupEntity.setWorkorder_code(ObjectUtil.isNotEmpty(workorderCode) +// ? workorderCode.getWorkorder_code() +// : ""); + groupEntity.setVehicle_code(vehicle_code); + groupEntity.setVehicle_type(taskObj.getVehicle_type()); + groupEntity.setPoint_code(startPoint); + groupEntity.setPoint_name(startPointObj.getPoint_name()); + groupEntity.setPcsn(DateUtil.format(DateUtil.date(), "yyyyMMdd")); + groupEntity.setInstorage_time(DateUtil.now()); + groupEntity.setTask_code(taskObj.getTask_code()); + groupEntity.setGroup_bind_material_status(GroupBindMaterialStatusEnum.BOUND.getValue()); // 绑定 + groupEntity.setGroup_status(GroupStatusEnum.IN_STORAGE.getType()); // 暂时不维护。 + groupEntity.setIs_delete(false); + groupEntity.setMove_way(startPoint); + vehiclematerialgroupService.save(groupEntity); + // 任务完成 + taskObj.setTask_status(TaskStatus.FINISHED.getCode()); + taskObj.setGroup_id(groupEntity.getGroup_id()); + taskObj.setRemark("任务完成"); + try { + //todo 入库成功后上报mes + } catch (Exception e) { + log.error("原材料入库上报MES失败{}", e.getMessage(), e); + } + } + if (status.equals(TaskStatus.CANCELED)) { // 取消 + // 终点解锁 + if (ObjectUtil.isNotEmpty(endPointObj)) { + endPointObj.setIng_task_code(""); + //任务取消把原先占用的位置释放 + pointService.update(endPointObj); + } + taskObj.setRemark("任务取消"); + taskObj.setTask_status(TaskStatus.CANCELED.getCode()); + } + taskService.update(taskObj); + } + + @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); + } + + @Override + protected void feedbackTaskState(JSONObject param, SchBaseTask schBaseTask, BaseResponse result) { + //该场景无需重算等待点 + } +} diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/FJSLTask.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/FJSLTask.java new file mode 100644 index 0000000..dc1773d --- /dev/null +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/FJSLTask.java @@ -0,0 +1,182 @@ +package org.nl.wms.sch.task_manage.task.tasks; + +import cn.hutool.core.date.DateUtil; +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.ext.service.WmsToAcsService; +import org.nl.wms.ext.service.dto.to.BaseResponse; +import org.nl.wms.pdm.service.IPdmBdWorkorderService; +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.GeneralDefinition; +import org.nl.wms.sch.task_manage.enums.GroupBindMaterialStatusEnum; +import org.nl.wms.sch.task_manage.task.TaskType; +import org.nl.wms.sch.task_manage.task.core.TaskStatus; +import org.nl.wms.sch.task_manage.task.tasks.mapper.PointMapper; +import org.nl.wms.util.PointUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Component; + +import java.util.List; + +/** + * @Author: sxp + * @Description: 分拣上料 + * @Date: 2023/1/24 + */ +@Slf4j +@Component +@TaskType("FJSLTask") +@Lazy +public class FJSLTask extends AbstractTask { + private static String TASK_CONFIG_CODE = "FJSLTask"; + /** + * 入口 + */ + private static String ENTRANCE = "1"; + @Autowired + private ISchBasePointService pointService; + @Autowired + private ISchBaseTaskService taskService; + @Autowired + private ISchBaseTaskconfigService taskConfigService; + @Autowired + private IPdmBdWorkorderService workorderService; + @Autowired + private ISchBaseVehiclematerialgroupService vehiclematerialgroupService; + @Autowired + private PointMapper pointMapper; + @Autowired + private WmsToAcsService wmsToAcsService; + + @Override +// @Transactional(rollbackFor = Exception.class) + protected void create() throws BadRequestException { + // 获取任务 + List tasks = taskService.findTasksByTaskStatus(TASK_CONFIG_CODE, TaskStatus.APPLY); + // 配置信息 + SchBaseTaskconfig taskConfig = taskConfigService.getOne(new LambdaQueryWrapper() + .eq(SchBaseTaskconfig::getConfig_code, TASK_CONFIG_CODE)); + for (SchBaseTask task : tasks) { + SchBasePoint point = findStartPoint(taskConfig.getStart_region_str()); + if (ObjectUtil.isEmpty(point)) { + task.setRemark("未找到所需点位!"); + taskService.update(task); + // 消息通知 + log.info("冲压机叫空盘未找到所需点位!"); + continue; + } + // 设置起点并修改创建成功状态 + task.setPoint_code1(point.getPoint_code()); + task.setTask_status(TaskStatus.CREATED.getCode()); + task.setRemark(""); + taskService.update(task); + //发起任务时先把点位占用,防止发起重复任务 + point.setIng_task_code(task.getTask_code()); + point.setUpdate_id(GeneralDefinition.ACS_ID); + point.setUpdate_name(GeneralDefinition.ACS_NAME); + point.setUpdate_time(DateUtil.now()); + pointService.update(point); + //下发 + this.renotifyAcs(task); + } + } + + //查找待分拣物料 + private SchBasePoint findStartPoint(String startRegionStr) { + //从待分拣货架查找 + LambdaQueryWrapper lam = new LambdaQueryWrapper<>(); + lam.in(SchBasePoint::getRegion_code, startRegionStr) + .and(la -> la.isNull(SchBasePoint::getIng_task_code) + .or() + .eq(SchBasePoint::getIng_task_code, "")) + .eq(SchBasePoint::getIs_used, true); + List schBasePoints = pointService.list(lam); + return ObjectUtil.isNotEmpty(schBasePoints) ? schBasePoints.get(0) : null; + } + + + /** + * todo 任务完成设置完成时间为开始固化时间 + */ + @Override +// @Transactional(rollbackFor = Exception.class) + 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(); // 获取起点 + String endPoint = taskObj.getPoint_code2(); // 获取终点 + SchBasePoint startPointObj = pointService.getById(startPoint); + SchBasePoint endPointObj = pointService.getById(endPoint); + // 根据传来的类型去对任务进行操作 + if (status.equals(TaskStatus.EXECUTING)) { // 执行中 + taskObj.setTask_status(TaskStatus.EXECUTING.getCode()); + taskObj.setRemark("执行中"); + } + if (status.equals(TaskStatus.FINISHED)) { // 完成 + // 终点解锁 + endPointObj.setIng_task_code(""); + endPointObj.setVehicle_code(taskObj.getVehicle_code()); + endPointObj.setVehicle_code2(taskObj.getVehicle_code2()); + endPointObj.setVehicle_qty(1); + endPointObj.setUpdate_time(DateUtil.now()); + pointService.update(endPointObj); + // 起点清空 + startPointObj.setVehicle_code(""); + startPointObj.setVehicle_code2(""); + startPointObj.setIng_task_code(""); + startPointObj.setUpdate_time(DateUtil.now()); + pointService.updateById(startPointObj); + // 任务完成 + taskObj.setTask_status(TaskStatus.FINISHED.getCode()); + taskObj.setRemark("任务完成"); + } + if (status.equals(TaskStatus.CANCELED)) { // 取消 + // 终点解锁 + if (ObjectUtil.isNotEmpty(endPointObj)) { + endPointObj.setIng_task_code(""); + pointService.update(endPointObj); + } + // 起点解锁 + if (ObjectUtil.isNotEmpty(startPointObj)) { + startPointObj.setIng_task_code(""); + pointService.update(startPointObj); + } + taskObj.setRemark("任务取消"); + taskObj.setTask_status(TaskStatus.CANCELED.getCode()); + } + taskService.update(taskObj); + } + + @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); + } + + @Override + protected void feedbackTaskState(JSONObject param, SchBaseTask schBaseTask, BaseResponse result) { + //该场景无需重算等待点 + } +} diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/FJXLTask.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/FJXLTask.java new file mode 100644 index 0000000..fe8326f --- /dev/null +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/FJXLTask.java @@ -0,0 +1,225 @@ +package org.nl.wms.sch.task_manage.task.tasks; + +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.extern.slf4j.Slf4j; +import org.apache.commons.lang.StringUtils; +import org.nl.common.exception.BadRequestException; +import org.nl.wms.ext.service.dto.to.BaseResponse; +import org.nl.wms.pdm.service.IPdmBdWorkorderService; +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.enums.GroupStatusEnum; +import org.nl.wms.sch.task_manage.enums.PointStatusEnum; +import org.nl.wms.sch.task_manage.task.TaskType; +import org.nl.wms.sch.task_manage.task.core.TaskStatus; +import org.nl.wms.util.PointUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Component; + +import java.util.Arrays; +import java.util.List; + +/** + * @Author: sxp + * @Description: 分拣下料 + * @Date: 2024/3/11 + */ +@Slf4j +@Component +@TaskType("FJXLTask") +@Lazy +public class FJXLTask extends AbstractTask { + private static String TASK_CONFIG_CODE = "FJXLTask"; + /** + * 入口 + */ + private static String ENTRANCE = "1"; + @Autowired + private ISchBasePointService pointService; + @Autowired + private ISchBaseTaskService taskService; + @Autowired + private ISchBaseTaskconfigService taskConfigService; + @Autowired + private IPdmBdWorkorderService workorderService; + @Autowired + private ISchBaseVehiclematerialgroupService vehiclematerialgroupService; + + @Override + protected void create() throws BadRequestException { + List tasks = taskService.findTasksByTaskStatus(TASK_CONFIG_CODE, TaskStatus.APPLY); + SchBaseTaskconfig taskConfig = taskConfigService.getOne(new LambdaQueryWrapper() + .eq(SchBaseTaskconfig::getConfig_code, TASK_CONFIG_CODE)); + for (SchBaseTask task : tasks) { + SchBasePoint point = findNextPoint(taskConfig.getNext_region_str()); + if (ObjectUtil.isEmpty(point)) { + task.setRemark("未找到所需点位!"); + taskService.update(task); + log.info("冲压下料入库未找到当前符合条件的点位!"); + continue; + } + task.setPoint_code2(point.getPoint_code()); + task.setTask_status(TaskStatus.CREATED.getCode()); + task.setRemark(""); + taskService.update(task); + //发起任务时先把点位占用,防止发起重复任务 + point.setIng_task_code(task.getTask_code()); + pointService.update(point); + this.renotifyAcs(task); + } + } + + /** + * 判断目标点位 + * + * @return + */ + private SchBasePoint findNextPoint(String nextReginStr) { + + String[] reginList = nextReginStr.split(","); + LambdaQueryWrapper lam = new LambdaQueryWrapper<>(); + lam.in(SchBasePoint::getRegion_code, Arrays.asList(reginList)) + .eq(SchBasePoint::getPoint_status, PointStatusEnum.EMPTY_POINT.getCode()) + .and(la -> la.isNull(SchBasePoint::getIng_task_code) // 当前执行的任务为空或者NULL,有数据表示锁住 + .or() + .eq(SchBasePoint::getIng_task_code, "")) + .eq(SchBasePoint::getIs_used, true) + .orderByAsc(SchBasePoint::getIn_order_seq) + .orderByAsc(SchBasePoint::getPoint_code); + List schBasePoints = pointService.list(lam); + for (SchBasePoint schBasePoint : schBasePoints) { + if (StringUtils.isEmpty(schBasePoint.getIng_task_code()) && schBasePoint.getVehicle_qty() == 0) { + log.info("冲压下料入库找到当前符合条件的点位{}", schBasePoint.getPoint_code()); + return schBasePoint; + } + } + return null; + } + + @Override +// @Transactional(rollbackFor = Exception.class) + 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("该任务已取消!"); + } + // 获取参数 + 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(); +// PdmBdWorkorder workorderCode = null; +// if (extGroupData != null) { +// workorderCode = ObjectUtil.isNotEmpty(extGroupData.getString("workorder_code")) +// ? workorderService.getOne(new LambdaQueryWrapper() +// .eq(PdmBdWorkorder::getWorkorder_code, extGroupData.getString("workorder_code"))) +// : null; +// } + String startPoint = taskObj.getPoint_code1(); // 获取起点 + String endPoint = ObjectUtil.isNotEmpty(taskObj.getPoint_code2()) ? taskObj.getPoint_code2().substring(0, taskObj.getPoint_code2().length() - 2) : "0"; // 获取终点 + SchBasePoint startPointObj = pointService.getById(startPoint); + SchBasePoint endPointObj = pointService.getById(endPoint); + // 根据传来的类型去对任务进行操作 + if (status.equals(TaskStatus.EXECUTING)) { // 执行中 + taskObj.setTask_status(TaskStatus.EXECUTING.getCode()); + taskObj.setRemark("执行中"); + } + if (status.equals(TaskStatus.FINISHED)) { // 完成 + // 起点清空 + if (ObjectUtil.isNotEmpty(startPointObj)) { + PointUtils.clearPoint(startPointObj); + } + // 终点解锁 + endPointObj.setIng_task_code(""); + endPointObj.setVehicle_code(ObjectUtil.isEmpty(endPointObj.getVehicle_code()) ? vehicle_code + "," : endPointObj.getVehicle_code() + vehicle_code + ","); + endPointObj.setVehicle_qty(1); + pointService.update(endPointObj); + // 要把数据存到组盘表 -> 改造公共方法,返回id + //todo 组盘表需要关联外部mes晶棒数据,一对多 + SchBaseVehiclematerialgroup groupEntity = new SchBaseVehiclematerialgroup(); + groupEntity.setGroup_id(IdUtil.getSnowflake(1, 1).nextIdStr()); + groupEntity.setCreate_id("2"); + groupEntity.setCreate_name("ACS"); + groupEntity.setCreate_time(DateUtil.now()); +// groupEntity.setMaterial_id(ObjectUtil.isNotEmpty(workorderCode) +// ? workorderCode.getMaterial_id() +// : ""); +// groupEntity.setStanding_time(ObjectUtil.isNotEmpty(workorderCode) +// ? workorderCode.getStanding_time() +// : 0); +// groupEntity.setMaterial_weight(ObjectUtil.isNotEmpty(extGroupData) +// ? extGroupData.getBigDecimal("material_qty") +// : BigDecimal.valueOf(0)); +// groupEntity.setWorkorder_code(ObjectUtil.isNotEmpty(workorderCode) +// ? workorderCode.getWorkorder_code() +// : ""); + groupEntity.setVehicle_code(vehicle_code); + groupEntity.setVehicle_type(taskObj.getVehicle_type()); + groupEntity.setPoint_code(startPoint); + groupEntity.setPoint_name(startPointObj.getPoint_name()); + groupEntity.setPcsn(DateUtil.format(DateUtil.date(), "yyyyMMdd")); + groupEntity.setInstorage_time(DateUtil.now()); + groupEntity.setTask_code(taskObj.getTask_code()); + groupEntity.setGroup_bind_material_status(GroupBindMaterialStatusEnum.BOUND.getValue()); // 绑定 + groupEntity.setGroup_status(GroupStatusEnum.IN_STORAGE.getType()); // 暂时不维护。 + groupEntity.setIs_delete(false); + groupEntity.setMove_way(startPoint); + vehiclematerialgroupService.save(groupEntity); + // 任务完成 + taskObj.setTask_status(TaskStatus.FINISHED.getCode()); + taskObj.setGroup_id(groupEntity.getGroup_id()); + taskObj.setRemark("任务完成"); + try { + //todo 入库成功后上报mes + } catch (Exception e) { + log.error("原材料入库上报MES失败{}", e.getMessage(), e); + } + } + if (status.equals(TaskStatus.CANCELED)) { // 取消 + // 终点解锁 + if (ObjectUtil.isNotEmpty(endPointObj)) { + endPointObj.setIng_task_code(""); + //任务取消把原先占用的位置释放 + pointService.update(endPointObj); + } + taskObj.setRemark("任务取消"); + taskObj.setTask_status(TaskStatus.CANCELED.getCode()); + } + taskService.update(taskObj); + } + + @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); + } + + @Override + protected void feedbackTaskState(JSONObject param, SchBaseTask schBaseTask, BaseResponse result) { + //该场景无需重算等待点 + } +} diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/LKZYTask.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/LKZYTask.java new file mode 100644 index 0000000..827da99 --- /dev/null +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/LKZYTask.java @@ -0,0 +1,178 @@ +package org.nl.wms.sch.task_manage.task.tasks; + +import cn.hutool.core.date.DateUtil; +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.ext.service.WmsToAcsService; +import org.nl.wms.ext.service.dto.to.BaseResponse; +import org.nl.wms.pdm.service.IPdmBdWorkorderService; +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.GeneralDefinition; +import org.nl.wms.sch.task_manage.task.TaskType; +import org.nl.wms.sch.task_manage.task.core.TaskStatus; +import org.nl.wms.sch.task_manage.task.tasks.mapper.PointMapper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Component; + +import java.util.List; + +/** + * @Author: sxp + * @Description: 成叠笼框转运 + * @Date: 2023/1/24 + */ +@Slf4j +@Component +@TaskType("LKZYTask") +@Lazy +public class LKZYTask extends AbstractTask { + private static String TASK_CONFIG_CODE = "LKZYTask"; + /** + * 入口 + */ + private static String ENTRANCE = "1"; + @Autowired + private ISchBasePointService pointService; + @Autowired + private ISchBaseTaskService taskService; + @Autowired + private ISchBaseTaskconfigService taskConfigService; + @Autowired + private IPdmBdWorkorderService workorderService; + @Autowired + private ISchBaseVehiclematerialgroupService vehiclematerialgroupService; + @Autowired + private PointMapper pointMapper; + @Autowired + private WmsToAcsService wmsToAcsService; + + @Override +// @Transactional(rollbackFor = Exception.class) + protected void create() throws BadRequestException { + // 获取任务 + List tasks = taskService.findTasksByTaskStatus(TASK_CONFIG_CODE, TaskStatus.APPLY); + // 配置信息 + SchBaseTaskconfig taskConfig = taskConfigService.getOne(new LambdaQueryWrapper() + .eq(SchBaseTaskconfig::getConfig_code, TASK_CONFIG_CODE)); + for (SchBaseTask task : tasks) { + SchBasePoint point = findStartPoint(taskConfig.getStart_region_str()); + if (ObjectUtil.isEmpty(point)) { + task.setRemark("未找到所需点位!"); + taskService.update(task); + // 消息通知 + log.info("冲压机叫空盘未找到所需点位!"); + continue; + } + // 设置起点并修改创建成功状态 + task.setPoint_code1(point.getPoint_code()); + task.setTask_status(TaskStatus.CREATED.getCode()); + task.setRemark(""); + taskService.update(task); + //发起任务时先把点位占用,防止发起重复任务 + point.setIng_task_code(task.getTask_code()); + point.setUpdate_id(GeneralDefinition.ACS_ID); + point.setUpdate_name(GeneralDefinition.ACS_NAME); + point.setUpdate_time(DateUtil.now()); + pointService.update(point); + //下发 + this.renotifyAcs(task); + } + } + + //查找待分拣物料 + private SchBasePoint findStartPoint(String startRegionStr) { + LambdaQueryWrapper lam = new LambdaQueryWrapper<>(); + lam.in(SchBasePoint::getRegion_code, startRegionStr) + .and(la -> la.isNull(SchBasePoint::getIng_task_code) + .or() + .eq(SchBasePoint::getIng_task_code, "")) + .eq(SchBasePoint::getIs_used, true); + List schBasePoints = pointService.list(lam); + return ObjectUtil.isNotEmpty(schBasePoints) ? schBasePoints.get(0) : null; + } + + + /** + * todo 任务完成设置完成时间为开始固化时间 + */ + @Override +// @Transactional(rollbackFor = Exception.class) + 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(); // 获取起点 + String endPoint = taskObj.getPoint_code2(); // 获取终点 + SchBasePoint startPointObj = pointService.getById(startPoint); + SchBasePoint endPointObj = pointService.getById(endPoint); + // 根据传来的类型去对任务进行操作 + if (status.equals(TaskStatus.EXECUTING)) { // 执行中 + taskObj.setTask_status(TaskStatus.EXECUTING.getCode()); + taskObj.setRemark("执行中"); + } + if (status.equals(TaskStatus.FINISHED)) { // 完成 + // 终点解锁 + endPointObj.setIng_task_code(""); + endPointObj.setVehicle_code(taskObj.getVehicle_code()); + endPointObj.setVehicle_code2(taskObj.getVehicle_code2()); + endPointObj.setVehicle_qty(1); + endPointObj.setUpdate_time(DateUtil.now()); + pointService.update(endPointObj); + // 起点清空 + startPointObj.setVehicle_code(""); + startPointObj.setVehicle_code2(""); + startPointObj.setIng_task_code(""); + startPointObj.setUpdate_time(DateUtil.now()); + pointService.updateById(startPointObj); + // 任务完成 + taskObj.setTask_status(TaskStatus.FINISHED.getCode()); + taskObj.setRemark("任务完成"); + } + if (status.equals(TaskStatus.CANCELED)) { // 取消 + // 终点解锁 + if (ObjectUtil.isNotEmpty(endPointObj)) { + endPointObj.setIng_task_code(""); + pointService.update(endPointObj); + } + // 起点解锁 + if (ObjectUtil.isNotEmpty(startPointObj)) { + startPointObj.setIng_task_code(""); + pointService.update(startPointObj); + } + taskObj.setRemark("任务取消"); + taskObj.setTask_status(TaskStatus.CANCELED.getCode()); + } + taskService.update(taskObj); + } + + @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); + } + + @Override + protected void feedbackTaskState(JSONObject param, SchBaseTask schBaseTask, BaseResponse result) { + //该场景无需重算等待点 + } +} diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/QGJKTask.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/QGJKTask.java new file mode 100644 index 0000000..fdf2c58 --- /dev/null +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/QGJKTask.java @@ -0,0 +1,178 @@ +package org.nl.wms.sch.task_manage.task.tasks; + +import cn.hutool.core.date.DateUtil; +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.ext.service.WmsToAcsService; +import org.nl.wms.ext.service.dto.to.BaseResponse; +import org.nl.wms.pdm.service.IPdmBdWorkorderService; +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.GeneralDefinition; +import org.nl.wms.sch.task_manage.task.TaskType; +import org.nl.wms.sch.task_manage.task.core.TaskStatus; +import org.nl.wms.sch.task_manage.task.tasks.mapper.PointMapper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Component; + +import java.util.List; + +/** + * @Author: sxp + * @Description: 激光切割叫空盘 + * @Date: 2023/1/24 + */ +@Slf4j +@Component +@TaskType("QGJKTask") +@Lazy +public class QGJKTask extends AbstractTask { + private static String TASK_CONFIG_CODE = "QGJKTask"; + /** + * 入口 + */ + private static String ENTRANCE = "1"; + @Autowired + private ISchBasePointService pointService; + @Autowired + private ISchBaseTaskService taskService; + @Autowired + private ISchBaseTaskconfigService taskConfigService; + @Autowired + private IPdmBdWorkorderService workorderService; + @Autowired + private ISchBaseVehiclematerialgroupService vehiclematerialgroupService; + @Autowired + private PointMapper pointMapper; + @Autowired + private WmsToAcsService wmsToAcsService; + + @Override +// @Transactional(rollbackFor = Exception.class) + protected void create() throws BadRequestException { + // 获取任务 + List tasks = taskService.findTasksByTaskStatus(TASK_CONFIG_CODE, TaskStatus.APPLY); + // 配置信息 + SchBaseTaskconfig taskConfig = taskConfigService.getOne(new LambdaQueryWrapper() + .eq(SchBaseTaskconfig::getConfig_code, TASK_CONFIG_CODE)); + for (SchBaseTask task : tasks) { + SchBasePoint point = findStartPoint(taskConfig.getStart_region_str()); + if (ObjectUtil.isEmpty(point)) { + task.setRemark("未找到所需点位!"); + taskService.update(task); + // 消息通知 + log.info("冲压机叫空盘未找到所需点位!"); + continue; + } + // 设置起点并修改创建成功状态 + task.setPoint_code1(point.getPoint_code()); + task.setTask_status(TaskStatus.CREATED.getCode()); + task.setRemark(""); + taskService.update(task); + //发起任务时先把点位占用,防止发起重复任务 + point.setIng_task_code(task.getTask_code()); + point.setUpdate_id(GeneralDefinition.ACS_ID); + point.setUpdate_name(GeneralDefinition.ACS_NAME); + point.setUpdate_time(DateUtil.now()); + pointService.update(point); + //下发 + this.renotifyAcs(task); + } + } + + //查找空托盘 + private SchBasePoint findStartPoint(String startRegionStr) { + LambdaQueryWrapper lam = new LambdaQueryWrapper<>(); + lam.in(SchBasePoint::getRegion_code, startRegionStr) + .and(la -> la.isNull(SchBasePoint::getIng_task_code) + .or() + .eq(SchBasePoint::getIng_task_code, "")) + .eq(SchBasePoint::getIs_used, true); + List schBasePoints = pointService.list(lam); + return ObjectUtil.isNotEmpty(schBasePoints) ? schBasePoints.get(0) : null; + } + + + /** + * todo 任务完成设置完成时间为开始固化时间 + */ + @Override +// @Transactional(rollbackFor = Exception.class) + 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(); // 获取起点 + String endPoint = taskObj.getPoint_code2(); // 获取终点 + SchBasePoint startPointObj = pointService.getById(startPoint); + SchBasePoint endPointObj = pointService.getById(endPoint); + // 根据传来的类型去对任务进行操作 + if (status.equals(TaskStatus.EXECUTING)) { // 执行中 + taskObj.setTask_status(TaskStatus.EXECUTING.getCode()); + taskObj.setRemark("执行中"); + } + if (status.equals(TaskStatus.FINISHED)) { // 完成 + // 终点解锁 + endPointObj.setIng_task_code(""); + endPointObj.setVehicle_code(taskObj.getVehicle_code()); + endPointObj.setVehicle_code2(taskObj.getVehicle_code2()); + endPointObj.setVehicle_qty(1); + endPointObj.setUpdate_time(DateUtil.now()); + pointService.update(endPointObj); + // 起点清空 + startPointObj.setVehicle_code(""); + startPointObj.setVehicle_code2(""); + startPointObj.setIng_task_code(""); + startPointObj.setUpdate_time(DateUtil.now()); + pointService.updateById(startPointObj); + // 任务完成 + taskObj.setTask_status(TaskStatus.FINISHED.getCode()); + taskObj.setRemark("任务完成"); + } + if (status.equals(TaskStatus.CANCELED)) { // 取消 + // 终点解锁 + if (ObjectUtil.isNotEmpty(endPointObj)) { + endPointObj.setIng_task_code(""); + pointService.update(endPointObj); + } + // 起点解锁 + if (ObjectUtil.isNotEmpty(startPointObj)) { + startPointObj.setIng_task_code(""); + pointService.update(startPointObj); + } + taskObj.setRemark("任务取消"); + taskObj.setTask_status(TaskStatus.CANCELED.getCode()); + } + taskService.update(taskObj); + } + + @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); + } + + @Override + protected void feedbackTaskState(JSONObject param, SchBaseTask schBaseTask, BaseResponse result) { + //该场景无需重算等待点 + } +} diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/QGXLTask.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/QGXLTask.java new file mode 100644 index 0000000..7a81c89 --- /dev/null +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/QGXLTask.java @@ -0,0 +1,225 @@ +package org.nl.wms.sch.task_manage.task.tasks; + +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.extern.slf4j.Slf4j; +import org.apache.commons.lang.StringUtils; +import org.nl.common.exception.BadRequestException; +import org.nl.wms.ext.service.dto.to.BaseResponse; +import org.nl.wms.pdm.service.IPdmBdWorkorderService; +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.enums.GroupStatusEnum; +import org.nl.wms.sch.task_manage.enums.PointStatusEnum; +import org.nl.wms.sch.task_manage.task.TaskType; +import org.nl.wms.sch.task_manage.task.core.TaskStatus; +import org.nl.wms.util.PointUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Component; + +import java.util.Arrays; +import java.util.List; + +/** + * @Author: sxp + * @Description: 激光切割下料 + * @Date: 2024/3/11 + */ +@Slf4j +@Component +@TaskType("QGXLTask") +@Lazy +public class QGXLTask extends AbstractTask { + private static String TASK_CONFIG_CODE = "QGXLTask"; + /** + * 入口 + */ + private static String ENTRANCE = "1"; + @Autowired + private ISchBasePointService pointService; + @Autowired + private ISchBaseTaskService taskService; + @Autowired + private ISchBaseTaskconfigService taskConfigService; + @Autowired + private IPdmBdWorkorderService workorderService; + @Autowired + private ISchBaseVehiclematerialgroupService vehiclematerialgroupService; + + @Override + protected void create() throws BadRequestException { + List tasks = taskService.findTasksByTaskStatus(TASK_CONFIG_CODE, TaskStatus.APPLY); + SchBaseTaskconfig taskConfig = taskConfigService.getOne(new LambdaQueryWrapper() + .eq(SchBaseTaskconfig::getConfig_code, TASK_CONFIG_CODE)); + for (SchBaseTask task : tasks) { + SchBasePoint point = findNextPoint(taskConfig.getNext_region_str()); + if (ObjectUtil.isEmpty(point)) { + task.setRemark("未找到所需点位!"); + taskService.update(task); + log.info("冲压下料入库未找到当前符合条件的点位!"); + continue; + } + task.setPoint_code2(point.getPoint_code()); + task.setTask_status(TaskStatus.CREATED.getCode()); + task.setRemark(""); + taskService.update(task); + //发起任务时先把点位占用,防止发起重复任务 + point.setIng_task_code(task.getTask_code()); + pointService.update(point); + this.renotifyAcs(task); + } + } + + /** + * 判断目标点位 + * + * @return + */ + private SchBasePoint findNextPoint(String nextReginStr) { + + String[] reginList = nextReginStr.split(","); + LambdaQueryWrapper lam = new LambdaQueryWrapper<>(); + lam.in(SchBasePoint::getRegion_code, Arrays.asList(reginList)) + .eq(SchBasePoint::getPoint_status, PointStatusEnum.EMPTY_POINT.getCode()) + .and(la -> la.isNull(SchBasePoint::getIng_task_code) // 当前执行的任务为空或者NULL,有数据表示锁住 + .or() + .eq(SchBasePoint::getIng_task_code, "")) + .eq(SchBasePoint::getIs_used, true) + .orderByAsc(SchBasePoint::getIn_order_seq) + .orderByAsc(SchBasePoint::getPoint_code); + List schBasePoints = pointService.list(lam); + for (SchBasePoint schBasePoint : schBasePoints) { + if (StringUtils.isEmpty(schBasePoint.getIng_task_code()) && schBasePoint.getVehicle_qty() == 0) { + log.info("冲压下料入库找到当前符合条件的点位{}", schBasePoint.getPoint_code()); + return schBasePoint; + } + } + return null; + } + + @Override +// @Transactional(rollbackFor = Exception.class) + 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("该任务已取消!"); + } + // 获取参数 + 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(); +// PdmBdWorkorder workorderCode = null; +// if (extGroupData != null) { +// workorderCode = ObjectUtil.isNotEmpty(extGroupData.getString("workorder_code")) +// ? workorderService.getOne(new LambdaQueryWrapper() +// .eq(PdmBdWorkorder::getWorkorder_code, extGroupData.getString("workorder_code"))) +// : null; +// } + String startPoint = taskObj.getPoint_code1(); // 获取起点 + String endPoint = ObjectUtil.isNotEmpty(taskObj.getPoint_code2()) ? taskObj.getPoint_code2().substring(0, taskObj.getPoint_code2().length() - 2) : "0"; // 获取终点 + SchBasePoint startPointObj = pointService.getById(startPoint); + SchBasePoint endPointObj = pointService.getById(endPoint); + // 根据传来的类型去对任务进行操作 + if (status.equals(TaskStatus.EXECUTING)) { // 执行中 + taskObj.setTask_status(TaskStatus.EXECUTING.getCode()); + taskObj.setRemark("执行中"); + } + if (status.equals(TaskStatus.FINISHED)) { // 完成 + // 起点清空 + if (ObjectUtil.isNotEmpty(startPointObj)) { + PointUtils.clearPoint(startPointObj); + } + // 终点解锁 + endPointObj.setIng_task_code(""); + endPointObj.setVehicle_code(ObjectUtil.isEmpty(endPointObj.getVehicle_code()) ? vehicle_code + "," : endPointObj.getVehicle_code() + vehicle_code + ","); + endPointObj.setVehicle_qty(1); + pointService.update(endPointObj); + // 要把数据存到组盘表 -> 改造公共方法,返回id + //todo 组盘表需要关联外部mes晶棒数据,一对多 + SchBaseVehiclematerialgroup groupEntity = new SchBaseVehiclematerialgroup(); + groupEntity.setGroup_id(IdUtil.getSnowflake(1, 1).nextIdStr()); + groupEntity.setCreate_id("2"); + groupEntity.setCreate_name("ACS"); + groupEntity.setCreate_time(DateUtil.now()); +// groupEntity.setMaterial_id(ObjectUtil.isNotEmpty(workorderCode) +// ? workorderCode.getMaterial_id() +// : ""); +// groupEntity.setStanding_time(ObjectUtil.isNotEmpty(workorderCode) +// ? workorderCode.getStanding_time() +// : 0); +// groupEntity.setMaterial_weight(ObjectUtil.isNotEmpty(extGroupData) +// ? extGroupData.getBigDecimal("material_qty") +// : BigDecimal.valueOf(0)); +// groupEntity.setWorkorder_code(ObjectUtil.isNotEmpty(workorderCode) +// ? workorderCode.getWorkorder_code() +// : ""); + groupEntity.setVehicle_code(vehicle_code); + groupEntity.setVehicle_type(taskObj.getVehicle_type()); + groupEntity.setPoint_code(startPoint); + groupEntity.setPoint_name(startPointObj.getPoint_name()); + groupEntity.setPcsn(DateUtil.format(DateUtil.date(), "yyyyMMdd")); + groupEntity.setInstorage_time(DateUtil.now()); + groupEntity.setTask_code(taskObj.getTask_code()); + groupEntity.setGroup_bind_material_status(GroupBindMaterialStatusEnum.BOUND.getValue()); // 绑定 + groupEntity.setGroup_status(GroupStatusEnum.IN_STORAGE.getType()); // 暂时不维护。 + groupEntity.setIs_delete(false); + groupEntity.setMove_way(startPoint); + vehiclematerialgroupService.save(groupEntity); + // 任务完成 + taskObj.setTask_status(TaskStatus.FINISHED.getCode()); + taskObj.setGroup_id(groupEntity.getGroup_id()); + taskObj.setRemark("任务完成"); + try { + //todo 入库成功后上报mes + } catch (Exception e) { + log.error("原材料入库上报MES失败{}", e.getMessage(), e); + } + } + if (status.equals(TaskStatus.CANCELED)) { // 取消 + // 终点解锁 + if (ObjectUtil.isNotEmpty(endPointObj)) { + endPointObj.setIng_task_code(""); + //任务取消把原先占用的位置释放 + pointService.update(endPointObj); + } + taskObj.setRemark("任务取消"); + taskObj.setTask_status(TaskStatus.CANCELED.getCode()); + } + taskService.update(taskObj); + } + + @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); + } + + @Override + protected void feedbackTaskState(JSONObject param, SchBaseTask schBaseTask, BaseResponse result) { + //该场景无需重算等待点 + } +} diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/ZWJKTask.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/ZWJKTask.java new file mode 100644 index 0000000..9687ace --- /dev/null +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/ZWJKTask.java @@ -0,0 +1,231 @@ +package org.nl.wms.sch.task_manage.task.tasks; + +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 freemarker.template.utility.StringUtil; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang.StringUtils; +import org.nl.common.exception.BadRequestException; +import org.nl.wms.ext.service.AcsToWmsService; +import org.nl.wms.ext.service.dto.to.BaseResponse; +import org.nl.wms.pdm.service.IPdmBdWorkorderService; +import org.nl.wms.pdm.service.dao.PdmBdWorkorder; +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.enums.GroupStatusEnum; +import org.nl.wms.sch.task_manage.enums.PointStatusEnum; +import org.nl.wms.sch.task_manage.task.TaskType; +import org.nl.wms.sch.task_manage.task.core.TaskStatus; +import org.nl.wms.sch.task_manage.task.tasks.mapper.PointMapper; +import org.nl.wms.util.PointUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.math.BigDecimal; +import java.util.Arrays; +import java.util.List; + +/** + * @Author: sxp + * @Description: 折弯叫空 + * @Date: 2024/3/11 + */ +@Slf4j +@Component +@TaskType("ZWJKTask") +@Lazy +public class ZWJKTask extends AbstractTask { + private static String TASK_CONFIG_CODE = "ZWJKTask"; + /** + * 入口 + */ + private static String ENTRANCE = "1"; + @Autowired + private ISchBasePointService pointService; + @Autowired + private ISchBaseTaskService taskService; + @Autowired + private ISchBaseTaskconfigService taskConfigService; + @Autowired + private IPdmBdWorkorderService workorderService; + @Autowired + private ISchBaseVehiclematerialgroupService vehiclematerialgroupService; + + @Override + protected void create() throws BadRequestException { + List tasks = taskService.findTasksByTaskStatus(TASK_CONFIG_CODE, TaskStatus.APPLY); + SchBaseTaskconfig taskConfig = taskConfigService.getOne(new LambdaQueryWrapper() + .eq(SchBaseTaskconfig::getConfig_code, TASK_CONFIG_CODE)); + for (SchBaseTask task : tasks) { + SchBasePoint point = findNextPoint(taskConfig.getNext_region_str()); + if (ObjectUtil.isEmpty(point)) { + task.setRemark("未找到所需点位!"); + taskService.update(task); + log.info("冲压下料入库未找到当前符合条件的点位!"); + continue; + } + task.setPoint_code2(point.getPoint_code()); + task.setTask_status(TaskStatus.CREATED.getCode()); + task.setRemark(""); + taskService.update(task); + //发起任务时先把点位占用,防止发起重复任务 + point.setIng_task_code(task.getTask_code()); + pointService.update(point); + this.renotifyAcs(task); + } + } + + /** + * 判断目标点位 + * + * @return + */ + private SchBasePoint findNextPoint(String nextReginStr) { + + String[] reginList = nextReginStr.split(","); + LambdaQueryWrapper lam = new LambdaQueryWrapper<>(); + lam.in(SchBasePoint::getRegion_code, Arrays.asList(reginList)) + .eq(SchBasePoint::getPoint_status, PointStatusEnum.EMPTY_POINT.getCode()) + .and(la -> la.isNull(SchBasePoint::getIng_task_code) // 当前执行的任务为空或者NULL,有数据表示锁住 + .or() + .eq(SchBasePoint::getIng_task_code, "")) + .eq(SchBasePoint::getIs_used, true) + .orderByAsc(SchBasePoint::getIn_order_seq) + .orderByAsc(SchBasePoint::getPoint_code); + List schBasePoints = pointService.list(lam); + for (SchBasePoint schBasePoint : schBasePoints) { + if (StringUtils.isEmpty(schBasePoint.getIng_task_code()) && schBasePoint.getVehicle_qty() == 0) { + log.info("冲压下料入库找到当前符合条件的点位{}", schBasePoint.getPoint_code()); + return schBasePoint; + } + } + return null; + } + + @Override +// @Transactional(rollbackFor = Exception.class) + 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("该任务已取消!"); + } + // 获取参数 + 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(); +// PdmBdWorkorder workorderCode = null; +// if (extGroupData != null) { +// workorderCode = ObjectUtil.isNotEmpty(extGroupData.getString("workorder_code")) +// ? workorderService.getOne(new LambdaQueryWrapper() +// .eq(PdmBdWorkorder::getWorkorder_code, extGroupData.getString("workorder_code"))) +// : null; +// } + String startPoint = taskObj.getPoint_code1(); // 获取起点 + String endPoint = ObjectUtil.isNotEmpty(taskObj.getPoint_code2()) ? taskObj.getPoint_code2().substring(0, taskObj.getPoint_code2().length() - 2) : "0"; // 获取终点 + SchBasePoint startPointObj = pointService.getById(startPoint); + SchBasePoint endPointObj = pointService.getById(endPoint); + // 根据传来的类型去对任务进行操作 + if (status.equals(TaskStatus.EXECUTING)) { // 执行中 + taskObj.setTask_status(TaskStatus.EXECUTING.getCode()); + taskObj.setRemark("执行中"); + } + if (status.equals(TaskStatus.FINISHED)) { // 完成 + // 起点清空 + if (ObjectUtil.isNotEmpty(startPointObj)) { + PointUtils.clearPoint(startPointObj); + } + // 终点解锁 + endPointObj.setIng_task_code(""); + endPointObj.setVehicle_code(ObjectUtil.isEmpty(endPointObj.getVehicle_code()) ? vehicle_code + "," : endPointObj.getVehicle_code() + vehicle_code + ","); + endPointObj.setVehicle_qty(1); + pointService.update(endPointObj); + // 要把数据存到组盘表 -> 改造公共方法,返回id + //todo 组盘表需要关联外部mes晶棒数据,一对多 + SchBaseVehiclematerialgroup groupEntity = new SchBaseVehiclematerialgroup(); + groupEntity.setGroup_id(IdUtil.getSnowflake(1, 1).nextIdStr()); + groupEntity.setCreate_id("2"); + groupEntity.setCreate_name("ACS"); + groupEntity.setCreate_time(DateUtil.now()); +// groupEntity.setMaterial_id(ObjectUtil.isNotEmpty(workorderCode) +// ? workorderCode.getMaterial_id() +// : ""); +// groupEntity.setStanding_time(ObjectUtil.isNotEmpty(workorderCode) +// ? workorderCode.getStanding_time() +// : 0); +// groupEntity.setMaterial_weight(ObjectUtil.isNotEmpty(extGroupData) +// ? extGroupData.getBigDecimal("material_qty") +// : BigDecimal.valueOf(0)); +// groupEntity.setWorkorder_code(ObjectUtil.isNotEmpty(workorderCode) +// ? workorderCode.getWorkorder_code() +// : ""); + groupEntity.setVehicle_code(vehicle_code); + groupEntity.setVehicle_type(taskObj.getVehicle_type()); + groupEntity.setPoint_code(startPoint); + groupEntity.setPoint_name(startPointObj.getPoint_name()); + groupEntity.setPcsn(DateUtil.format(DateUtil.date(), "yyyyMMdd")); + groupEntity.setInstorage_time(DateUtil.now()); + groupEntity.setTask_code(taskObj.getTask_code()); + groupEntity.setGroup_bind_material_status(GroupBindMaterialStatusEnum.BOUND.getValue()); // 绑定 + groupEntity.setGroup_status(GroupStatusEnum.IN_STORAGE.getType()); // 暂时不维护。 + groupEntity.setIs_delete(false); + groupEntity.setMove_way(startPoint); + vehiclematerialgroupService.save(groupEntity); + // 任务完成 + taskObj.setTask_status(TaskStatus.FINISHED.getCode()); + taskObj.setGroup_id(groupEntity.getGroup_id()); + taskObj.setRemark("任务完成"); + try { + //todo 入库成功后上报mes + } catch (Exception e) { + log.error("原材料入库上报MES失败{}", e.getMessage(), e); + } + } + if (status.equals(TaskStatus.CANCELED)) { // 取消 + // 终点解锁 + if (ObjectUtil.isNotEmpty(endPointObj)) { + endPointObj.setIng_task_code(""); + //任务取消把原先占用的位置释放 + pointService.update(endPointObj); + } + taskObj.setRemark("任务取消"); + taskObj.setTask_status(TaskStatus.CANCELED.getCode()); + } + taskService.update(taskObj); + } + + @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); + } + + @Override + protected void feedbackTaskState(JSONObject param, SchBaseTask schBaseTask, BaseResponse result) { + //该场景无需重算等待点 + } +} diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/ZWSLTask.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/ZWSLTask.java new file mode 100644 index 0000000..3cd0a98 --- /dev/null +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/ZWSLTask.java @@ -0,0 +1,178 @@ +package org.nl.wms.sch.task_manage.task.tasks; + +import cn.hutool.core.date.DateUtil; +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.ext.service.WmsToAcsService; +import org.nl.wms.ext.service.dto.to.BaseResponse; +import org.nl.wms.pdm.service.IPdmBdWorkorderService; +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.GeneralDefinition; +import org.nl.wms.sch.task_manage.task.TaskType; +import org.nl.wms.sch.task_manage.task.core.TaskStatus; +import org.nl.wms.sch.task_manage.task.tasks.mapper.PointMapper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Component; + +import java.util.List; + +/** + * @Author: sxp + * @Description: 折弯上料 + * @Date: 2023/1/24 + */ +@Slf4j +@Component +@TaskType("ZWSLTask") +@Lazy +public class ZWSLTask extends AbstractTask { + private static String TASK_CONFIG_CODE = "ZWSLTask"; + /** + * 入口 + */ + private static String ENTRANCE = "1"; + @Autowired + private ISchBasePointService pointService; + @Autowired + private ISchBaseTaskService taskService; + @Autowired + private ISchBaseTaskconfigService taskConfigService; + @Autowired + private IPdmBdWorkorderService workorderService; + @Autowired + private ISchBaseVehiclematerialgroupService vehiclematerialgroupService; + @Autowired + private PointMapper pointMapper; + @Autowired + private WmsToAcsService wmsToAcsService; + + @Override + protected void create() throws BadRequestException { + // 获取任务 + List tasks = taskService.findTasksByTaskStatus(TASK_CONFIG_CODE, TaskStatus.APPLY); + // 配置信息 + SchBaseTaskconfig taskConfig = taskConfigService.getOne(new LambdaQueryWrapper() + .eq(SchBaseTaskconfig::getConfig_code, TASK_CONFIG_CODE)); + //todo task根据请求参数指定终点 + for (SchBaseTask task : tasks) { + SchBasePoint point = findStartPoint(taskConfig.getStart_region_str()); + if (ObjectUtil.isEmpty(point)) { + task.setRemark("未找到所需点位!"); + taskService.update(task); + // 消息通知 + log.info("折弯上料未找到所需点位!"); + continue; + } + // 设置起点并修改创建成功状态 + task.setPoint_code1(point.getPoint_code()); + task.setTask_status(TaskStatus.CREATED.getCode()); + task.setRemark(""); + taskService.update(task); + //发起任务时先把点位占用,防止发起重复任务 + point.setIng_task_code(task.getTask_code()); + point.setUpdate_id(GeneralDefinition.ACS_ID); + point.setUpdate_name(GeneralDefinition.ACS_NAME); + point.setUpdate_time(DateUtil.now()); + pointService.update(point); + //下发 + this.renotifyAcs(task); + } + } + + //查找待分拣物料 todo + private SchBasePoint findStartPoint(String startRegionStr) { + LambdaQueryWrapper lam = new LambdaQueryWrapper<>(); + lam.in(SchBasePoint::getRegion_code, startRegionStr) + .and(la -> la.isNull(SchBasePoint::getIng_task_code) + .or() + .eq(SchBasePoint::getIng_task_code, "")) + .eq(SchBasePoint::getIs_used, true); + List schBasePoints = pointService.list(lam); + return ObjectUtil.isNotEmpty(schBasePoints) ? schBasePoints.get(0) : null; + } + + + /** + * todo 任务完成设置完成时间为开始固化时间 + */ + @Override +// @Transactional(rollbackFor = Exception.class) + 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(); // 获取起点 + String endPoint = taskObj.getPoint_code2(); // 获取终点 + SchBasePoint startPointObj = pointService.getById(startPoint); + SchBasePoint endPointObj = pointService.getById(endPoint); + // 根据传来的类型去对任务进行操作 + if (status.equals(TaskStatus.EXECUTING)) { // 执行中 + taskObj.setTask_status(TaskStatus.EXECUTING.getCode()); + taskObj.setRemark("执行中"); + } + if (status.equals(TaskStatus.FINISHED)) { // 完成 + // 终点解锁 + endPointObj.setIng_task_code(""); + endPointObj.setVehicle_code(taskObj.getVehicle_code()); + endPointObj.setVehicle_code2(taskObj.getVehicle_code2()); + endPointObj.setVehicle_qty(1); + endPointObj.setUpdate_time(DateUtil.now()); + pointService.update(endPointObj); + // 起点清空 + startPointObj.setVehicle_code(""); + startPointObj.setVehicle_code2(""); + startPointObj.setIng_task_code(""); + startPointObj.setUpdate_time(DateUtil.now()); + pointService.updateById(startPointObj); + // 任务完成 + taskObj.setTask_status(TaskStatus.FINISHED.getCode()); + taskObj.setRemark("任务完成"); + } + if (status.equals(TaskStatus.CANCELED)) { // 取消 + // 终点解锁 + if (ObjectUtil.isNotEmpty(endPointObj)) { + endPointObj.setIng_task_code(""); + pointService.update(endPointObj); + } + // 起点解锁 + if (ObjectUtil.isNotEmpty(startPointObj)) { + startPointObj.setIng_task_code(""); + pointService.update(startPointObj); + } + taskObj.setRemark("任务取消"); + taskObj.setTask_status(TaskStatus.CANCELED.getCode()); + } + taskService.update(taskObj); + } + + @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); + } + + @Override + protected void feedbackTaskState(JSONObject param, SchBaseTask schBaseTask, BaseResponse result) { + //该场景无需重算等待点 + } +} diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/ZWXLTask.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/ZWXLTask.java new file mode 100644 index 0000000..d474907 --- /dev/null +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/ZWXLTask.java @@ -0,0 +1,225 @@ +package org.nl.wms.sch.task_manage.task.tasks; + +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.extern.slf4j.Slf4j; +import org.apache.commons.lang.StringUtils; +import org.nl.common.exception.BadRequestException; +import org.nl.wms.ext.service.dto.to.BaseResponse; +import org.nl.wms.pdm.service.IPdmBdWorkorderService; +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.enums.GroupStatusEnum; +import org.nl.wms.sch.task_manage.enums.PointStatusEnum; +import org.nl.wms.sch.task_manage.task.TaskType; +import org.nl.wms.sch.task_manage.task.core.TaskStatus; +import org.nl.wms.util.PointUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Component; + +import java.util.Arrays; +import java.util.List; + +/** + * @Author: sxp + * @Description: 折弯下料(成品周转) + * @Date: 2024/3/11 + */ +@Slf4j +@Component +@TaskType("ZWXLTask") +@Lazy +public class ZWXLTask extends AbstractTask { + private static String TASK_CONFIG_CODE = "ZWXLTask"; + /** + * 入口 + */ + private static String ENTRANCE = "1"; + @Autowired + private ISchBasePointService pointService; + @Autowired + private ISchBaseTaskService taskService; + @Autowired + private ISchBaseTaskconfigService taskConfigService; + @Autowired + private IPdmBdWorkorderService workorderService; + @Autowired + private ISchBaseVehiclematerialgroupService vehiclematerialgroupService; + + @Override + protected void create() throws BadRequestException { + List tasks = taskService.findTasksByTaskStatus(TASK_CONFIG_CODE, TaskStatus.APPLY); + SchBaseTaskconfig taskConfig = taskConfigService.getOne(new LambdaQueryWrapper() + .eq(SchBaseTaskconfig::getConfig_code, TASK_CONFIG_CODE)); + for (SchBaseTask task : tasks) { + SchBasePoint point = findNextPoint(taskConfig.getNext_region_str()); + if (ObjectUtil.isEmpty(point)) { + task.setRemark("未找到所需点位!"); + taskService.update(task); + log.info("折弯下料入库未找到当前符合条件的点位!"); + continue; + } + task.setPoint_code2(point.getPoint_code()); + task.setTask_status(TaskStatus.CREATED.getCode()); + task.setRemark(""); + taskService.update(task); + //发起任务时先把点位占用,防止发起重复任务 + point.setIng_task_code(task.getTask_code()); + pointService.update(point); + this.renotifyAcs(task); + } + } + + /** + * 判断目标点位 + * + * @return + */ + private SchBasePoint findNextPoint(String nextReginStr) { + + String[] reginList = nextReginStr.split(","); + LambdaQueryWrapper lam = new LambdaQueryWrapper<>(); + lam.in(SchBasePoint::getRegion_code, Arrays.asList(reginList)) + .eq(SchBasePoint::getPoint_status, PointStatusEnum.EMPTY_POINT.getCode()) + .and(la -> la.isNull(SchBasePoint::getIng_task_code) // 当前执行的任务为空或者NULL,有数据表示锁住 + .or() + .eq(SchBasePoint::getIng_task_code, "")) + .eq(SchBasePoint::getIs_used, true) + .orderByAsc(SchBasePoint::getIn_order_seq) + .orderByAsc(SchBasePoint::getPoint_code); + List schBasePoints = pointService.list(lam); + for (SchBasePoint schBasePoint : schBasePoints) { + if (StringUtils.isEmpty(schBasePoint.getIng_task_code()) && schBasePoint.getVehicle_qty() == 0) { + log.info("折弯下料入库找到当前符合条件的点位{}", schBasePoint.getPoint_code()); + return schBasePoint; + } + } + return null; + } + + @Override +// @Transactional(rollbackFor = Exception.class) + 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("该任务已取消!"); + } + // 获取参数 + 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(); +// PdmBdWorkorder workorderCode = null; +// if (extGroupData != null) { +// workorderCode = ObjectUtil.isNotEmpty(extGroupData.getString("workorder_code")) +// ? workorderService.getOne(new LambdaQueryWrapper() +// .eq(PdmBdWorkorder::getWorkorder_code, extGroupData.getString("workorder_code"))) +// : null; +// } + String startPoint = taskObj.getPoint_code1(); // 获取起点 + String endPoint = ObjectUtil.isNotEmpty(taskObj.getPoint_code2()) ? taskObj.getPoint_code2().substring(0, taskObj.getPoint_code2().length() - 2) : "0"; // 获取终点 + SchBasePoint startPointObj = pointService.getById(startPoint); + SchBasePoint endPointObj = pointService.getById(endPoint); + // 根据传来的类型去对任务进行操作 + if (status.equals(TaskStatus.EXECUTING)) { // 执行中 + taskObj.setTask_status(TaskStatus.EXECUTING.getCode()); + taskObj.setRemark("执行中"); + } + if (status.equals(TaskStatus.FINISHED)) { // 完成 + // 起点清空 + if (ObjectUtil.isNotEmpty(startPointObj)) { + PointUtils.clearPoint(startPointObj); + } + // 终点解锁 + endPointObj.setIng_task_code(""); + endPointObj.setVehicle_code(ObjectUtil.isEmpty(endPointObj.getVehicle_code()) ? vehicle_code + "," : endPointObj.getVehicle_code() + vehicle_code + ","); + endPointObj.setVehicle_qty(1); + pointService.update(endPointObj); + // 要把数据存到组盘表 -> 改造公共方法,返回id + //todo 组盘表需要关联外部mes晶棒数据,一对多 + SchBaseVehiclematerialgroup groupEntity = new SchBaseVehiclematerialgroup(); + groupEntity.setGroup_id(IdUtil.getSnowflake(1, 1).nextIdStr()); + groupEntity.setCreate_id("2"); + groupEntity.setCreate_name("ACS"); + groupEntity.setCreate_time(DateUtil.now()); +// groupEntity.setMaterial_id(ObjectUtil.isNotEmpty(workorderCode) +// ? workorderCode.getMaterial_id() +// : ""); +// groupEntity.setStanding_time(ObjectUtil.isNotEmpty(workorderCode) +// ? workorderCode.getStanding_time() +// : 0); +// groupEntity.setMaterial_weight(ObjectUtil.isNotEmpty(extGroupData) +// ? extGroupData.getBigDecimal("material_qty") +// : BigDecimal.valueOf(0)); +// groupEntity.setWorkorder_code(ObjectUtil.isNotEmpty(workorderCode) +// ? workorderCode.getWorkorder_code() +// : ""); + groupEntity.setVehicle_code(vehicle_code); + groupEntity.setVehicle_type(taskObj.getVehicle_type()); + groupEntity.setPoint_code(startPoint); + groupEntity.setPoint_name(startPointObj.getPoint_name()); + groupEntity.setPcsn(DateUtil.format(DateUtil.date(), "yyyyMMdd")); + groupEntity.setInstorage_time(DateUtil.now()); + groupEntity.setTask_code(taskObj.getTask_code()); + groupEntity.setGroup_bind_material_status(GroupBindMaterialStatusEnum.BOUND.getValue()); // 绑定 + groupEntity.setGroup_status(GroupStatusEnum.IN_STORAGE.getType()); // 暂时不维护。 + groupEntity.setIs_delete(false); + groupEntity.setMove_way(startPoint); + vehiclematerialgroupService.save(groupEntity); + // 任务完成 + taskObj.setTask_status(TaskStatus.FINISHED.getCode()); + taskObj.setGroup_id(groupEntity.getGroup_id()); + taskObj.setRemark("任务完成"); + try { + //todo 入库成功后上报mes + } catch (Exception e) { + log.error("原材料入库上报MES失败{}", e.getMessage(), e); + } + } + if (status.equals(TaskStatus.CANCELED)) { // 取消 + // 终点解锁 + if (ObjectUtil.isNotEmpty(endPointObj)) { + endPointObj.setIng_task_code(""); + //任务取消把原先占用的位置释放 + pointService.update(endPointObj); + } + taskObj.setRemark("任务取消"); + taskObj.setTask_status(TaskStatus.CANCELED.getCode()); + } + taskService.update(taskObj); + } + + @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); + } + + @Override + protected void feedbackTaskState(JSONObject param, SchBaseTask schBaseTask, BaseResponse result) { + //该场景无需重算等待点 + } +} diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/mapper/PointMapper.xml b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/mapper/PointMapper.xml index 407844d..979d1c9 100644 --- a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/mapper/PointMapper.xml +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/sch/task_manage/task/tasks/mapper/PointMapper.xml @@ -7,7 +7,7 @@ FROM `sch_base_point` p WHERE p.region_code like CONCAT('%', #{regionCode}, '%') - and p.is_used = #{point_status} and p.is_used = 1 + and p.point_status = #{point_status} and p.is_used = 1 ORDER BY region_code diff --git a/lms/nladmin-system/nlsso-server/src/main/resources/config/application-dev.yml b/lms/nladmin-system/nlsso-server/src/main/resources/config/application-dev.yml index 454198c..82fd4a7 100644 --- a/lms/nladmin-system/nlsso-server/src/main/resources/config/application-dev.yml +++ b/lms/nladmin-system/nlsso-server/src/main/resources/config/application-dev.yml @@ -6,7 +6,7 @@ spring: druid: db-type: com.alibaba.druid.pool.DruidDataSource driverClassName: net.sf.log4jdbc.sql.jdbcapi.DriverSpy - url: jdbc:log4jdbc:mysql://${DB_HOST:127.0.0.1}:${DB_PORT:3306}/${DB_NAME:gc_lms}?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&useOldAliasMetadataBehavior=true + url: jdbc:log4jdbc:mysql://${DB_HOST:127.0.0.1}:${DB_PORT:3306}/${DB_NAME:xmz_lms}?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&useOldAliasMetadataBehavior=true # url: jdbc:log4jdbc:mysql://${DB_HOST:47.111.78.178}:${DB_PORT:3306}/${DB_NAME:stand_lms}?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&useOldAliasMetadataBehavior=true username: ${DB_USER:root} password: ${DB_PWD:123456}