16 changed files with 2126 additions and 63 deletions
@ -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<SchBaseTask> tasks = taskService.findTasksByTaskStatus(TASK_CONFIG_CODE, TaskStatus.APPLY); |
||||
|
// 配置信息
|
||||
|
SchBaseTaskconfig taskConfig = taskConfigService.getOne(new LambdaQueryWrapper<SchBaseTaskconfig>() |
||||
|
.eq(SchBaseTaskconfig::getConfig_code, TASK_CONFIG_CODE)); |
||||
|
for (SchBaseTask task : tasks) { |
||||
|
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<SchBasePoint> 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<SchBasePoint> 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) { |
||||
|
//该场景无需重算等待点
|
||||
|
} |
||||
|
} |
@ -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<SchBaseTask> tasks = taskService.findTasksByTaskStatus(TASK_CONFIG_CODE, TaskStatus.APPLY); |
||||
|
SchBaseTaskconfig taskConfig = taskConfigService.getOne(new LambdaQueryWrapper<SchBaseTaskconfig>() |
||||
|
.eq(SchBaseTaskconfig::getConfig_code, TASK_CONFIG_CODE)); |
||||
|
for (SchBaseTask task : tasks) { |
||||
|
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<SchBasePoint> 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<SchBasePoint> 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<PdmBdWorkorder>()
|
||||
|
// .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) { |
||||
|
//该场景无需重算等待点
|
||||
|
} |
||||
|
} |
@ -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<SchBaseTask> tasks = taskService.findTasksByTaskStatus(TASK_CONFIG_CODE, TaskStatus.APPLY); |
||||
|
// 配置信息
|
||||
|
SchBaseTaskconfig taskConfig = taskConfigService.getOne(new LambdaQueryWrapper<SchBaseTaskconfig>() |
||||
|
.eq(SchBaseTaskconfig::getConfig_code, TASK_CONFIG_CODE)); |
||||
|
for (SchBaseTask task : tasks) { |
||||
|
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<SchBasePoint> 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<SchBasePoint> 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) { |
||||
|
//该场景无需重算等待点
|
||||
|
} |
||||
|
} |
@ -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<SchBaseTask> tasks = taskService.findTasksByTaskStatus(TASK_CONFIG_CODE, TaskStatus.APPLY); |
||||
|
SchBaseTaskconfig taskConfig = taskConfigService.getOne(new LambdaQueryWrapper<SchBaseTaskconfig>() |
||||
|
.eq(SchBaseTaskconfig::getConfig_code, TASK_CONFIG_CODE)); |
||||
|
for (SchBaseTask task : tasks) { |
||||
|
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<SchBasePoint> 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<SchBasePoint> 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<PdmBdWorkorder>()
|
||||
|
// .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) { |
||||
|
//该场景无需重算等待点
|
||||
|
} |
||||
|
} |
@ -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<SchBaseTask> tasks = taskService.findTasksByTaskStatus(TASK_CONFIG_CODE, TaskStatus.APPLY); |
||||
|
// 配置信息
|
||||
|
SchBaseTaskconfig taskConfig = taskConfigService.getOne(new LambdaQueryWrapper<SchBaseTaskconfig>() |
||||
|
.eq(SchBaseTaskconfig::getConfig_code, TASK_CONFIG_CODE)); |
||||
|
for (SchBaseTask task : tasks) { |
||||
|
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<SchBasePoint> 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<SchBasePoint> 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) { |
||||
|
//该场景无需重算等待点
|
||||
|
} |
||||
|
} |
@ -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<SchBaseTask> tasks = taskService.findTasksByTaskStatus(TASK_CONFIG_CODE, TaskStatus.APPLY); |
||||
|
// 配置信息
|
||||
|
SchBaseTaskconfig taskConfig = taskConfigService.getOne(new LambdaQueryWrapper<SchBaseTaskconfig>() |
||||
|
.eq(SchBaseTaskconfig::getConfig_code, TASK_CONFIG_CODE)); |
||||
|
for (SchBaseTask task : tasks) { |
||||
|
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<SchBasePoint> 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<SchBasePoint> 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) { |
||||
|
//该场景无需重算等待点
|
||||
|
} |
||||
|
} |
@ -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<SchBaseTask> tasks = taskService.findTasksByTaskStatus(TASK_CONFIG_CODE, TaskStatus.APPLY); |
||||
|
SchBaseTaskconfig taskConfig = taskConfigService.getOne(new LambdaQueryWrapper<SchBaseTaskconfig>() |
||||
|
.eq(SchBaseTaskconfig::getConfig_code, TASK_CONFIG_CODE)); |
||||
|
for (SchBaseTask task : tasks) { |
||||
|
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<SchBasePoint> 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<SchBasePoint> 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<PdmBdWorkorder>()
|
||||
|
// .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) { |
||||
|
//该场景无需重算等待点
|
||||
|
} |
||||
|
} |
@ -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<SchBaseTask> tasks = taskService.findTasksByTaskStatus(TASK_CONFIG_CODE, TaskStatus.APPLY); |
||||
|
SchBaseTaskconfig taskConfig = taskConfigService.getOne(new LambdaQueryWrapper<SchBaseTaskconfig>() |
||||
|
.eq(SchBaseTaskconfig::getConfig_code, TASK_CONFIG_CODE)); |
||||
|
for (SchBaseTask task : tasks) { |
||||
|
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<SchBasePoint> 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<SchBasePoint> 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<PdmBdWorkorder>()
|
||||
|
// .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) { |
||||
|
//该场景无需重算等待点
|
||||
|
} |
||||
|
} |
@ -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<SchBaseTask> tasks = taskService.findTasksByTaskStatus(TASK_CONFIG_CODE, TaskStatus.APPLY); |
||||
|
// 配置信息
|
||||
|
SchBaseTaskconfig taskConfig = taskConfigService.getOne(new LambdaQueryWrapper<SchBaseTaskconfig>() |
||||
|
.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<SchBasePoint> 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<SchBasePoint> 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) { |
||||
|
//该场景无需重算等待点
|
||||
|
} |
||||
|
} |
@ -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<SchBaseTask> tasks = taskService.findTasksByTaskStatus(TASK_CONFIG_CODE, TaskStatus.APPLY); |
||||
|
SchBaseTaskconfig taskConfig = taskConfigService.getOne(new LambdaQueryWrapper<SchBaseTaskconfig>() |
||||
|
.eq(SchBaseTaskconfig::getConfig_code, TASK_CONFIG_CODE)); |
||||
|
for (SchBaseTask task : tasks) { |
||||
|
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<SchBasePoint> 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<SchBasePoint> 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<PdmBdWorkorder>()
|
||||
|
// .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) { |
||||
|
//该场景无需重算等待点
|
||||
|
} |
||||
|
} |
Loading…
Reference in new issue