no message

main
HUOJIN\92525 2025-02-20 14:31:32 +08:00
parent 9ebba40069
commit 0514b2b39f
20 changed files with 772 additions and 320 deletions

View File

@ -216,6 +216,9 @@ public class BydAppServiceImpl implements BydAppService {
//刷新出库单状态 //刷新出库单状态
pickService.refreshPickStatus(task.getPickDetail().getPick()); pickService.refreshPickStatus(task.getPickDetail().getPick());
//生成叫料任务
taskService.callJlTask(pick);
//成品原托盘返库;单品不回库 //成品原托盘返库;单品不回库
if (BaseStatus.GD_TYPE_CT.equals(pick.getOrderType())) { if (BaseStatus.GD_TYPE_CT.equals(pick.getOrderType())) {
this.returnFBAgvTask(task); this.returnFBAgvTask(task);

View File

@ -43,12 +43,6 @@ public interface StockRepository extends JpaRepository<Stock, Long>, JpaSpecific
@Query(" from Stock s where s.point.code = :pointCode") @Query(" from Stock s where s.point.code = :pointCode")
Stock findByPointCode(String pointCode); Stock findByPointCode(String pointCode);
@Query(" from Stock s where s.point.area.name = :areaName " + @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.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') ) ")
List<Stock> findByFreeOrUsedStock(String areaName, String status); List<Stock> findByFreeOrUsedStock(String areaName, String status);
} }

View File

@ -1,18 +1,18 @@
/* /*
* Copyright 2019-2020 Zheng Jie * Copyright 2019-2020 Zheng Jie
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
* You may obtain a copy of the License at * You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package com.youchain.businessdata.domain; package com.youchain.businessdata.domain;
import com.youchain.base.BaseEntity; import com.youchain.base.BaseEntity;
@ -20,6 +20,7 @@ import lombok.Data;
import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.bean.BeanUtil;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import cn.hutool.core.bean.copier.CopyOptions; import cn.hutool.core.bean.copier.CopyOptions;
import javax.persistence.*; import javax.persistence.*;
import javax.validation.constraints.*; import javax.validation.constraints.*;
import java.sql.Timestamp; import java.sql.Timestamp;
@ -27,14 +28,14 @@ import java.io.Serializable;
import java.util.Date; import java.util.Date;
/** /**
* @website https://eladmin.vip * @author baobinglin
* @description / * @website https://eladmin.vip
* @author baobinglin * @description /
* @date 2023-08-18 * @date 2023-08-18
**/ **/
@Entity @Entity
@Data @Data
@Table(name="data_agv_task") @Table(name = "data_agv_task")
public class AgvTask extends BaseEntity implements Serializable { public class AgvTask extends BaseEntity implements Serializable {
@Id @Id
@GeneratedValue(strategy = GenerationType.IDENTITY) @GeneratedValue(strategy = GenerationType.IDENTITY)
@ -43,17 +44,14 @@ public class AgvTask extends BaseEntity implements Serializable {
private Long id; private Long id;
@Column(name = "`stock_code`") @Column(name = "`stock_code`")
@NotBlank
@ApiModelProperty(value = "容器号") @ApiModelProperty(value = "容器号")
private String stockCode; private String stockCode;
@Column(name = "`stock_type_code`") @Column(name = "`stock_type_code`")
@NotBlank
@ApiModelProperty(value = "") @ApiModelProperty(value = "")
private String stockTypeCode; private String stockTypeCode;
@Column(name = "`start_slot_code`",nullable = false) @Column(name = "`start_slot_code`")
@NotBlank
@ApiModelProperty(value = "起点位置") @ApiModelProperty(value = "起点位置")
private String startSlotCode; private String startSlotCode;
@ -65,8 +63,7 @@ public class AgvTask extends BaseEntity implements Serializable {
@ApiModelProperty(value = "设备编号") @ApiModelProperty(value = "设备编号")
private String slotCode; private String slotCode;
@Column(name = "`status`",nullable = false) @Column(name = "`status`", nullable = false)
@NotBlank
@ApiModelProperty(value = "任务状态") @ApiModelProperty(value = "任务状态")
private String status; private String status;
@ -78,17 +75,16 @@ public class AgvTask extends BaseEntity implements Serializable {
@ApiModelProperty(value = "") @ApiModelProperty(value = "")
private String jobId; private String jobId;
@Column(name = "`job_type`",nullable = false) @Column(name = "`job_type`", nullable = false)
@NotBlank
@ApiModelProperty(value = "工作类型") @ApiModelProperty(value = "工作类型")
/** /**
* 01 * 01
*/ */
private String jobType="01"; private String jobType = "01";
@Column(name = "`job_priority`") @Column(name = "`job_priority`")
@ApiModelProperty(value = "优先级") @ApiModelProperty(value = "优先级")
private Integer jobPriority=1; private Integer jobPriority = 1;
@Column(name = "`job_priority_type`") @Column(name = "`job_priority_type`")
@ApiModelProperty(value = "强制优先级") @ApiModelProperty(value = "强制优先级")
@ -112,7 +108,7 @@ public class AgvTask extends BaseEntity implements Serializable {
@Column(name = "`be_scan`") @Column(name = "`be_scan`")
@ApiModelProperty(value = "是否扫描") @ApiModelProperty(value = "是否扫描")
private Integer beScan=0; private Integer beScan = 0;
@Column(name = "`line_slot_code`") @Column(name = "`line_slot_code`")
@ApiModelProperty(value = "出库单号") @ApiModelProperty(value = "出库单号")
@ -137,6 +133,7 @@ public class AgvTask extends BaseEntity implements Serializable {
/** /**
* *
*
* @param type -/ * @param type -/
* @param stockCode * @param stockCode
* @param startSlotCode (;; * @param startSlotCode (;;
@ -145,17 +142,17 @@ public class AgvTask extends BaseEntity implements Serializable {
* ) ; 14;1-001;false * ) ; 14;1-001;false
* @param status * @param status
* @param jobType - ( ) :RACK_MOVE * @param jobType - ( ) :RACK_MOVE
*
*/ */
public AgvTask(String type,String stockCode,String startSlotCode,String endSlotCode,String status,String jobType){ public AgvTask(String type, String stockCode, String startSlotCode, String endSlotCode, String status, String jobType) {
this.type=type; this.type = type;
this.stockCode=stockCode; this.stockCode = stockCode;
this.startSlotCode=startSlotCode; this.startSlotCode = startSlotCode;
this.endSlotCode=endSlotCode; this.endSlotCode = endSlotCode;
this.status=status; this.status = status;
this.jobType=jobType; 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));
} }
} }

View File

@ -51,23 +51,23 @@ public class Pick extends BaseEntity implements Serializable {
@ApiModelProperty(value = "序号") @ApiModelProperty(value = "序号")
private int lineNo; private int lineNo;
@Column(name = "`task_code`",nullable = false) @Column(name = "`task_code`", nullable = false)
@ApiModelProperty(value = "任务编号") @ApiModelProperty(value = "任务编号")
private String taskCode; private String taskCode;
@Column(name = "`code`",nullable = false) @Column(name = "`code`", nullable = false)
@ApiModelProperty(value = "出库单号") @ApiModelProperty(value = "出库单号")
private String code; private String code;
@Column(name = "`gd_code`",nullable = false) @Column(name = "`gd_code`", nullable = false)
@ApiModelProperty(value = "工单号") @ApiModelProperty(value = "工单号")
private String gdCode; private String gdCode;
@Column(name = "`station`",nullable = false) @Column(name = "`station`", nullable = false)
@ApiModelProperty(value = "需求工位") @ApiModelProperty(value = "需求工位")
private String station; private String station;
@Column(name = "`cp_code_or_dp_code`",nullable = false) @Column(name = "`cp_code_or_dp_code`", nullable = false)
@ApiModelProperty(value = "成品代码或单品代码") @ApiModelProperty(value = "成品代码或单品代码")
private String cpCodeOrDpCode; private String cpCodeOrDpCode;
@ -100,7 +100,10 @@ public class Pick extends BaseEntity implements Serializable {
@Column(name = "`source_id`") @Column(name = "`source_id`")
@ApiModelProperty(value = "回传状态") @ApiModelProperty(value = "回传状态")
private Long sourceId;/** 0失败1.成功*/ private Long sourceId;
/**
* 01.
*/
@OneToOne @OneToOne
@JoinColumn(name = "`dept_id`", nullable = false) @JoinColumn(name = "`dept_id`", nullable = false)
@ -108,6 +111,10 @@ public class Pick extends BaseEntity implements Serializable {
@ApiModelProperty(value = "仓库") @ApiModelProperty(value = "仓库")
private Dept dept; private Dept dept;
@Column(name = "`priority`")
@ApiModelProperty(value = "优先级")
private int priority=0;
public void copy(Pick source) { public void copy(Pick source) {
BeanUtil.copyProperties(source, this, CopyOptions.create().setIgnoreNullValue(true)); BeanUtil.copyProperties(source, this, CopyOptions.create().setIgnoreNullValue(true));
} }

View File

@ -36,13 +36,14 @@ public interface AgvTaskRepository extends JpaRepository<AgvTask, Long>, JpaSpec
* @param stockCode * @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') ") @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<AgvTask> findRepeat(String stockCode,String srcPointCode,String endPointCode); List<AgvTask> 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 ") @Query(value = " from AgvTask agv where agv.type=:type and agv.status='OPEN' order by agv.createTime ")
List<AgvTask> findOpenByAgvTask(); List<AgvTask> findOpenByAgvTask(String type);
/** /**
* () * ()

View File

@ -51,8 +51,8 @@ public interface TaskRepository extends JpaRepository<Task, Long>, JpaSpecificat
* *
* @param pickId ID * @param pickId ID
*/ */
@Query("from Task t where t.pickDetail.pick.id =:pickId and t.planQty > t.moveQty and t.agvTask.id is null") @Query("from Task t where t.planQty > t.moveQty and t.agvTask.id is null")
List<Task> findByPickNotAllTask(Long pickId); List<Task> findByPickNotAllTask();
/** /**
* Task * Task

View File

@ -51,10 +51,10 @@ public class MesController {
String itemCode = zpjlZj.getItemCode();//物料代码 String itemCode = zpjlZj.getItemCode();//物料代码
String station = zpjlZj.getStation();//需求工位 String station = zpjlZj.getStation();//需求工位
String pointCode = zpjlZj.getPointCode();//需求点位 String pointCode = zpjlZj.getPointCode();//需求点位
mesService.itemCall(orderNo, itemCode, station, pointCode); String result = mesService.itemCall(orderNo, itemCode, station, pointCode);
return successResponse("叫料成功!"); return successResponse(result);
} catch (Exception e) { } catch (Exception e) {
return badResponse("叫料失败:" + e.getMessage()); return successResponse("叫料失败:" + e.getMessage());
} }
} }
@ -68,10 +68,10 @@ public class MesController {
String completeCode = zpjlCt.getCompleteCode();//成套代码 String completeCode = zpjlCt.getCompleteCode();//成套代码
String station = zpjlCt.getStation();//需求工位 String station = zpjlCt.getStation();//需求工位
String pointCode = zpjlCt.getPointCode();//需求点位 String pointCode = zpjlCt.getPointCode();//需求点位
mesService.bigItemCall(orderNo, completeCode, station, pointCode); String result = mesService.bigItemCall(orderNo, completeCode, station, pointCode);
return successResponse("叫料成功!"); return successResponse(result);
} catch (Exception e) { } catch (Exception e) {
return badResponse("叫料失败:" + e.getMessage()); return successResponse("叫料失败:" + e.getMessage());
} }
} }
@ -90,10 +90,10 @@ public class MesController {
@AnonymousAccess @AnonymousAccess
public ResponseEntity<Object> transTask(@Validated @RequestBody TransTask transTask) { public ResponseEntity<Object> transTask(@Validated @RequestBody TransTask transTask) {
try { try {
mesService.performTransportTask(transTask); String result = mesService.performTransportTask(transTask);
return successResponse("下发成功!"); return successResponse(result);
} catch (Exception e) { } catch (Exception e) {
return badResponse("下发失败!" + e.getMessage()); return successResponse("下发失败!" + e.getMessage());
} }
} }

View File

@ -110,6 +110,15 @@ public interface AgvTaskService {
*/ */
List<AgvTask> findRepeat(String stockCode, String srcPointCode, String endPointCode); List<AgvTask> findRepeat(String stockCode, String srcPointCode, String endPointCode);
/**
*
*
* @param startSlotCode
* @param type
* @param jobType
*/
Boolean findByStartSlotCode(String startSlotCode, String type, String jobType);
/** /**
* *
* *
@ -121,6 +130,7 @@ public interface AgvTaskService {
/** /**
* *
*
* @param endSlotCode * @param endSlotCode
* @param type * @param type
* @param jobType * @param jobType
@ -131,7 +141,7 @@ public interface AgvTaskService {
/** /**
* *
*/ */
List<AgvTask> findOpenByAgvTask(); List<AgvTask> findOpenByAgvTask(String type);
/** /**
* () * ()
@ -143,6 +153,7 @@ public interface AgvTaskService {
/** /**
* *
*
* @param status * @param status
* @return List<AgvTask> * @return List<AgvTask>
*/ */

View File

@ -21,7 +21,7 @@ public interface MesService {
* @param station-> * @param station->
* @param pointCode-> * @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 station->
* @param pointCode-> * @param pointCode->
*/ */
void bigItemCall(String gdNo, String completeCode, String station, String pointCode); String bigItemCall(String gdNo, String completeCode, String station, String pointCode);
/** /**
* *
* *
* @param transTask * @param transTask
*/ */
void performTransportTask(TransTask transTask); String performTransportTask(TransTask transTask);
} }

View File

@ -128,9 +128,8 @@ public interface TaskService {
/** /**
* Task * Task
* *
* @param pickId Id
*/ */
List<Task> findByPickNotAllTask(Long pickId); List<Task> findByPickNotAllTask();
/** /**
* Task * Task
@ -174,9 +173,8 @@ public interface TaskService {
/** /**
* *
* *
* @param pick
*/ */
void materialPick(Pick pick); void materialPick();
/** /**
* *

View File

@ -142,6 +142,18 @@ public class AgvTaskServiceImpl implements AgvTaskService {
return agvTaskRepository.findRepeat(stockCode, srcPointCode, endPointCode); 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<AgvTask> agvTaskList = query.getResultList();
return agvTaskList.isEmpty();
}
@Override @Override
public Boolean findByEndSlotCode(String endSlotCode, String type, String jobType) { public Boolean findByEndSlotCode(String endSlotCode, String type, String jobType) {
String hql = " from AgvTask agv " + String hql = " from AgvTask agv " +
@ -167,8 +179,8 @@ public class AgvTaskServiceImpl implements AgvTaskService {
} }
@Override @Override
public List<AgvTask> findOpenByAgvTask() { public List<AgvTask> findOpenByAgvTask(String type) {
return agvTaskRepository.findOpenByAgvTask(); return agvTaskRepository.findOpenByAgvTask(type);
} }
@Override @Override

View File

@ -9,6 +9,7 @@ import com.youchain.basicdata.domain.Item;
import com.youchain.basicdata.domain.Point; import com.youchain.basicdata.domain.Point;
import com.youchain.basicdata.domain.Stock; import com.youchain.basicdata.domain.Stock;
import com.youchain.basicdata.repository.ItemRepository; import com.youchain.basicdata.repository.ItemRepository;
import com.youchain.basicdata.repository.PointRepository;
import com.youchain.basicdata.service.ItemService; import com.youchain.basicdata.service.ItemService;
import com.youchain.basicdata.service.PointService; import com.youchain.basicdata.service.PointService;
import com.youchain.basicdata.service.StockService; import com.youchain.basicdata.service.StockService;
@ -40,7 +41,7 @@ import java.util.stream.Collectors;
@RequiredArgsConstructor @RequiredArgsConstructor
@Slf4j @Slf4j
public class MesServiceImpl implements MesService { public class MesServiceImpl implements MesService {
private final PointRepository pointRepository;
private final PickRepository pickRepository; private final PickRepository pickRepository;
private final PickDetailRepository pickDetailRepository; private final PickDetailRepository pickDetailRepository;
private final ItemRepository itemRepository; private final ItemRepository itemRepository;
@ -129,82 +130,55 @@ public class MesServiceImpl implements MesService {
@Override @Override
@Transactional(rollbackFor = Exception.class) @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); Pick pick = pickRepository.findByPick(gdNo, itemCode, station);
if (pick == null) { 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) { if (pick.getCallPoint() == null || pick.getCallPoint().length() <= 0) {
pick.setCallPoint(pointCode); pick.setCallPoint(pointCode);
} else if (!pointCode.equals(pick.getCallPoint())) { } else {
pick.setCallPoint(pick.getCallPoint() + "," + pointCode); pick.setCallPoint(pick.getCallPoint() + "," + pointCode);
} }
pick.setIsCall(true);
pickRepository.save(pick); pickRepository.save(pick);
return "叫料成功!";
taskService.callJlTask(pick);
} }
@Override @Override
@Transactional(rollbackFor = Exception.class) @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); Pick pick = pickRepository.findByPick(gdNo, completeCode, station);
if (pick == null) { 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) { if (pick.getCallPoint() == null || pick.getCallPoint().length() <= 0) {
pick.setCallPoint(pointCode); pick.setCallPoint(pointCode);
} else if (!pointCode.equals(pick.getCallPoint())) { } else {
pick.setCallPoint(pick.getCallPoint() + "," + pointCode); pick.setCallPoint(pick.getCallPoint() + "," + pointCode);
} }
pick.setIsCall(true);
pickRepository.save(pick); pickRepository.save(pick);
//taskService.callJlTask(pick);
taskService.callJlTask(pick); return "叫料成功!";
} }
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public void performTransportTask(TransTask transTask) { public String performTransportTask(TransTask transTask) {
switch (transTask.getTaskType()) { switch (transTask.getTaskType()) {
case BizStatus.Cp_Off_Up: case BizStatus.Cp_Off_Up:
moveCpOffUp(transTask.getPointCode());//呼叫空货架 return moveCpOffUp(transTask.getPointCode());//呼叫空货架
break;
case BizStatus.Cp_Off_Line: case BizStatus.Cp_Off_Line:
moveCpOffLine(transTask);//送满货架 return moveCpOffLine(transTask);//送满货架
break;
case BizStatus.Fx_Off_Line: case BizStatus.Fx_Off_Line:
moveFxOffLine(transTask);//返修呼叫空托盘、返修下线 return moveFxOffLine(transTask);//返修呼叫空托盘、返修下线
break;
case BizStatus.Fx_Back: case BizStatus.Fx_Back:
moveFxBack(transTask);//返修载具送回 return moveFxBack(transTask);//返修载具送回
break;
case BizStatus.JL_Back: case BizStatus.JL_Back:
moveJLBack(transTask);//叫料返空 return moveJLBack(transTask);//叫料返空
break;
default: default:
throw new BadRequestException("任务类型错误!"); return "任务类型错误!";
} }
} }
@ -271,102 +245,176 @@ public class MesServiceImpl implements MesService {
return pickDetail; return pickDetail;
} }
private void moveCpOffUp(String pointCode) { private String moveCpOffUp(String pointCode) {
// 从成品入库缓存区查询空车;没有在从成品入库区查询空车; //终点
Point endPoint = pointRepository.findByCode(pointCode);
// 查询空车
List<Stock> 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<Stock> getEmptyStockList() {
List<Stock> emptyStockList = stockService.findByFreeOrUsedStock(AreaNameDic.CPRKHCQ, BaseStatus.FREE); List<Stock> emptyStockList = stockService.findByFreeOrUsedStock(AreaNameDic.CPRKHCQ, BaseStatus.FREE);
if (emptyStockList.isEmpty()) { if (emptyStockList.isEmpty()) {
emptyStockList = stockService.findByFreeOrUsedStock(AreaNameDic.CPRKQ, BaseStatus.FREE); emptyStockList = stockService.findByFreeOrUsedStock(AreaNameDic.CPRKQ, BaseStatus.FREE);
if (emptyStockList.isEmpty()) {
throw new BadRequestException("成品入库区、成品入库缓存区都没有空车,请稍后再试!");
} }
} return emptyStockList;
//容器
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));
} }
private void moveCpOffLine(TransTask transTask) { /**
//查询下线缓存区是否有满货架; *
List<Stock> fullStockList = stockService.findByFreeOrUsedStock(AreaNameDic.CPXXHC, BaseStatus.USED); *
if (!fullStockList.isEmpty()) { * @param endPointCode
List<Point> endPointList = pointService.queryPoints(null, BaseStatus.FREE, BaseStatus.BOX, AreaNameDic.CPRKQ); * @return
if (!endPointList.isEmpty()) { */
//容器 private boolean isEndPointAvailable(String endPointCode, String type, String jobType) {
Stock fullStock = fullStockList.get(0); return agvTaskService.findByEndSlotCode(endPointCode, type, jobType);
//起点
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);
//占用容器
stockService.usedStock(fullStock, srcPoint, BaseStatus.USED);
} }
/**
//下发任务 *
kmReService.sendAgvTask(agvTask, kmReService.sendAgvTaskHjJson(agvTask)); *
} * @param startSlotCode
} * @return
*/
private boolean isSrcPointAvailable(String startSlotCode, String type, String jobType) {
return agvTaskService.findByStartSlotCode(startSlotCode, type, jobType);
}
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()); Stock stock = stockService.findByPointCode(srcPoint.getCode());
if (stock == null) {
throw new BadRequestException(srcPoint.getCode() + "点位没有货架!"); // 查找可用的终点点位
Point endPoint = findAvailableEndPoint();
if (endPoint == null) {
// 没有可用终点点位的处理逻辑
if (!isSrcPointAvailable(srcPoint.getCode(), BizStatus.Cp_Off_Line, "RACK_MOVE")) {
return srcPoint.getCode() + "点位有任务,请稍后再试!";
} }
List<Point> endPointList = pointService.queryPoints(null, BaseStatus.FREE, BaseStatus.BOX, AreaNameDic.CPRKQ); // 生成等待任务
if (endPointList.isEmpty()) { agvTaskService.createAgvTask(BizStatus.Cp_Off_Line, stock, srcPoint.getCode(), null, "RACK_MOVE");
endPointList = pointService.queryPoints(null, BaseStatus.FREE, BaseStatus.BOX, AreaNameDic.CPXXHC); return "成品入库区和成品下线缓存区都没有空闲点位,请稍后再试!";
if (endPointList.isEmpty()) {
throw new BadRequestException("成品入库区和成品下线缓存区都没有空闲点位!");
}
}
//终点
Point endPoint = endPointList.get(0);
//验证终点是否有任务
if (!agvTaskService.findByEndSlotCode(endPoint.getCode(), BizStatus.Cp_Off_Line, "RACK_MOVE")) {
// 直接在条件判断为false时抛出异常表示该点位有任务
throw new BadRequestException(endPoint.getCode() + "点位有任务,请稍后再试!");
} }
//创建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"); AgvTask agvTask = agvTaskService.createAgvTask(BizStatus.Cp_Off_Line, stock, srcPoint.getCode(), endPoint.getCode(), "RACK_MOVE");
// 同步更新终点点位状态和占用容器
synchronized (endPoint) { synchronized (endPoint) {
// 更新点位状态 // 更新点位状态
pointService.usedPoint(endPoint); pointService.usedPoint(endPoint);
//占用容器 // 占用容器
stockService.usedStock(stock, srcPoint, BaseStatus.USED); stockService.usedStock(stock, srcPoint, BaseStatus.USED);
} }
//下发任务 return "呼叫成功";
kmReService.sendAgvTask(agvTask, kmReService.sendAgvTaskHjJson(agvTask));
} }
private void moveFxOffLine(TransTask transTask) { /**
* 线
*
* @return null
*/
private Point findAvailableEndPoint() {
List<Point> 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<Stock> fullStockList = stockService.findByFreeOrUsedStock(AreaNameDic.CPXXHC, BaseStatus.USED);
if (!fullStockList.isEmpty()) {
// 取第一个满货架容器
Stock fullStock = fullStockList.get(0);
// 查找成品入库区的可用终点点位
List<Point> 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(); String srcPointCode = transTask.getPointCode();
//终点 //终点
@ -381,63 +429,78 @@ public class MesServiceImpl implements MesService {
} else if (gtLineMap.isOfflinePoint(srcPointCode)) { } else if (gtLineMap.isOfflinePoint(srcPointCode)) {
dstPointCode = gtLineMap.getValueByKey(srcPointCode); dstPointCode = gtLineMap.getValueByKey(srcPointCode);
} else { } else {
throw new BadRequestException(srcPointCode + "点位不存在,请核实"); return srcPointCode + "点位不存在,请核实!";
} }
// 验证终点是否有任务 // 验证终点是否有任务
if (!agvTaskService.findByEndSlotCode(dstPointCode, BizStatus.Fx_Off_Line, "ROLLER_MOVE")) { if (!isEndPointAvailable(dstPointCode, BizStatus.Fx_Off_Line, "ROLLER_MOVE")) {
throw new BadRequestException(dstPointCode + "点位有任务,请稍后再试!"); return dstPointCode + "点位有任务,请稍后再试!";
} }
// 生成任务 // 生成任务
AgvTask agvTask = agvTaskService.createAgvTask(BizStatus.Fx_Off_Line, null, srcPointCode, dstPointCode, "ROLLER_MOVE"); AgvTask agvTask = agvTaskService.createAgvTask(BizStatus.Fx_Off_Line, null, srcPointCode, dstPointCode, "ROLLER_MOVE");
// 下发任务 return "呼叫成功";
kmReService.sendAgvTask(agvTask, kmReService.sendAgvTaskGtJson(agvTask));
} }
private void moveFxBack(TransTask transTask) { private String moveFxBack(TransTask transTask) {
String srcPointCode = transTask.getPointCode(); String srcPointCode = transTask.getPointCode();
if (!"FX001".equals(srcPointCode)) { if (!"FX001".equals(srcPointCode)) {
throw new BadRequestException("返修点位不正确,请核实"); return "返修点位不正确,请核实";
} }
//根据状态查询任务 //根据状态查询任务
List<AgvTask> agvTaskList = agvTaskService.findByStatus(BizStatus.ARRIVED); List<AgvTask> agvTaskList = agvTaskService.findByStatus(BizStatus.ARRIVED);
if (agvTaskList.isEmpty()) { if (agvTaskList.isEmpty()) {
throw new BadRequestException("任务还未达到FX001返修点请稍后再试!"); return "AGV还未达到FX001返修点请稍后再试!";
} }
AgvTask agvTask = agvTaskList.get(0); AgvTask agvTask = agvTaskList.get(0);
//任务放行 //任务放行
kmReService.sendAgvTaskToContainer(UrlApi.operationFeedback(), kmReService.operationFeedbackJson(agvTask)); kmReService.sendAgvTaskToContainer(UrlApi.operationFeedback(), kmReService.operationFeedbackJson(agvTask));
return "放行成功";
} }
private void moveJLBack(TransTask transTask) { private String moveJLBack(TransTask transTask) {
//起点 //起点
Point srcPoint = pointService.validatePoint(transTask.getPointCode()); Point srcPoint = pointRepository.findByCode(transTask.getPointCode());
Stock stock = stockService.findByPointCode(srcPoint.getCode()); if (srcPoint == null) {
if (stock == null) { return transTask.getPointCode() + "点位不存在!";
throw new BadRequestException(srcPoint.getCode() + "点位没有货架!");
} }
//容器
Stock stock = stockService.findByPointCode(srcPoint.getCode());
String dstAreaCode = AreaNameDic.XJJLQ.equals(srcPoint.getArea().getName()) ? AreaNameDic.XJFBCQ : AreaNameDic.DJFBCQ; String dstAreaCode = AreaNameDic.XJJLQ.equals(srcPoint.getArea().getName()) ? AreaNameDic.XJFBCQ : AreaNameDic.DJFBCQ;
List<Point> endPointList = pointService.queryPoints(null, BaseStatus.FREE, BaseStatus.BOX, dstAreaCode); List<Point> endPointList = pointService.queryPoints(null, BaseStatus.FREE, BaseStatus.BOX, dstAreaCode);
if (endPointList.isEmpty()) { 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); Point endPoint = endPointList.get(0);
// 验证终点是否有任务 if (!isEndPointAvailable(endPoint.getCode(), BizStatus.CALL_RETURN, "RACK_MOVE")) {
if (!agvTaskService.findByEndSlotCode(endPoint.getCode(), BizStatus.CALL_RETURN, "RACK_MOVE")) { return endPoint.getCode() + "点位有任务,请稍后再试!";
throw new BadRequestException(endPoint.getCode() + "点位有任务,请稍后再试!");
} }
// 生成任务 // 生成任务
AgvTask agvTask = agvTaskService.createAgvTask(BizStatus.CALL_RETURN, stock, srcPoint.getCode(), endPoint.getCode(), "RACK_MOVE"); 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 "呼叫成功";
} }
} }

View File

@ -141,8 +141,8 @@ public class TaskServiceImpl implements TaskService {
} }
@Override @Override
public List<Task> findByPickNotAllTask(Long pickId) { public List<Task> findByPickNotAllTask() {
return taskRepository.findByPickNotAllTask(pickId); return taskRepository.findByPickNotAllTask();
} }
@Override @Override
@ -238,9 +238,9 @@ public class TaskServiceImpl implements TaskService {
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public void materialPick(Pick pick) { public void materialPick() {
AgvTask agvTask = null; AgvTask agvTask = null;
List<Task> taskList = this.findByPickNotAllTask(pick.getId()); List<Task> taskList = this.findByPickNotAllTask();
for (Task task : taskList) { for (Task task : taskList) {
/*生成搬运任务*/ /*生成搬运任务*/
List<AgvTask> agvTaskList = agvTaskService.findRepeat(task.getSrcStockCode(), task.getSrcPointCode(), task.getDstPointCode()); List<AgvTask> agvTaskList = agvTaskService.findRepeat(task.getSrcStockCode(), task.getSrcPointCode(), task.getDstPointCode());
@ -257,11 +257,6 @@ public class TaskServiceImpl implements TaskService {
task.setTaskStatus(agvTask.getStatus()); task.setTaskStatus(agvTask.getStatus());
taskRepository.save(task); taskRepository.save(task);
} }
/*更新出库单状态*//*
pick.setStatus(BizStatus.PICKUP);
pickService.update(pick);*/
} }
@Override @Override
@ -301,47 +296,38 @@ public class TaskServiceImpl implements TaskService {
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public void callJlTask(Pick pick) { public void callJlTask(Pick pick) {
if (pick.getStock() == null) {
throw new BadRequestException(pick.getGdCode() + "工单未翻包拣货!");
}
if (pick.getCallPoint() == null) {
throw new BadRequestException(pick.getGdCode() + "工单没有叫料请求!");
}
//绑定任务 //绑定任务
List<Task> taskList = this.findByPickAllTask(pick.getId()); List<Task> taskList = this.findByPickAllTask(pick.getId());
if (taskList.isEmpty()) { 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[] points = pick.getCallPoint().split(",");
String endPointCode = points[points.length - 1]; String endPointCode = points[points.length - 1];
Point endPoint = pointService.queryPoint(endPointCode, null, null, null); Point endPoint = pointService.queryPoint(endPointCode, null, null, null);
/* AgvTask agvTask = agvTaskService.createAgvTask(BizStatus.CALL_PICK, stock, srcPoint.getCode(), endPoint.getCode(), "RACK_MOVE");
agvTask.setLineSlotCode(pick.getCode());
agvTaskService.update(agvTask);*/
AgvTask agvTask = null;
for (Task task : taskList) {
List<AgvTask> agvTasks = agvTaskService.findRepeat(task.getDstStockCode(), task.getDstPointCode(), endPoint.getCode());
if (agvTasks.isEmpty()) {
//创建任务 //创建任务
if (!agvTaskService.findByEndSlotCode(endPoint.getCode(), BizStatus.CALL_PICK, "RACK_MOVE")) { agvTask = agvTaskService.createAgvTask(BizStatus.JL_Back, task.getDstStock(), task.getDstPointCode(), endPoint.getCode(), "RACK_MOVE");
throw new BadRequestException(endPoint.getCode() + "点位有任务,请稍后再试!");
}
AgvTask agvTask = agvTaskService.createAgvTask(BizStatus.CALL_PICK, stock, srcPoint.getCode(), endPoint.getCode(), "RACK_MOVE");
agvTask.setLineSlotCode(pick.getCode()); agvTask.setLineSlotCode(pick.getCode());
agvTaskService.update(agvTask); agvTaskService.update(agvTask);
} else {
agvTask = agvTasks.get(0);
for (Task task : taskList) { }
task.setCallAgvTaskId(agvTask.getId()); task.setCallAgvTaskId(agvTask.getId());
taskRepository.save(task); taskRepository.save(task);
} }
//起点占用
pointService.usedPoint(srcPoint);
//终点占用
pointService.usedPoint(endPoint);
} }
@ -619,16 +605,6 @@ public class TaskServiceImpl implements TaskService {
pickDetail.setPickedQty(pickDetail.getPickedQty() + moveQty); pickDetail.setPickedQty(pickDetail.getPickedQty() + moveQty);
pickDetailService.update(pickDetail); 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); stockService.usedStock(dstStock, dstStock.getPoint(), BaseStatus.USED);

View File

@ -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<AgvTask> 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));
}
}
}
}

View File

@ -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<AgvTask> 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<Point> 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);
}
}

View File

@ -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<AgvTask> agvTaskList = agvTaskService.findOpenByAgvTask(BizStatus.Cp_Off_Up);
if (agvTaskList.isEmpty()) {
return;
}
// 遍历AGV任务列表
for (AgvTask agvTask : agvTaskList) {
processAgvTask(agvTask);
}
}
}
private List<Stock> getEmptyStockList() {
List<Stock> 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<Stock> 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);
}
}

View File

@ -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<AgvTask> 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<Point> endPointList = pointService.queryPoints(null, BaseStatus.FREE, BaseStatus.BOX, dstAreaCode);
return endPointList.isEmpty() ? null : endPointList.get(0);
}
}

View File

@ -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<AgvTask> 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));
}
}

View File

@ -48,7 +48,7 @@ public class pickTask {
* *
*/ */
public void allocatePick() { public void allocatePick() {
List<String> statuses = Arrays.asList(BizStatus.OPEN, BizStatus.ASSIGN); List<String> statuses = Arrays.asList(BizStatus.OPEN, BizStatus.ASSIGN, BizStatus.PICKUP);
List<Pick> pickList = pickService.findByPickStatus(statuses, null); List<Pick> pickList = pickService.findByPickStatus(statuses, null);
if (pickList.isEmpty()) { if (pickList.isEmpty()) {
throw new BadRequestException("无待分配的成品出库单,分配失败!"); throw new BadRequestException("无待分配的成品出库单,分配失败!");
@ -59,31 +59,18 @@ public class pickTask {
} }
} }
//生成备料任务
taskService.materialPick();
} }
/** /**
* *
*/ */
public void pickAgvTask() { public void createJlTask() {
/*查询分配完成的出库单*/ /* *//*查询拣货完成完成的出库单*//*
List<String> statuses = Arrays.asList(BizStatus.ASSIGN, BizStatus.ALLOCATE);
List<Pick> pickList = pickService.findByPickStatus(statuses, null);
if (pickList.isEmpty()) {
throw new BadRequestException("无已分配的出库单,下发任务失败!");
}
for (Pick pick : pickList) {
synchronized (pick) {
taskService.materialPick(pick);
}
}
}
/**
*
*/
public void callJlTask() {
/*查询拣货完成完成的出库单*/
List<String> statuses = Arrays.asList(BizStatus.PICKUP, BizStatus.PICK_ALL); List<String> statuses = Arrays.asList(BizStatus.PICKUP, BizStatus.PICK_ALL);
List<Pick> pickList = pickService.findByPickStatus(statuses, true); List<Pick> pickList = pickService.findByPickStatus(statuses, true);
if (pickList.isEmpty()) { if (pickList.isEmpty()) {
@ -93,36 +80,7 @@ public class pickTask {
synchronized (pick) { synchronized (pick) {
taskService.callJlTask(pick); taskService.callJlTask(pick);
} }
}*/
}
}
/**
*
*/
public void sendTaskBlAndJl() {
List<AgvTask> 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));
}
}
}
} }
} }

View File

@ -142,7 +142,7 @@ public interface BizStatus {
String Fx_Back = "Fx_Back"; String Fx_Back = "Fx_Back";
/** /**
* - * -
*/ */
String JL_Back = "JL_Back"; String JL_Back = "JL_Back";