diff --git a/youchain-system/src/main/java/com/youchain/appupdate/service/impl/BydAppServiceImpl.java b/youchain-system/src/main/java/com/youchain/appupdate/service/impl/BydAppServiceImpl.java index 9a2bb50..93ab6b3 100644 --- a/youchain-system/src/main/java/com/youchain/appupdate/service/impl/BydAppServiceImpl.java +++ b/youchain-system/src/main/java/com/youchain/appupdate/service/impl/BydAppServiceImpl.java @@ -216,6 +216,9 @@ public class BydAppServiceImpl implements BydAppService { //刷新出库单状态 pickService.refreshPickStatus(task.getPickDetail().getPick()); + //生成叫料任务 + taskService.callJlTask(pick); + //成品原托盘返库;单品不回库 if (BaseStatus.GD_TYPE_CT.equals(pick.getOrderType())) { this.returnFBAgvTask(task); diff --git a/youchain-system/src/main/java/com/youchain/basicdata/repository/StockRepository.java b/youchain-system/src/main/java/com/youchain/basicdata/repository/StockRepository.java index 753df46..5bcd0b4 100644 --- a/youchain-system/src/main/java/com/youchain/basicdata/repository/StockRepository.java +++ b/youchain-system/src/main/java/com/youchain/basicdata/repository/StockRepository.java @@ -43,12 +43,6 @@ public interface StockRepository extends JpaRepository, JpaSpecific @Query(" from Stock s where s.point.code = :pointCode") Stock findByPointCode(String pointCode); - @Query(" from Stock s where s.point.area.name = :areaName " + - " and s.point.id > 0 " + - " and s.point.enabled=true" + - " and s.point.status = 'USED'" + - " and s.status = :status " + - " and s.enabled = true " + - " and s.code not in (select agv.stockCode from AgvTask agv where agv.status not in ('FINISH','CANCEL') ) ") + @Query(" from Stock s where s.point.area.name = :areaName and s.point.id > 0 and s.point.enabled=true and s.point.status = 'USED' and s.status = :status and s.enabled = true ") List findByFreeOrUsedStock(String areaName, String status); } diff --git a/youchain-system/src/main/java/com/youchain/businessdata/domain/AgvTask.java b/youchain-system/src/main/java/com/youchain/businessdata/domain/AgvTask.java index 88ee241..222b17d 100644 --- a/youchain-system/src/main/java/com/youchain/businessdata/domain/AgvTask.java +++ b/youchain-system/src/main/java/com/youchain/businessdata/domain/AgvTask.java @@ -1,18 +1,18 @@ /* -* Copyright 2019-2020 Zheng Jie -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ + * Copyright 2019-2020 Zheng Jie + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package com.youchain.businessdata.domain; import com.youchain.base.BaseEntity; @@ -20,6 +20,7 @@ import lombok.Data; import cn.hutool.core.bean.BeanUtil; import io.swagger.annotations.ApiModelProperty; import cn.hutool.core.bean.copier.CopyOptions; + import javax.persistence.*; import javax.validation.constraints.*; import java.sql.Timestamp; @@ -27,15 +28,15 @@ import java.io.Serializable; import java.util.Date; /** -* @website https://eladmin.vip -* @description / -* @author baobinglin -* @date 2023-08-18 -**/ + * @author baobinglin + * @website https://eladmin.vip + * @description / + * @date 2023-08-18 + **/ @Entity @Data -@Table(name="data_agv_task") -public class AgvTask extends BaseEntity implements Serializable { +@Table(name = "data_agv_task") +public class AgvTask extends BaseEntity implements Serializable { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "`id`") @@ -43,17 +44,14 @@ public class AgvTask extends BaseEntity implements Serializable { private Long id; @Column(name = "`stock_code`") - @NotBlank @ApiModelProperty(value = "容器号") private String stockCode; @Column(name = "`stock_type_code`") - @NotBlank @ApiModelProperty(value = "") private String stockTypeCode; - @Column(name = "`start_slot_code`",nullable = false) - @NotBlank + @Column(name = "`start_slot_code`") @ApiModelProperty(value = "起点位置") private String startSlotCode; @@ -65,8 +63,7 @@ public class AgvTask extends BaseEntity implements Serializable { @ApiModelProperty(value = "设备编号") private String slotCode; - @Column(name = "`status`",nullable = false) - @NotBlank + @Column(name = "`status`", nullable = false) @ApiModelProperty(value = "任务状态") private String status; @@ -78,17 +75,16 @@ public class AgvTask extends BaseEntity implements Serializable { @ApiModelProperty(value = "") private String jobId; - @Column(name = "`job_type`",nullable = false) - @NotBlank + @Column(name = "`job_type`", nullable = false) @ApiModelProperty(value = "工作类型") /** * 01:料箱 */ - private String jobType="01"; + private String jobType = "01"; @Column(name = "`job_priority`") @ApiModelProperty(value = "优先级") - private Integer jobPriority=1; + private Integer jobPriority = 1; @Column(name = "`job_priority_type`") @ApiModelProperty(value = "强制优先级") @@ -112,7 +108,7 @@ public class AgvTask extends BaseEntity implements Serializable { @Column(name = "`be_scan`") @ApiModelProperty(value = "是否扫描") - private Integer beScan=0; + private Integer beScan = 0; @Column(name = "`line_slot_code`") @ApiModelProperty(value = "出库单号") @@ -137,25 +133,26 @@ public class AgvTask extends BaseEntity implements Serializable { /** * 添加搬运任务 - * @param type 任务类型-入库/出库 - * @param stockCode 料车号 - * @param startSlotCode 起始位置(取料箱点位;料箱当前放置的货位码;取料箱时之前是否需要 - * 确认)中间用 ; 隔开 例如 9;2-001;false - * @param endSlotCode 终点位置(放料箱点位;料箱放置的目标货位码;放料箱时之前是否需要 - * 确认)中间用 ; 隔开 例如 14;1-001;false - * @param status 任务状态,直接下发还是排队下发 - * @param jobType 任务类型-货 架 ( 托 盘 ) 移动:RACK_MOVE * + * @param type 任务类型-入库/出库 + * @param stockCode 料车号 + * @param startSlotCode 起始位置(取料箱点位;料箱当前放置的货位码;取料箱时之前是否需要 + * 确认)中间用 ; 隔开 例如 9;2-001;false + * @param endSlotCode 终点位置(放料箱点位;料箱放置的目标货位码;放料箱时之前是否需要 + * 确认)中间用 ; 隔开 例如 14;1-001;false + * @param status 任务状态,直接下发还是排队下发 + * @param jobType 任务类型-货 架 ( 托 盘 ) 移动:RACK_MOVE */ - public AgvTask(String type,String stockCode,String startSlotCode,String endSlotCode,String status,String jobType){ - this.type=type; - this.stockCode=stockCode; - this.startSlotCode=startSlotCode; - this.endSlotCode=endSlotCode; - this.status=status; - this.jobType=jobType; + public AgvTask(String type, String stockCode, String startSlotCode, String endSlotCode, String status, String jobType) { + this.type = type; + this.stockCode = stockCode; + this.startSlotCode = startSlotCode; + this.endSlotCode = endSlotCode; + this.status = status; + this.jobType = jobType; } - public void copy(AgvTask source){ - BeanUtil.copyProperties(source,this, CopyOptions.create().setIgnoreNullValue(true)); + + public void copy(AgvTask source) { + BeanUtil.copyProperties(source, this, CopyOptions.create().setIgnoreNullValue(true)); } } diff --git a/youchain-system/src/main/java/com/youchain/businessdata/domain/Pick.java b/youchain-system/src/main/java/com/youchain/businessdata/domain/Pick.java index dea33b0..9546ab8 100644 --- a/youchain-system/src/main/java/com/youchain/businessdata/domain/Pick.java +++ b/youchain-system/src/main/java/com/youchain/businessdata/domain/Pick.java @@ -51,23 +51,23 @@ public class Pick extends BaseEntity implements Serializable { @ApiModelProperty(value = "序号") private int lineNo; - @Column(name = "`task_code`",nullable = false) + @Column(name = "`task_code`", nullable = false) @ApiModelProperty(value = "任务编号") private String taskCode; - @Column(name = "`code`",nullable = false) + @Column(name = "`code`", nullable = false) @ApiModelProperty(value = "出库单号") private String code; - @Column(name = "`gd_code`",nullable = false) + @Column(name = "`gd_code`", nullable = false) @ApiModelProperty(value = "工单号") private String gdCode; - @Column(name = "`station`",nullable = false) + @Column(name = "`station`", nullable = false) @ApiModelProperty(value = "需求工位") private String station; - @Column(name = "`cp_code_or_dp_code`",nullable = false) + @Column(name = "`cp_code_or_dp_code`", nullable = false) @ApiModelProperty(value = "成品代码或单品代码") private String cpCodeOrDpCode; @@ -100,7 +100,10 @@ public class Pick extends BaseEntity implements Serializable { @Column(name = "`source_id`") @ApiModelProperty(value = "回传状态") - private Long sourceId;/** 0失败;1.成功*/ + private Long sourceId; + /** + * 0失败;1.成功 + */ @OneToOne @JoinColumn(name = "`dept_id`", nullable = false) @@ -108,6 +111,10 @@ public class Pick extends BaseEntity implements Serializable { @ApiModelProperty(value = "仓库") private Dept dept; + @Column(name = "`priority`") + @ApiModelProperty(value = "优先级") + private int priority=0; + public void copy(Pick source) { BeanUtil.copyProperties(source, this, CopyOptions.create().setIgnoreNullValue(true)); } diff --git a/youchain-system/src/main/java/com/youchain/businessdata/repository/AgvTaskRepository.java b/youchain-system/src/main/java/com/youchain/businessdata/repository/AgvTaskRepository.java index 48b3e19..2a3a116 100644 --- a/youchain-system/src/main/java/com/youchain/businessdata/repository/AgvTaskRepository.java +++ b/youchain-system/src/main/java/com/youchain/businessdata/repository/AgvTaskRepository.java @@ -36,13 +36,14 @@ public interface AgvTaskRepository extends JpaRepository, JpaSpec * @param stockCode 容器 */ @Query(value = " from AgvTask agv where agv.stockCode=:stockCode and agv.startSlotCode=:srcPointCode and agv.endSlotCode=:endPointCode and agv.status not in ('CANCEL','FINISH') ") - List findRepeat(String stockCode,String srcPointCode,String endPointCode); + List findRepeat(String stockCode, String srcPointCode, String endPointCode); /** * 查询待执行的备料、叫料、叫料返库任务 + * 'PICK','CALL_PICK','CALL_RETURN' */ - @Query(value = " from AgvTask agv where agv.type in ('PICK','CALL_PICK','CALL_RETURN') and agv.status='OPEN' order by agv.createTime ") - List findOpenByAgvTask(); + @Query(value = " from AgvTask agv where agv.type=:type and agv.status='OPEN' order by agv.createTime ") + List findOpenByAgvTask(String type); /** * 翻包返库时,查询起点是否有多条不同容器的任务(不包括当前任务) diff --git a/youchain-system/src/main/java/com/youchain/businessdata/repository/TaskRepository.java b/youchain-system/src/main/java/com/youchain/businessdata/repository/TaskRepository.java index 5a322d3..511c11a 100644 --- a/youchain-system/src/main/java/com/youchain/businessdata/repository/TaskRepository.java +++ b/youchain-system/src/main/java/com/youchain/businessdata/repository/TaskRepository.java @@ -51,8 +51,8 @@ public interface TaskRepository extends JpaRepository, JpaSpecificat * * @param pickId 出库单ID */ - @Query("from Task t where t.pickDetail.pick.id =:pickId and t.planQty > t.moveQty and t.agvTask.id is null") - List findByPickNotAllTask(Long pickId); + @Query("from Task t where t.planQty > t.moveQty and t.agvTask.id is null") + List findByPickNotAllTask(); /** * 根据出库单查询已完成的Task集合 diff --git a/youchain-system/src/main/java/com/youchain/businessdata/rest/MesController.java b/youchain-system/src/main/java/com/youchain/businessdata/rest/MesController.java index 9a4b69e..dcc02fb 100644 --- a/youchain-system/src/main/java/com/youchain/businessdata/rest/MesController.java +++ b/youchain-system/src/main/java/com/youchain/businessdata/rest/MesController.java @@ -51,10 +51,10 @@ public class MesController { String itemCode = zpjlZj.getItemCode();//物料代码 String station = zpjlZj.getStation();//需求工位 String pointCode = zpjlZj.getPointCode();//需求点位 - mesService.itemCall(orderNo, itemCode, station, pointCode); - return successResponse("叫料成功!"); + String result = mesService.itemCall(orderNo, itemCode, station, pointCode); + return successResponse(result); } catch (Exception e) { - return badResponse("叫料失败:" + e.getMessage()); + return successResponse("叫料失败:" + e.getMessage()); } } @@ -68,10 +68,10 @@ public class MesController { String completeCode = zpjlCt.getCompleteCode();//成套代码 String station = zpjlCt.getStation();//需求工位 String pointCode = zpjlCt.getPointCode();//需求点位 - mesService.bigItemCall(orderNo, completeCode, station, pointCode); - return successResponse("叫料成功!"); + String result = mesService.bigItemCall(orderNo, completeCode, station, pointCode); + return successResponse(result); } catch (Exception e) { - return badResponse("叫料失败:" + e.getMessage()); + return successResponse("叫料失败:" + e.getMessage()); } } @@ -90,10 +90,10 @@ public class MesController { @AnonymousAccess public ResponseEntity transTask(@Validated @RequestBody TransTask transTask) { try { - mesService.performTransportTask(transTask); - return successResponse("下发成功!"); + String result = mesService.performTransportTask(transTask); + return successResponse(result); } catch (Exception e) { - return badResponse("下发失败!" + e.getMessage()); + return successResponse("下发失败!" + e.getMessage()); } } diff --git a/youchain-system/src/main/java/com/youchain/businessdata/service/AgvTaskService.java b/youchain-system/src/main/java/com/youchain/businessdata/service/AgvTaskService.java index e8566cf..bc450d7 100644 --- a/youchain-system/src/main/java/com/youchain/businessdata/service/AgvTaskService.java +++ b/youchain-system/src/main/java/com/youchain/businessdata/service/AgvTaskService.java @@ -110,20 +110,30 @@ public interface AgvTaskService { */ List findRepeat(String stockCode, String srcPointCode, String endPointCode); + /** + * 根据起点查询是否有重复任务 + * + * @param startSlotCode 点位 + * @param type 任务类型 + * @param jobType 作业类型 + */ + Boolean findByStartSlotCode(String startSlotCode, String type, String jobType); + /** * 根据终点查询是否有重复任务 * * @param endSlotCode 点位 - * @param type 任务类型 - * @param jobType 作业类型 + * @param type 任务类型 + * @param jobType 作业类型 */ Boolean findByEndSlotCode(String endSlotCode, String type, String jobType); /** - * 叉车任务一个一个下发 + * 叉车任务一个一个下发 + * * @param endSlotCode 终点 - * @param type 任务类型 - * @param jobType 作业类型 + * @param type 任务类型 + * @param jobType 作业类型 * @return */ Boolean findByCcEndSlotCode(String endSlotCode, String type, String jobType); @@ -131,7 +141,7 @@ public interface AgvTaskService { /** * 查询打开的任务并轮询下发 */ - List findOpenByAgvTask(); + List findOpenByAgvTask(String type); /** * 翻包返库时,查询起点是否有多条不同容器的任务(不包括当前任务) @@ -143,6 +153,7 @@ public interface AgvTaskService { /** * 根据状态查询任务 + * * @param status 状态 * @return List */ diff --git a/youchain-system/src/main/java/com/youchain/businessdata/service/MesService.java b/youchain-system/src/main/java/com/youchain/businessdata/service/MesService.java index 573026c..fe98e09 100644 --- a/youchain-system/src/main/java/com/youchain/businessdata/service/MesService.java +++ b/youchain-system/src/main/java/com/youchain/businessdata/service/MesService.java @@ -21,7 +21,7 @@ public interface MesService { * @param station->需求工位 * @param pointCode->需求点位 */ - void itemCall(String gdNo, String itemCode, String station, String pointCode); + String itemCall(String gdNo, String itemCode, String station, String pointCode); /** * 成品叫料-小件 @@ -31,13 +31,13 @@ public interface MesService { * @param station->需求工位 * @param pointCode->需求点位 */ - void bigItemCall(String gdNo, String completeCode, String station, String pointCode); + String bigItemCall(String gdNo, String completeCode, String station, String pointCode); /** * 搬运任务 * * @param transTask 搬运任务 */ - void performTransportTask(TransTask transTask); + String performTransportTask(TransTask transTask); } diff --git a/youchain-system/src/main/java/com/youchain/businessdata/service/TaskService.java b/youchain-system/src/main/java/com/youchain/businessdata/service/TaskService.java index fad5466..355d384 100644 --- a/youchain-system/src/main/java/com/youchain/businessdata/service/TaskService.java +++ b/youchain-system/src/main/java/com/youchain/businessdata/service/TaskService.java @@ -128,9 +128,8 @@ public interface TaskService { /** * 根据出库单查询未完成的Task集合 * - * @param pickId 出库单Id */ - List findByPickNotAllTask(Long pickId); + List findByPickNotAllTask(); /** * 根据出库单查询已完成的Task集合 @@ -174,9 +173,8 @@ public interface TaskService { /** * 定时任务轮询出库单备料 * - * @param pick 出库单 */ - void materialPick(Pick pick); + void materialPick(); /** * 定时任务轮询叫料反空车至备料缓存区 diff --git a/youchain-system/src/main/java/com/youchain/businessdata/service/impl/AgvTaskServiceImpl.java b/youchain-system/src/main/java/com/youchain/businessdata/service/impl/AgvTaskServiceImpl.java index e147d74..d11e6fe 100644 --- a/youchain-system/src/main/java/com/youchain/businessdata/service/impl/AgvTaskServiceImpl.java +++ b/youchain-system/src/main/java/com/youchain/businessdata/service/impl/AgvTaskServiceImpl.java @@ -142,6 +142,18 @@ public class AgvTaskServiceImpl implements AgvTaskService { return agvTaskRepository.findRepeat(stockCode, srcPointCode, endPointCode); } + @Override + public Boolean findByStartSlotCode(String startSlotCode, String type, String jobType) { + String hql = " from AgvTask agv " + + " where agv.startSlotCode='" + startSlotCode + "' " + + " and agv.type='" + type + "' " + + " and agv.jobType='" + jobType + "' " + + " and agv.status in ('OPEN','ATCALL','UP_CONTAINER') "; + Query query = entityMapper.createQuery(hql); + List agvTaskList = query.getResultList(); + return agvTaskList.isEmpty(); + } + @Override public Boolean findByEndSlotCode(String endSlotCode, String type, String jobType) { String hql = " from AgvTask agv " + @@ -167,8 +179,8 @@ public class AgvTaskServiceImpl implements AgvTaskService { } @Override - public List findOpenByAgvTask() { - return agvTaskRepository.findOpenByAgvTask(); + public List findOpenByAgvTask(String type) { + return agvTaskRepository.findOpenByAgvTask(type); } @Override diff --git a/youchain-system/src/main/java/com/youchain/businessdata/service/impl/MesServiceImpl.java b/youchain-system/src/main/java/com/youchain/businessdata/service/impl/MesServiceImpl.java index 17f8d0d..a3e0845 100644 --- a/youchain-system/src/main/java/com/youchain/businessdata/service/impl/MesServiceImpl.java +++ b/youchain-system/src/main/java/com/youchain/businessdata/service/impl/MesServiceImpl.java @@ -9,6 +9,7 @@ import com.youchain.basicdata.domain.Item; import com.youchain.basicdata.domain.Point; import com.youchain.basicdata.domain.Stock; import com.youchain.basicdata.repository.ItemRepository; +import com.youchain.basicdata.repository.PointRepository; import com.youchain.basicdata.service.ItemService; import com.youchain.basicdata.service.PointService; import com.youchain.basicdata.service.StockService; @@ -40,7 +41,7 @@ import java.util.stream.Collectors; @RequiredArgsConstructor @Slf4j public class MesServiceImpl implements MesService { - + private final PointRepository pointRepository; private final PickRepository pickRepository; private final PickDetailRepository pickDetailRepository; private final ItemRepository itemRepository; @@ -129,82 +130,55 @@ public class MesServiceImpl implements MesService { @Override @Transactional(rollbackFor = Exception.class) - public void itemCall(String gdNo, String itemCode, String station, String pointCode) { + public String itemCall(String gdNo, String itemCode, String station, String pointCode) { Pick pick = pickRepository.findByPick(gdNo, itemCode, station); if (pick == null) { - throw new BadRequestException(gdNo + ":" + itemCode + ":" + station + "工单不存在,叫料失败!"); + return gdNo + ":" + itemCode + ":" + station + "工单WMS不存在,叫料失败!"; } - if (BizStatus.OPEN.equals(pick.getStatus())) { - throw new BadRequestException(gdNo + "工单未备料完成,叫料失败!"); - } - - Point point = pointService.queryPoint(pointCode, null, null, null); - if (point == null) { - throw new BadRequestException(pointCode + "点位不存在或已失效!"); - } - - pick.setIsCall(true); if (pick.getCallPoint() == null || pick.getCallPoint().length() <= 0) { pick.setCallPoint(pointCode); - } else if (!pointCode.equals(pick.getCallPoint())) { + } else { pick.setCallPoint(pick.getCallPoint() + "," + pointCode); } + pick.setIsCall(true); pickRepository.save(pick); - - taskService.callJlTask(pick); + return "叫料成功!"; } @Override @Transactional(rollbackFor = Exception.class) - public void bigItemCall(String gdNo, String completeCode, String station, String pointCode) { + public String bigItemCall(String gdNo, String completeCode, String station, String pointCode) { Pick pick = pickRepository.findByPick(gdNo, completeCode, station); if (pick == null) { - throw new BadRequestException(gdNo + ":" + completeCode + ":" + station + "工单不存在,叫料失败!"); + return gdNo + ":" + completeCode + ":" + station + "工单WMS不存在,叫料失败!"; } - - if (BizStatus.OPEN.equals(pick.getStatus())) { - throw new BadRequestException(gdNo + "工单未备料完成,叫料失败!"); - } - - Point point = pointService.queryPoint(pointCode, null, null, null); - if (point == null) { - throw new BadRequestException(pointCode + "点位不存在或已失效!"); - } - - - pick.setIsCall(true); if (pick.getCallPoint() == null || pick.getCallPoint().length() <= 0) { pick.setCallPoint(pointCode); - } else if (!pointCode.equals(pick.getCallPoint())) { + } else { pick.setCallPoint(pick.getCallPoint() + "," + pointCode); } - + pick.setIsCall(true); pickRepository.save(pick); - - taskService.callJlTask(pick); + //taskService.callJlTask(pick); + return "叫料成功!"; } @Override @Transactional(rollbackFor = Exception.class) - public void performTransportTask(TransTask transTask) { + public String performTransportTask(TransTask transTask) { switch (transTask.getTaskType()) { case BizStatus.Cp_Off_Up: - moveCpOffUp(transTask.getPointCode());//呼叫空货架 - break; + return moveCpOffUp(transTask.getPointCode());//呼叫空货架 case BizStatus.Cp_Off_Line: - moveCpOffLine(transTask);//送满货架 - break; + return moveCpOffLine(transTask);//送满货架 case BizStatus.Fx_Off_Line: - moveFxOffLine(transTask);//返修呼叫空托盘、返修下线 - break; + return moveFxOffLine(transTask);//返修呼叫空托盘、返修下线 case BizStatus.Fx_Back: - moveFxBack(transTask);//返修载具送回 - break; + return moveFxBack(transTask);//返修载具送回 case BizStatus.JL_Back: - moveJLBack(transTask);//叫料返空 - break; + return moveJLBack(transTask);//叫料返空 default: - throw new BadRequestException("任务类型错误!"); + return "任务类型错误!"; } } @@ -271,102 +245,176 @@ public class MesServiceImpl implements MesService { return pickDetail; } - private void moveCpOffUp(String pointCode) { - // 从成品入库缓存区查询空车;没有在从成品入库区查询空车; + private String moveCpOffUp(String pointCode) { + //终点 + Point endPoint = pointRepository.findByCode(pointCode); + // 查询空车 + List emptyStockList = getEmptyStockList(); + if (emptyStockList.isEmpty()) { + // 没有空车的处理逻辑 + if (!isEndPointAvailable(endPoint.getCode(), BizStatus.Cp_Off_Up, "RACK_MOVE")) { + return pointCode + "点位有任务,请稍后再试!"; + } + // 生成agv任务进行等待 + agvTaskService.createAgvTask(BizStatus.Cp_Off_Up, null, null, endPoint.getCode(), "RACK_MOVE"); + pointService.usedPoint(endPoint); + return "成品入库区、成品入库缓存区都没有空车,请稍后再试!"; + } + + //选择空车 + Stock emptyStock = emptyStockList.get(0); + Point srcPoint = emptyStock.getPoint(); + + // 验证终点是否有任务 + if (!isEndPointAvailable(endPoint.getCode(), BizStatus.Cp_Off_Up, "RACK_MOVE")) { + return pointCode + "点位有任务,请稍后再试!"; + } + + //创建Agv任务 + AgvTask agvTask = agvTaskService.createAgvTask(BizStatus.Cp_Off_Up, emptyStock, srcPoint.getCode(), endPoint.getCode(), "RACK_MOVE"); + + // 更新点位状态 + pointService.usedPoint(endPoint); + + return "呼叫成功"; + + } + + /** + * 从成品入库缓存区或成品入库区查询空车 + * + * @return 空车列表 + */ + private List getEmptyStockList() { List emptyStockList = stockService.findByFreeOrUsedStock(AreaNameDic.CPRKHCQ, BaseStatus.FREE); if (emptyStockList.isEmpty()) { emptyStockList = stockService.findByFreeOrUsedStock(AreaNameDic.CPRKQ, BaseStatus.FREE); - if (emptyStockList.isEmpty()) { - throw new BadRequestException("成品入库区、成品入库缓存区都没有空车,请稍后再试!"); - } } - //容器 - Stock emptyStock = emptyStockList.get(0); - //起点 - Point srcPoint = emptyStock.getPoint(); - //终点 - Point endPoint = pointService.validatePoint(pointCode); - //验证终点是否有任务 - if (!agvTaskService.findByEndSlotCode(endPoint.getCode(), BizStatus.Cp_Off_Up, "RACK_MOVE")) { - // 直接在条件判断为false时抛出异常,表示该点位有任务 - throw new BadRequestException(endPoint.getCode() + "点位有任务,请稍后再试!"); - } - //创建Agv任务 - AgvTask agvTask = agvTaskService.createAgvTask(BizStatus.Cp_Off_Up, emptyStock, srcPoint.getCode(), endPoint.getCode(), "RACK_MOVE"); - // 更新点位状态 - pointService.usedPoint(endPoint); - //下发任务 - kmReService.sendAgvTask(agvTask, kmReService.sendAgvTaskHjJson(agvTask)); + return emptyStockList; } - private void moveCpOffLine(TransTask transTask) { - //查询下线缓存区是否有满货架; - List fullStockList = stockService.findByFreeOrUsedStock(AreaNameDic.CPXXHC, BaseStatus.USED); - if (!fullStockList.isEmpty()) { - List endPointList = pointService.queryPoints(null, BaseStatus.FREE, BaseStatus.BOX, AreaNameDic.CPRKQ); - if (!endPointList.isEmpty()) { - //容器 - Stock fullStock = fullStockList.get(0); - //起点 - Point srcPoint = fullStock.getPoint(); - //终点 - Point endPoint = endPointList.get(0); - //验证终点是否有任务 - if (agvTaskService.findByEndSlotCode(endPoint.getCode(), BizStatus.Cp_Off_Line, "RACK_MOVE")) { - //创建Agv任务 - AgvTask agvTask = agvTaskService.createAgvTask(BizStatus.Cp_Off_Line, fullStock, srcPoint.getCode(), endPoint.getCode(), "RACK_MOVE"); - synchronized (endPoint) { - // 更新点位状态 - pointService.usedPoint(endPoint); + /** + * 验证终点是否有任务 + * + * @param endPointCode 终点点位代码 + * @return 终点是否可用 + */ + private boolean isEndPointAvailable(String endPointCode, String type, String jobType) { + return agvTaskService.findByEndSlotCode(endPointCode, type, jobType); + } - //占用容器 - stockService.usedStock(fullStock, srcPoint, BaseStatus.USED); - } + /** + * 验证起点是否有任务 + * + * @param startSlotCode 终点点位代码 + * @return 终点是否可用 + */ + private boolean isSrcPointAvailable(String startSlotCode, String type, String jobType) { + return agvTaskService.findByStartSlotCode(startSlotCode, type, jobType); + } - - //下发任务 - kmReService.sendAgvTask(agvTask, kmReService.sendAgvTaskHjJson(agvTask)); - } - } + private String moveCpOffLine(TransTask transTask) { + Point srcPoint = pointRepository.findByCode(transTask.getPointCode()); + if (srcPoint == null) { + return transTask.getPointCode() + "点位不存在!"; + } + // 处理下线缓存区有满货架的情况 + String result = handleFullStockInCache(srcPoint); + if (result != null) { + return result; } - //下线缓存区没有满货架,直接下发当前任务 - Point srcPoint = pointService.validatePoint(transTask.getPointCode()); //容器 Stock stock = stockService.findByPointCode(srcPoint.getCode()); - if (stock == null) { - throw new BadRequestException(srcPoint.getCode() + "点位没有货架!"); - } - List endPointList = pointService.queryPoints(null, BaseStatus.FREE, BaseStatus.BOX, AreaNameDic.CPRKQ); - if (endPointList.isEmpty()) { - endPointList = pointService.queryPoints(null, BaseStatus.FREE, BaseStatus.BOX, AreaNameDic.CPXXHC); - if (endPointList.isEmpty()) { - throw new BadRequestException("成品入库区和成品下线缓存区都没有空闲点位!"); + + // 查找可用的终点点位 + Point endPoint = findAvailableEndPoint(); + if (endPoint == null) { + // 没有可用终点点位的处理逻辑 + if (!isSrcPointAvailable(srcPoint.getCode(), BizStatus.Cp_Off_Line, "RACK_MOVE")) { + return srcPoint.getCode() + "点位有任务,请稍后再试!"; } - } - //终点 - Point endPoint = endPointList.get(0); - //验证终点是否有任务 - if (!agvTaskService.findByEndSlotCode(endPoint.getCode(), BizStatus.Cp_Off_Line, "RACK_MOVE")) { - // 直接在条件判断为false时抛出异常,表示该点位有任务 - throw new BadRequestException(endPoint.getCode() + "点位有任务,请稍后再试!"); + // 生成等待任务 + agvTaskService.createAgvTask(BizStatus.Cp_Off_Line, stock, srcPoint.getCode(), null, "RACK_MOVE"); + return "成品入库区和成品下线缓存区都没有空闲点位,请稍后再试!"; } - //创建Agv任务 + // 验证终点是否有任务 + if (!isEndPointAvailable(endPoint.getCode(), BizStatus.Cp_Off_Line, "RACK_MOVE")) { + return transTask.getPointCode() + "点位有任务,请稍后再试!"; + } + + // 创建Agv任务 AgvTask agvTask = agvTaskService.createAgvTask(BizStatus.Cp_Off_Line, stock, srcPoint.getCode(), endPoint.getCode(), "RACK_MOVE"); + // 同步更新终点点位状态和占用容器 synchronized (endPoint) { // 更新点位状态 pointService.usedPoint(endPoint); - //占用容器 + // 占用容器 stockService.usedStock(stock, srcPoint, BaseStatus.USED); } - //下发任务 - kmReService.sendAgvTask(agvTask, kmReService.sendAgvTaskHjJson(agvTask)); + return "呼叫成功"; + } - private void moveFxOffLine(TransTask transTask) { + /** + * 查找可用的终点点位,优先从成品入库区查找,若没有则从成品下线缓存区查找 + * + * @return 可用的终点点位,如果没有则返回null + */ + private Point findAvailableEndPoint() { + List endPointList = pointService.queryPoints(null, BaseStatus.FREE, BaseStatus.BOX, AreaNameDic.CPRKQ); + if (endPointList.isEmpty()) { + endPointList = pointService.queryPoints(null, BaseStatus.FREE, BaseStatus.BOX, AreaNameDic.CPXXHC); + } + return endPointList.isEmpty() ? null : endPointList.get(0); + } + + /** + * 处理下线缓存区有满货架的情况 + * + * @param srcPoint 源点位 + * @return 处理结果信息,如果为空则表示继续后续流程 + */ + private String handleFullStockInCache(Point srcPoint) { + // 查询下线缓存区是否有满货架 + List fullStockList = stockService.findByFreeOrUsedStock(AreaNameDic.CPXXHC, BaseStatus.USED); + if (!fullStockList.isEmpty()) { + // 取第一个满货架容器 + Stock fullStock = fullStockList.get(0); + // 查找成品入库区的可用终点点位 + List endPointList = pointService.queryPoints(null, BaseStatus.FREE, BaseStatus.BOX, AreaNameDic.CPRKQ); + if (!endPointList.isEmpty()) { + // 取第一个可用终点点位 + Point endPoint = endPointList.get(0); + // 验证终点是否有任务 + if (agvTaskService.findByEndSlotCode(endPoint.getCode(), BizStatus.Cp_Off_Line, "RACK_MOVE")) { + // 创建Agv任务 + AgvTask agvTask = agvTaskService.createAgvTask(BizStatus.Cp_Off_Line, fullStock, srcPoint.getCode(), endPoint.getCode(), "RACK_MOVE"); + // 同步更新终点点位状态和占用容器 + synchronized (endPoint) { + // 更新点位状态 + pointService.usedPoint(endPoint); + // 占用容器 + stockService.usedStock(fullStock, srcPoint, BaseStatus.USED); + } + } + } else { + // 没有空车的处理逻辑 + if (!isSrcPointAvailable(fullStock.getPoint().getCode(), BizStatus.Cp_Off_Line, "RACK_MOVE")) { + return fullStock.getPoint().getCode() + "点位有任务,请稍后再试!"; + } + // 生成agv任务进行等待 + agvTaskService.createAgvTask(BizStatus.Cp_Off_Line, fullStock, fullStock.getCode(), null, "RACK_MOVE"); + return "成品入库区和成品下线缓存区都没有空闲点位,请稍后再试!"; + } + } + return null; + } + + private String moveFxOffLine(TransTask transTask) { //返修上线起点 String srcPointCode = transTask.getPointCode(); //终点 @@ -381,63 +429,78 @@ public class MesServiceImpl implements MesService { } else if (gtLineMap.isOfflinePoint(srcPointCode)) { dstPointCode = gtLineMap.getValueByKey(srcPointCode); } else { - throw new BadRequestException(srcPointCode + "点位不存在,请核实"); + return srcPointCode + "点位不存在,请核实!"; } - // 验证终点是否有任务 - if (!agvTaskService.findByEndSlotCode(dstPointCode, BizStatus.Fx_Off_Line, "ROLLER_MOVE")) { - throw new BadRequestException(dstPointCode + "点位有任务,请稍后再试!"); + if (!isEndPointAvailable(dstPointCode, BizStatus.Fx_Off_Line, "ROLLER_MOVE")) { + return dstPointCode + "点位有任务,请稍后再试!"; } // 生成任务 AgvTask agvTask = agvTaskService.createAgvTask(BizStatus.Fx_Off_Line, null, srcPointCode, dstPointCode, "ROLLER_MOVE"); - // 下发任务 - kmReService.sendAgvTask(agvTask, kmReService.sendAgvTaskGtJson(agvTask)); + return "呼叫成功"; + } - private void moveFxBack(TransTask transTask) { + private String moveFxBack(TransTask transTask) { String srcPointCode = transTask.getPointCode(); if (!"FX001".equals(srcPointCode)) { - throw new BadRequestException("返修点位不正确,请核实"); + return "返修点位不正确,请核实"; } //根据状态查询任务 List agvTaskList = agvTaskService.findByStatus(BizStatus.ARRIVED); if (agvTaskList.isEmpty()) { - throw new BadRequestException("任务还未达到FX001返修点,请稍后再试!"); + return "AGV还未达到FX001返修点,请稍后再试!"; } AgvTask agvTask = agvTaskList.get(0); //任务放行 kmReService.sendAgvTaskToContainer(UrlApi.operationFeedback(), kmReService.operationFeedbackJson(agvTask)); + + return "放行成功"; } - private void moveJLBack(TransTask transTask) { + private String moveJLBack(TransTask transTask) { //起点 - Point srcPoint = pointService.validatePoint(transTask.getPointCode()); - Stock stock = stockService.findByPointCode(srcPoint.getCode()); - if (stock == null) { - throw new BadRequestException(srcPoint.getCode() + "点位没有货架!"); + Point srcPoint = pointRepository.findByCode(transTask.getPointCode()); + if (srcPoint == null) { + return transTask.getPointCode() + "点位不存在!"; } + //容器 + Stock stock = stockService.findByPointCode(srcPoint.getCode()); + String dstAreaCode = AreaNameDic.XJJLQ.equals(srcPoint.getArea().getName()) ? AreaNameDic.XJFBCQ : AreaNameDic.DJFBCQ; List endPointList = pointService.queryPoints(null, BaseStatus.FREE, BaseStatus.BOX, dstAreaCode); if (endPointList.isEmpty()) { - throw new BadRequestException(dstAreaCode.equals(AreaNameDic.XJFBCQ) ? "小件翻包存储区" : "大件翻包存储区" + "没有空闲点位!"); + // 没有空车的处理逻辑 + if (!isSrcPointAvailable(srcPoint.getCode(), BizStatus.CALL_RETURN, "RACK_MOVE")) { + return srcPoint.getCode() + "点位有任务,请稍后再试!"; + } + //生成agv任务进行等待 + agvTaskService.createAgvTask(BizStatus.CALL_RETURN, stock, srcPoint.getCode(), null, "RACK_MOVE"); + return dstAreaCode.equals(AreaNameDic.XJFBCQ) ? "小件翻包存储区" : "大件翻包存储区" + "没有空闲点位!"; } Point endPoint = endPointList.get(0); - // 验证终点是否有任务 - if (!agvTaskService.findByEndSlotCode(endPoint.getCode(), BizStatus.CALL_RETURN, "RACK_MOVE")) { - throw new BadRequestException(endPoint.getCode() + "点位有任务,请稍后再试!"); + if (!isEndPointAvailable(endPoint.getCode(), BizStatus.CALL_RETURN, "RACK_MOVE")) { + return endPoint.getCode() + "点位有任务,请稍后再试!"; } // 生成任务 AgvTask agvTask = agvTaskService.createAgvTask(BizStatus.CALL_RETURN, stock, srcPoint.getCode(), endPoint.getCode(), "RACK_MOVE"); + synchronized (endPoint) { + // 更新点位状态 + pointService.usedPoint(endPoint); + //占用容器 + stockService.usedStock(stock, srcPoint, BaseStatus.USED); + } + return "呼叫成功"; } } diff --git a/youchain-system/src/main/java/com/youchain/businessdata/service/impl/TaskServiceImpl.java b/youchain-system/src/main/java/com/youchain/businessdata/service/impl/TaskServiceImpl.java index a27b86d..fcdb972 100644 --- a/youchain-system/src/main/java/com/youchain/businessdata/service/impl/TaskServiceImpl.java +++ b/youchain-system/src/main/java/com/youchain/businessdata/service/impl/TaskServiceImpl.java @@ -141,8 +141,8 @@ public class TaskServiceImpl implements TaskService { } @Override - public List findByPickNotAllTask(Long pickId) { - return taskRepository.findByPickNotAllTask(pickId); + public List findByPickNotAllTask() { + return taskRepository.findByPickNotAllTask(); } @Override @@ -238,9 +238,9 @@ public class TaskServiceImpl implements TaskService { @Override @Transactional(rollbackFor = Exception.class) - public void materialPick(Pick pick) { + public void materialPick() { AgvTask agvTask = null; - List taskList = this.findByPickNotAllTask(pick.getId()); + List taskList = this.findByPickNotAllTask(); for (Task task : taskList) { /*生成搬运任务*/ List agvTaskList = agvTaskService.findRepeat(task.getSrcStockCode(), task.getSrcPointCode(), task.getDstPointCode()); @@ -257,11 +257,6 @@ public class TaskServiceImpl implements TaskService { task.setTaskStatus(agvTask.getStatus()); taskRepository.save(task); } - - /*更新出库单状态*//* - pick.setStatus(BizStatus.PICKUP); - pickService.update(pick);*/ - } @Override @@ -301,47 +296,38 @@ public class TaskServiceImpl implements TaskService { @Override @Transactional(rollbackFor = Exception.class) public void callJlTask(Pick pick) { - if (pick.getStock() == null) { - throw new BadRequestException(pick.getGdCode() + "工单未翻包拣货!"); - } - if (pick.getCallPoint() == null) { - throw new BadRequestException(pick.getGdCode() + "工单没有叫料请求!"); - } + //绑定任务 List taskList = this.findByPickAllTask(pick.getId()); if (taskList.isEmpty()) { - throw new BadRequestException(pick.getGdCode() + "没有翻包拣货任务!"); + return; } - //起点 - String[] stocks = pick.getStock().split(","); - String stockCode = stocks[stocks.length - 1]; - Stock stock = stockService.validateStock(stockCode); - Point srcPoint = stock.getPoint(); //终点 String[] points = pick.getCallPoint().split(","); String endPointCode = points[points.length - 1]; Point endPoint = pointService.queryPoint(endPointCode, null, null, null); - //创建任务 - if (!agvTaskService.findByEndSlotCode(endPoint.getCode(), BizStatus.CALL_PICK, "RACK_MOVE")) { - throw new BadRequestException(endPoint.getCode() + "点位有任务,请稍后再试!"); - } - AgvTask agvTask = agvTaskService.createAgvTask(BizStatus.CALL_PICK, stock, srcPoint.getCode(), endPoint.getCode(), "RACK_MOVE"); + + /* AgvTask agvTask = agvTaskService.createAgvTask(BizStatus.CALL_PICK, stock, srcPoint.getCode(), endPoint.getCode(), "RACK_MOVE"); agvTask.setLineSlotCode(pick.getCode()); - agvTaskService.update(agvTask); - + agvTaskService.update(agvTask);*/ + AgvTask agvTask = null; for (Task task : taskList) { + List agvTasks = agvTaskService.findRepeat(task.getDstStockCode(), task.getDstPointCode(), endPoint.getCode()); + if (agvTasks.isEmpty()) { + //创建任务 + agvTask = agvTaskService.createAgvTask(BizStatus.JL_Back, task.getDstStock(), task.getDstPointCode(), endPoint.getCode(), "RACK_MOVE"); + agvTask.setLineSlotCode(pick.getCode()); + agvTaskService.update(agvTask); + } else { + agvTask = agvTasks.get(0); + } task.setCallAgvTaskId(agvTask.getId()); taskRepository.save(task); } - //起点占用 - pointService.usedPoint(srcPoint); - - //终点占用 - pointService.usedPoint(endPoint); } @@ -619,16 +605,6 @@ public class TaskServiceImpl implements TaskService { pickDetail.setPickedQty(pickDetail.getPickedQty() + moveQty); pickDetailService.update(pickDetail); - Pick pick = pickDetail.getPick(); - - if (pick.getStock() == null || pick.getStock().length() <= 0) { - pick.setStock(dstStock.getCode()); - } else if (!dstStock.getCode().equals(pick.getStock())) { - pick.setStock(pick.getStock() + "," + dstStock.getCode()); - } - pickService.update(pick); - - //容器占用 stockService.usedStock(dstStock, dstStock.getPoint(), BaseStatus.USED); diff --git a/youchain-system/src/main/java/com/youchain/modules/quartz/task/blTask.java b/youchain-system/src/main/java/com/youchain/modules/quartz/task/blTask.java new file mode 100644 index 0000000..0828107 --- /dev/null +++ b/youchain-system/src/main/java/com/youchain/modules/quartz/task/blTask.java @@ -0,0 +1,75 @@ +package com.youchain.modules.quartz.task; + +import com.youchain.basicdata.domain.Point; +import com.youchain.basicdata.domain.Stock; +import com.youchain.basicdata.service.StockService; +import com.youchain.businessdata.domain.AgvTask; +import com.youchain.businessdata.service.AgvTaskService; +import com.youchain.businessdata.service.KMReService; +import com.youchain.businessdata.service.PickService; +import com.youchain.businessdata.service.TaskService; +import com.youchain.exception.BadRequestException; +import com.youchain.utils.BizStatus; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * 备料任务 + */ +@Slf4j +@Service +public class blTask { + + + @Autowired + public StockService stockService; + + @Autowired + public PickService pickService; + + @Autowired + public TaskService taskService; + + @Autowired + public AgvTaskService agvTaskService; + + @Autowired + public KMReService kmReService; + + // 定义异常信息常量 + private static final String NO_EMPTY_SHELVES_ERROR_MSG = "没有备料任务!"; + + // 定义一个对象作为锁 + private final Object lock = new Object(); + + /** + * 轮询下发备料任务、叫料任务、 + */ + public void sendAgvBl() { + List agvTaskList = agvTaskService.findOpenByAgvTask(BizStatus.PICK); + if (agvTaskList.isEmpty()) { + throw new BadRequestException(NO_EMPTY_SHELVES_ERROR_MSG); + } + synchronized (lock) { + for (AgvTask agvTask : agvTaskList) { + processAgvTask(agvTask); + } + } + + } + + private void processAgvTask(AgvTask agvTask) { + //目标点没有托盘继续下发下一个任务 + String endSlotCode = agvTask.getEndSlotCode(); + Stock stock = stockService.findByPointCode(endSlotCode); + if (stock == null) { + boolean isTaskFound = agvTaskService.findByCcEndSlotCode(endSlotCode, BizStatus.PICK, "FORKLIFT_MOVE"); + if (isTaskFound) { + kmReService.sendAgvTask(agvTask, kmReService.sendAgvTaskCcJson(agvTask)); + } + } + } +} diff --git a/youchain-system/src/main/java/com/youchain/modules/quartz/task/cpLineTask.java b/youchain-system/src/main/java/com/youchain/modules/quartz/task/cpLineTask.java new file mode 100644 index 0000000..7455fca --- /dev/null +++ b/youchain-system/src/main/java/com/youchain/modules/quartz/task/cpLineTask.java @@ -0,0 +1,96 @@ +package com.youchain.modules.quartz.task; + +import com.youchain.basicdata.domain.Point; +import com.youchain.basicdata.service.PointService; +import com.youchain.basicdata.service.StockService; +import com.youchain.businessdata.domain.AgvTask; +import com.youchain.businessdata.service.AgvTaskService; +import com.youchain.businessdata.service.KMReService; +import com.youchain.exception.BadRequestException; +import com.youchain.utils.AreaNameDic; +import com.youchain.utils.BaseStatus; +import com.youchain.utils.BizStatus; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * 成品下线任务 + */ +@Slf4j +@Service +public class cpLineTask { + + @Autowired + public StockService stockService; + + @Autowired + private PointService pointService; + + @Autowired + public AgvTaskService agvTaskService; + + @Autowired + public KMReService kmReService; + + // 定义异常信息常量 + private static final String NO_EMPTY_SHELVES_ERROR_MSG = "成品入库区和成品入库缓存区都没有空闲点位,请及时处理!"; + // 定义一个对象作为锁 + private final Object lock = new Object(); + + public void sendAgvCpOffLine() { + // 使用同步块确保线程安全 + synchronized (lock) { + // 获取处于特定业务状态的AGV任务列表 + List agvTaskList = agvTaskService.findOpenByAgvTask(BizStatus.Cp_Off_Line); + // 如果任务列表为空,直接返回,避免不必要的处理 + if (agvTaskList.isEmpty()) { + return; + } + // 遍历AGV任务列表 + for (AgvTask agvTask : agvTaskList) { + processAgvTask(agvTask); + } + } + } + + private void processAgvTask(AgvTask agvTask) { + if (agvTask.getEndSlotCode() != null) { + kmReService.sendAgvTask(agvTask, kmReService.sendAgvTaskHjJson(agvTask)); + } else { + // 查找可用的结束点 + Point endPoint = findAvailableEndPoint(); + if (endPoint != null) { + updateAgvTaskWithEndPoint(agvTask, endPoint); + kmReService.sendAgvTask(agvTask, kmReService.sendAgvTaskHjJson(agvTask)); + } else { + // 若未找到可用结束点,抛出异常 + throw new BadRequestException(NO_EMPTY_SHELVES_ERROR_MSG); + } + } + } + + private void updateAgvTaskWithEndPoint(AgvTask agvTask, Point endPoint) { + // 设置任务的结束插槽代码 + agvTask.setEndSlotCode(endPoint.getCode()); + // 更新AGV任务信息 + agvTaskService.update(agvTask); + } + + /** + * 查找可用的终点点位,优先从成品入库区查找,若没有则从成品下线缓存区查找 + * + * @return 可用的终点点位,如果没有则返回null + */ + private Point findAvailableEndPoint() { + List endPointList = pointService.queryPoints(null, BaseStatus.FREE, BaseStatus.BOX, AreaNameDic.CPRKQ); + if (endPointList.isEmpty()) { + endPointList = pointService.queryPoints(null, BaseStatus.FREE, BaseStatus.BOX, AreaNameDic.CPXXHC); + } + return endPointList.isEmpty() ? null : endPointList.get(0); + } + + +} diff --git a/youchain-system/src/main/java/com/youchain/modules/quartz/task/cpUpTask.java b/youchain-system/src/main/java/com/youchain/modules/quartz/task/cpUpTask.java new file mode 100644 index 0000000..d57af03 --- /dev/null +++ b/youchain-system/src/main/java/com/youchain/modules/quartz/task/cpUpTask.java @@ -0,0 +1,91 @@ +package com.youchain.modules.quartz.task; + +import com.youchain.basicdata.domain.Stock; +import com.youchain.basicdata.service.StockService; +import com.youchain.businessdata.domain.AgvTask; +import com.youchain.businessdata.service.AgvTaskService; +import com.youchain.businessdata.service.KMReService; +import com.youchain.exception.BadRequestException; +import com.youchain.utils.AreaNameDic; +import com.youchain.utils.BaseStatus; +import com.youchain.utils.BizStatus; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * 成品上线任务 + */ +@Slf4j +@Service +public class cpUpTask { + + @Autowired + public StockService stockService; + + @Autowired + public AgvTaskService agvTaskService; + + @Autowired + public KMReService kmReService; + + // 定义异常信息常量 + private static final String NO_EMPTY_SHELVES_ERROR_MSG = "成品入库区和成品入库缓存区都没有空货架,请及时解绑容器!"; + + private final Object lock = new Object(); + + /** + * 轮询下发成品上线任务 + */ + public void sendAgvCpOffUp() { + synchronized (lock) { + List agvTaskList = agvTaskService.findOpenByAgvTask(BizStatus.Cp_Off_Up); + if (agvTaskList.isEmpty()) { + return; + } + // 遍历AGV任务列表 + for (AgvTask agvTask : agvTaskList) { + processAgvTask(agvTask); + } + } + } + + private List getEmptyStockList() { + List emptyStockList = stockService.findByFreeOrUsedStock(AreaNameDic.CPRKHCQ, BaseStatus.FREE); + if (emptyStockList.isEmpty()) { + emptyStockList = stockService.findByFreeOrUsedStock(AreaNameDic.CPRKQ, BaseStatus.FREE); + } + return emptyStockList; + } + + private void processAgvTask(AgvTask agvTask) { + if (agvTask.getStockCode() != null && agvTask.getStartSlotCode() != null) { + //直接下发 + kmReService.sendAgvTask(agvTask, kmReService.sendAgvTaskHjJson(agvTask)); + } else { + //排队任务 查询成品入库区是否有空车 + List stocks = getEmptyStockList(); + if (!stocks.isEmpty()) { + // 获取第一个空库存 + Stock stock = stocks.get(0); + // 更新AGV任务的库存代码和起始插槽代码 + updateAgvTask(agvTask, stock); + kmReService.sendAgvTask(agvTask, kmReService.sendAgvTaskHjJson(agvTask)); + } else { + // 若没有空货架,抛出异常 + throw new BadRequestException(NO_EMPTY_SHELVES_ERROR_MSG); + } + } + } + + private void updateAgvTask(AgvTask agvTask, Stock stock) { + // 设置AGV任务的库存代码 + agvTask.setStockCode(stock.getCode()); + // 设置AGV任务的起始插槽代码 + agvTask.setStartSlotCode(stock.getPoint() == null ? null : stock.getPoint().getCode()); + // 更新AGV任务 + agvTaskService.update(agvTask); + } +} diff --git a/youchain-system/src/main/java/com/youchain/modules/quartz/task/jlBackTask.java b/youchain-system/src/main/java/com/youchain/modules/quartz/task/jlBackTask.java new file mode 100644 index 0000000..2488763 --- /dev/null +++ b/youchain-system/src/main/java/com/youchain/modules/quartz/task/jlBackTask.java @@ -0,0 +1,103 @@ +package com.youchain.modules.quartz.task; + +import com.youchain.basicdata.domain.Point; +import com.youchain.basicdata.domain.Stock; +import com.youchain.basicdata.repository.PointRepository; +import com.youchain.basicdata.service.PointService; +import com.youchain.basicdata.service.StockService; +import com.youchain.businessdata.domain.AgvTask; +import com.youchain.businessdata.service.AgvTaskService; +import com.youchain.businessdata.service.KMReService; +import com.youchain.exception.BadRequestException; +import com.youchain.utils.AreaNameDic; +import com.youchain.utils.BaseStatus; +import com.youchain.utils.BizStatus; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * 叫料返空任务 + */ +@Slf4j +@Service +public class jlBackTask { + + @Autowired + public StockService stockService; + + @Autowired + private PointService pointService; + + @Autowired + public AgvTaskService agvTaskService; + + @Autowired + public KMReService kmReService; + + // 定义异常信息常量 + private static final String NO_EMPTY_SHELVES_ERROR_MSG = "区没有空闲点位,请及时处理!"; + + // 定义一个对象作为锁 + private final Object lock = new Object(); + + public void sendAgvJlBack() { + // 使用同步块确保线程安全 + synchronized (lock) { + // 获取处于特定业务状态的AGV任务列表 + List agvTaskList = agvTaskService.findOpenByAgvTask(BizStatus.JL_Back); + // 如果任务列表为空,直接返回,避免不必要的处理 + if (agvTaskList.isEmpty()) { + return; + } + // 遍历AGV任务列表 + for (AgvTask agvTask : agvTaskList) { + processAgvTask(agvTask); + } + } + } + + private void processAgvTask(AgvTask agvTask) { + if (agvTask.getEndSlotCode() != null) { + kmReService.sendAgvTask(agvTask, kmReService.sendAgvTaskHjJson(agvTask)); + } else { + // 查找可用的结束点 + String areaName = getAreaName(agvTask.getStartSlotCode()); + Point endPoint = findAvailableEndPoint(areaName); + if (endPoint != null) { + updateAgvTaskWithEndPoint(agvTask, endPoint); + } else { + // 若未找到可用结束点,抛出异常 + throw new BadRequestException(areaName+NO_EMPTY_SHELVES_ERROR_MSG); + } + } + } + + private void updateAgvTaskWithEndPoint(AgvTask agvTask, Point endPoint) { + // 设置任务的结束插槽代码 + agvTask.setEndSlotCode(endPoint.getCode()); + // 更新AGV任务信息 + agvTaskService.update(agvTask); + } + + private String getAreaName(String pointCode) { + Point srcPoint = pointService.validatePoint(pointCode); + Stock stock = stockService.findByPointCode(srcPoint.getCode()); + String areaName = AreaNameDic.XJJLQ.equals(srcPoint.getArea().getName()) ? AreaNameDic.XJFBCQ : AreaNameDic.DJFBCQ; + return areaName; + } + + /** + * 查找可用的终点点位,优先从成品入库区查找,若没有则从成品下线缓存区查找 + * + * @return 可用的终点点位,如果没有则返回null + */ + private Point findAvailableEndPoint(String areaName) { + String dstAreaCode = AreaNameDic.XJJLQ.equals(areaName) ? AreaNameDic.XJFBCQ : AreaNameDic.DJFBCQ; + List endPointList = pointService.queryPoints(null, BaseStatus.FREE, BaseStatus.BOX, dstAreaCode); + + return endPointList.isEmpty() ? null : endPointList.get(0); + } +} diff --git a/youchain-system/src/main/java/com/youchain/modules/quartz/task/jlTask.java b/youchain-system/src/main/java/com/youchain/modules/quartz/task/jlTask.java new file mode 100644 index 0000000..51bd6d5 --- /dev/null +++ b/youchain-system/src/main/java/com/youchain/modules/quartz/task/jlTask.java @@ -0,0 +1,67 @@ +package com.youchain.modules.quartz.task; + +import com.youchain.basicdata.domain.Point; +import com.youchain.basicdata.domain.Stock; +import com.youchain.basicdata.service.StockService; +import com.youchain.businessdata.domain.AgvTask; +import com.youchain.businessdata.service.AgvTaskService; +import com.youchain.businessdata.service.KMReService; +import com.youchain.businessdata.service.PickService; +import com.youchain.businessdata.service.TaskService; +import com.youchain.exception.BadRequestException; +import com.youchain.utils.BizStatus; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * 备料任务 + */ +@Slf4j +@Service +public class jlTask { + + + @Autowired + public StockService stockService; + + @Autowired + public PickService pickService; + + @Autowired + public TaskService taskService; + + @Autowired + public AgvTaskService agvTaskService; + + @Autowired + public KMReService kmReService; + + // 定义异常信息常量 + private static final String NO_EMPTY_SHELVES_ERROR_MSG = "没有叫料任务!"; + + // 定义一个对象作为锁 + private final Object lock = new Object(); + + /** + * 下发叫料任务 + */ + public void sendAgvJl() { + List agvTaskList = agvTaskService.findOpenByAgvTask(BizStatus.CALL_PICK); + if (agvTaskList.isEmpty()) { + throw new BadRequestException(NO_EMPTY_SHELVES_ERROR_MSG); + } + synchronized (lock) { + for (AgvTask agvTask : agvTaskList) { + processAgvTask(agvTask); + } + } + + } + + private void processAgvTask(AgvTask agvTask) { + kmReService.sendAgvTask(agvTask, kmReService.sendAgvTaskHjJson(agvTask)); + } +} diff --git a/youchain-system/src/main/java/com/youchain/modules/quartz/task/pickTask.java b/youchain-system/src/main/java/com/youchain/modules/quartz/task/pickTask.java index 7031f1a..cdb1b3a 100644 --- a/youchain-system/src/main/java/com/youchain/modules/quartz/task/pickTask.java +++ b/youchain-system/src/main/java/com/youchain/modules/quartz/task/pickTask.java @@ -48,7 +48,7 @@ public class pickTask { * 分配出库单 */ public void allocatePick() { - List statuses = Arrays.asList(BizStatus.OPEN, BizStatus.ASSIGN); + List statuses = Arrays.asList(BizStatus.OPEN, BizStatus.ASSIGN, BizStatus.PICKUP); List pickList = pickService.findByPickStatus(statuses, null); if (pickList.isEmpty()) { throw new BadRequestException("无待分配的成品出库单,分配失败!"); @@ -59,31 +59,18 @@ public class pickTask { } } + //生成备料任务 + taskService.materialPick(); + } - /** - * 轮询已分配的出库单,生成备料任务 - */ - public void pickAgvTask() { - /*查询分配完成的出库单*/ - List statuses = Arrays.asList(BizStatus.ASSIGN, BizStatus.ALLOCATE); - List pickList = pickService.findByPickStatus(statuses, null); - if (pickList.isEmpty()) { - throw new BadRequestException("无已分配的出库单,下发任务失败!"); - } - for (Pick pick : pickList) { - synchronized (pick) { - taskService.materialPick(pick); - } - } - } /** - * 生成叫料搬运任务 + * 生成叫料任务 */ - public void callJlTask() { - /*查询拣货完成完成的出库单*/ + public void createJlTask() { + /* *//*查询拣货完成完成的出库单*//* List statuses = Arrays.asList(BizStatus.PICKUP, BizStatus.PICK_ALL); List pickList = pickService.findByPickStatus(statuses, true); if (pickList.isEmpty()) { @@ -93,36 +80,7 @@ public class pickTask { synchronized (pick) { taskService.callJlTask(pick); } - - } - } - - /** - * 轮询下发备料任务、叫料任务、叫料返库任务 - */ - public void sendTaskBlAndJl() { - List agvTaskList = agvTaskService.findOpenByAgvTask(); - if (agvTaskList.isEmpty()) { - throw new BadRequestException("无备料任务或无叫料任务!"); - } - for (AgvTask agvTask : agvTaskList) { - synchronized (agvTask) { - if (BizStatus.PICK.equals(agvTask.getType())) { - //目标点没有托盘继续下发下一个任务 - String endSlotCode = agvTask.getEndSlotCode(); - Stock stock = stockService.findByPointCode(endSlotCode); - if (stock == null) { - boolean isTaskFound = agvTaskService.findByCcEndSlotCode(endSlotCode, BizStatus.PICK, "FORKLIFT_MOVE"); - if (isTaskFound) { - kmReService.sendAgvTask(agvTask, kmReService.sendAgvTaskCcJson(agvTask)); - } - } - } else { - kmReService.sendAgvTask(agvTask, kmReService.sendAgvTaskHjJson(agvTask)); - } - } - - } + }*/ } } diff --git a/youchain-system/src/main/java/com/youchain/utils/BizStatus.java b/youchain-system/src/main/java/com/youchain/utils/BizStatus.java index 9cac04f..ce0b5f4 100644 --- a/youchain-system/src/main/java/com/youchain/utils/BizStatus.java +++ b/youchain-system/src/main/java/com/youchain/utils/BizStatus.java @@ -142,7 +142,7 @@ public interface BizStatus { String Fx_Back = "Fx_Back"; /** - * 任务类型-返修载具送回 + * 任务类型-叫料返空 */ String JL_Back = "JL_Back";