diff --git a/youchain-common/src/main/java/com/youchain/exception/handler/ApiResult.java b/youchain-common/src/main/java/com/youchain/exception/handler/ApiResult.java index 21e2e31..6184dc0 100644 --- a/youchain-common/src/main/java/com/youchain/exception/handler/ApiResult.java +++ b/youchain-common/src/main/java/com/youchain/exception/handler/ApiResult.java @@ -13,8 +13,8 @@ public class ApiResult { return result(400, "操作失败!", null); } - public static ApiResult fail(int code, String msg, Object data) { - return result(code, msg, data); + public static ApiResult fail(String msg) { + return result(400, msg, null); } public static ApiResult success() { diff --git a/youchain-system/src/main/java/com/youchain/appupdate/inputJson/SmallRequest.java b/youchain-system/src/main/java/com/youchain/appupdate/inputJson/SmallRequest.java new file mode 100644 index 0000000..2b7d37a --- /dev/null +++ b/youchain-system/src/main/java/com/youchain/appupdate/inputJson/SmallRequest.java @@ -0,0 +1,17 @@ +package com.youchain.appupdate.inputJson; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +public class SmallRequest { + @ApiModelProperty(value = "起点", required = true) + String pointCode; + + @ApiModelProperty(value = "上线单号",required = true) + String onlineNo; + + @ApiModelProperty(value = "shooter数量",required = true, example = "2") + int shooter; + +} diff --git a/youchain-system/src/main/java/com/youchain/appupdate/rest/NioF3AppController.java b/youchain-system/src/main/java/com/youchain/appupdate/rest/NioF3AppController.java new file mode 100644 index 0000000..e97d431 --- /dev/null +++ b/youchain-system/src/main/java/com/youchain/appupdate/rest/NioF3AppController.java @@ -0,0 +1,42 @@ +package com.youchain.appupdate.rest; + +import com.youchain.annotation.AnonymousAccess; +import com.youchain.annotation.Log; +import com.youchain.appupdate.inputJson.SmallRequest; +import com.youchain.appupdate.service.NioF3AppService; +import com.youchain.businessdata.inputJson.LesRequest; +import com.youchain.exception.handler.ApiResult; +import com.youchain.exception.handler.LesResult; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@Slf4j +@RestController +@RequiredArgsConstructor +@Api(tags = "APP版本管理") +@RequestMapping("/api/app") +public class NioF3AppController { + + private final NioF3AppService nioF3AppService; + + @PostMapping("/smallConfirm") + @Log("小件扫描确认") + @ApiOperation("小件扫描确认") + @AnonymousAccess + public ResponseEntity smallConfirm(@RequestBody SmallRequest smallRequest) { + try { + nioF3AppService.smallConfirm(smallRequest); + return new ResponseEntity<>(ApiResult.success(), HttpStatus.OK); + } catch (Exception e) { + return new ResponseEntity<>(ApiResult.fail(e.getMessage()), HttpStatus.BAD_REQUEST); + } + } +} diff --git a/youchain-system/src/main/java/com/youchain/appupdate/service/NioF3AppService.java b/youchain-system/src/main/java/com/youchain/appupdate/service/NioF3AppService.java new file mode 100644 index 0000000..6fa631f --- /dev/null +++ b/youchain-system/src/main/java/com/youchain/appupdate/service/NioF3AppService.java @@ -0,0 +1,17 @@ +package com.youchain.appupdate.service; + +import com.youchain.appupdate.inputJson.SmallRequest; + +public interface NioF3AppService { + + /** + * 小件扫码确认 + * @param smallRequest 请求参数 + */ + void smallConfirm(SmallRequest smallRequest); + + /** + * 大件扫码确认 + */ + void LargeConfirm(); +} diff --git a/youchain-system/src/main/java/com/youchain/appupdate/service/impl/NioF3AppServiceImpl.java b/youchain-system/src/main/java/com/youchain/appupdate/service/impl/NioF3AppServiceImpl.java new file mode 100644 index 0000000..9563db0 --- /dev/null +++ b/youchain-system/src/main/java/com/youchain/appupdate/service/impl/NioF3AppServiceImpl.java @@ -0,0 +1,111 @@ +package com.youchain.appupdate.service.impl; + +import com.youchain.appupdate.inputJson.SmallRequest; +import com.youchain.appupdate.service.NioF3AppService; +import com.youchain.basicdata.domain.Point; +import com.youchain.basicdata.service.PointService; +import com.youchain.businessdata.domain.AgvTask; +import com.youchain.businessdata.domain.Les; +import com.youchain.businessdata.repository.LesRepository; +import com.youchain.businessdata.service.AgvTaskService; +import com.youchain.businessdata.service.KMReService; +import com.youchain.exception.BadRequestException; +import com.youchain.utils.BizStatus; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; +import java.util.stream.Collectors; + +@Slf4j +@Service +@RequiredArgsConstructor +public class NioF3AppServiceImpl implements NioF3AppService { + private final LesRepository lesRepository; + private final PointService pointService; + private final AgvTaskService agvTaskService; + private final KMReService kmReService; + + @Override + @Transactional(rollbackFor = Exception.class) + public void smallConfirm(SmallRequest smallRequest) { + //验证参数 + validateParams(smallRequest); + + //起点 + String pointCode = smallRequest.getPointCode(); + + //上线单号 + String onlineNo = smallRequest.getOnlineNo(); + + //验证起点 + pointService.validatePoint(pointCode); + + //验证Les任务 + List lesList = validateLes(pointCode, onlineNo); + + //验证起点是否有Agv任务 + validateAgvTask(pointCode); + + //获取目标点位 + String endPointCode = getEndPointCode(lesList); + + //生成Agv任务 + AgvTask agvTask = agvTaskService.createAgvTask(BizStatus.OPEN, null, pointCode, endPointCode, "TUGGER"); + + //下发任务 + kmReService.sendAgvTask(agvTask, kmReService.sendAgvTaskQYCJson(agvTask, smallRequest.getShooter(),null)); + } + + /** + * 验证参数 + * + * @param smallRequest -> 参数 + */ + private void validateParams(SmallRequest smallRequest) { + if (StringUtils.isEmpty(smallRequest.getPointCode())) { + throw new BadRequestException("pointCode必填"); + } + + if (StringUtils.isEmpty(smallRequest.getOnlineNo())) { + throw new BadRequestException("onlineNo必填"); + } + } + + /** + * 验证Les任务 + * + * @param pointCode -> 点位 + * @param onlineNo -> 上线单号 + */ + private List validateLes(String pointCode, String onlineNo) { + List lesList = lesRepository.findByOnlineNo(pointCode,onlineNo); + if (lesList.isEmpty()) { + throw new BadRequestException("系统未识别到任务"); + } + return lesList; + } + + private void validateAgvTask(String pointCode) { + Boolean bool = agvTaskService.findByStartSlotCode(pointCode, "TUGGER_MOVE", "TUGGER"); + if (bool) { + throw new BadRequestException(String.format("该点位:%s有任务,请勿重复下发", pointCode)); + } + } + + private String getEndPointCode(List lesList) { + return lesList.stream() + .map(Les::getDstPositionCode) // 提取目标字段 + .distinct() // 去重 + .collect(Collectors.joining(",")); // 用逗号拼接字符串 + } + + + @Override + public void LargeConfirm() { + + } +} diff --git a/youchain-system/src/main/java/com/youchain/basicdata/repository/PointRepository.java b/youchain-system/src/main/java/com/youchain/basicdata/repository/PointRepository.java index 045d864..068783c 100644 --- a/youchain-system/src/main/java/com/youchain/basicdata/repository/PointRepository.java +++ b/youchain-system/src/main/java/com/youchain/basicdata/repository/PointRepository.java @@ -16,6 +16,7 @@ package com.youchain.basicdata.repository; import com.youchain.basicdata.domain.Point; +import org.springframework.cache.annotation.Cacheable; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.JpaSpecificationExecutor; import org.springframework.data.jpa.repository.Query; diff --git a/youchain-system/src/main/java/com/youchain/basicdata/service/impl/PointServiceImpl.java b/youchain-system/src/main/java/com/youchain/basicdata/service/impl/PointServiceImpl.java index 43aaad0..2eaceaa 100644 --- a/youchain-system/src/main/java/com/youchain/basicdata/service/impl/PointServiceImpl.java +++ b/youchain-system/src/main/java/com/youchain/basicdata/service/impl/PointServiceImpl.java @@ -25,6 +25,8 @@ import com.youchain.basicdata.service.dto.PointDto; import com.youchain.basicdata.service.dto.PointQueryCriteria; import com.youchain.basicdata.service.mapstruct.PointMapper; import lombok.extern.slf4j.Slf4j; +import org.springframework.cache.annotation.CacheConfig; +import org.springframework.cache.annotation.Cacheable; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.data.domain.Page; @@ -43,6 +45,7 @@ import javax.servlet.http.HttpServletResponse; @Service @RequiredArgsConstructor @Slf4j +@CacheConfig(cacheNames = "point") public class PointServiceImpl implements PointService { private final PointRepository pointRepository; @@ -119,6 +122,7 @@ public class PointServiceImpl implements PointService { } @Override + @Cacheable(key = "#position", unless = "#result == null") public Point validatePoint(String position) { Point point = pointRepository.findByCode(position); if (point == null) { 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 32510f6..e6b5d96 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 @@ -55,8 +55,7 @@ public class AgvTask extends BaseEntity implements Serializable { @ApiModelProperty(value = "容器号") private String stockCode; - @Column(name = "`stock_type_code`",nullable = true) - @NotBlank + @Column(name = "`stock_type_code`") @ApiModelProperty(value = "") private String stockTypeCode; diff --git a/youchain-system/src/main/java/com/youchain/businessdata/domain/Les.java b/youchain-system/src/main/java/com/youchain/businessdata/domain/Les.java index 7c9ba77..3abeb82 100644 --- a/youchain-system/src/main/java/com/youchain/businessdata/domain/Les.java +++ b/youchain-system/src/main/java/com/youchain/businessdata/domain/Les.java @@ -11,6 +11,7 @@ import lombok.NoArgsConstructor; import javax.persistence.*; import java.io.Serializable; +import java.sql.Timestamp; @Data @@ -35,7 +36,7 @@ public class Les extends BaseEntity implements Serializable { private String taskType; @Column(name = "`material_code`") - @ApiModelProperty(value = "物料代码") + @ApiModelProperty(value = "物料号") private String materialCode; @Column(name = "`route_code`") @@ -66,6 +67,14 @@ public class Les extends BaseEntity implements Serializable { @ApiModelProperty(value = "终点类型") private String dstType; + @Column(name = "`agv_task_id`") + @ApiModelProperty(value = "agv任务id") + private Long agvTaskId; + + @Column(name = "arrived_time") + @ApiModelProperty(value = "到达时间") + private Timestamp arrivedTime; + public void copy(Les source){ BeanUtil.copyProperties(source,this, CopyOptions.create().setIgnoreNullValue(true)); } diff --git a/youchain-system/src/main/java/com/youchain/businessdata/inputJson/MissionStateCallback.java b/youchain-system/src/main/java/com/youchain/businessdata/inputJson/MissionStateCallback.java new file mode 100644 index 0000000..655b585 --- /dev/null +++ b/youchain-system/src/main/java/com/youchain/businessdata/inputJson/MissionStateCallback.java @@ -0,0 +1,23 @@ +package com.youchain.appupdate.inputJson; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * KMReS接口回调的入参 + * @author 92525 + */ +@Data +public class MissionStateCallback { + @ApiModelProperty(value = "任务ID") + String missionCode; + + @ApiModelProperty(value = "容器编号") + String containerCode; + + @ApiModelProperty(value = "作业当前状态") + String missionStatus; + + @ApiModelProperty(value = "容器当前位置") + String currentPosition; +} 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 1c310e9..23fc6fc 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 @@ -31,11 +31,11 @@ import java.util.Map; public interface AgvTaskRepository extends JpaRepository, JpaSpecificationExecutor { @Query(value = "select count(agv.id) from AgvTask agv where agv.stockCode=:stockCode and agv.startSlotCode=:srcPointCode and agv.endSlotCode=:endPointCode and agv.status in ('OPEN','ATCALL','UP_CONTAINER') ") - int isAGVTaskDuplicate(String stockCode, String srcPointCode, String endPointCode); + Long isAGVTaskDuplicate(String stockCode, String srcPointCode, String endPointCode); @Query(value = "select count(agv.id) from AgvTask agv where agv.startSlotCode=:startSlotCode and agv.type=:type and agv.jobType=:jobType and agv.status in ('OPEN','ATCALL','UP_CONTAINER') ") - int findByStartSlotCode(String startSlotCode, String type, String jobType); + Long findByStartSlotCode(String startSlotCode, String type, String jobType); @Query(value = "select count(agv.id) from AgvTask agv where agv.endSlotCode=:endSlotCode and agv.type=:type and agv.jobType=:jobType and agv.status in ('OPEN','ATCALL','UP_CONTAINER') ") - int findByEndSlotCode(String endSlotCode, String type, String jobType); + Long findByEndSlotCode(String endSlotCode, String type, String jobType); } diff --git a/youchain-system/src/main/java/com/youchain/businessdata/repository/LesRepository.java b/youchain-system/src/main/java/com/youchain/businessdata/repository/LesRepository.java index 8052086..e02887d 100644 --- a/youchain-system/src/main/java/com/youchain/businessdata/repository/LesRepository.java +++ b/youchain-system/src/main/java/com/youchain/businessdata/repository/LesRepository.java @@ -5,8 +5,16 @@ import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.JpaSpecificationExecutor; import org.springframework.data.jpa.repository.Query; +import java.util.List; + public interface LesRepository extends JpaRepository, JpaSpecificationExecutor { - @Query(value = " from Les les WHERE les.taskCode=:taskCode ") + @Query(value = " from Les les where les.taskCode=:taskCode ") Les findByTaskCode(String taskCode); + + @Query(value = " from Les les where les.agvTaskId is null and les.onlineNo=:onlineNo and les.srcPositionCode=:pointCode ") + List findByOnlineNo(String pointCode,String onlineNo); + + @Query(value = " from Les les where les.agvTaskId=:agvTaskId and les.dstPositionCode=:currentPositionCode ") + List findByAgvTaskId(Long agvTaskId, String currentPositionCode); } diff --git a/youchain-system/src/main/java/com/youchain/businessdata/rest/KMReSController.java b/youchain-system/src/main/java/com/youchain/businessdata/rest/KMReSController.java new file mode 100644 index 0000000..bf1f1bc --- /dev/null +++ b/youchain-system/src/main/java/com/youchain/businessdata/rest/KMReSController.java @@ -0,0 +1,51 @@ +package com.youchain.businessdata.rest; + +import com.youchain.annotation.AnonymousAccess; +import com.youchain.annotation.Log; +import com.youchain.appupdate.inputJson.MissionStateCallback; +import com.youchain.businessdata.domain.AgvTask; +import com.youchain.businessdata.service.AgvTaskService; +import com.youchain.businessdata.service.KMReService; +import com.youchain.exception.handler.ApiResult; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import static org.springframework.http.HttpStatus.BAD_REQUEST; +import static org.springframework.http.HttpStatus.OK; + +@RestController +@RequiredArgsConstructor +@Api(tags = "KMReS") +@RequestMapping("/interfaces/api/amr") +@Slf4j +public class KMReSController { + private final AgvTaskService agvTaskService; + private final KMReService kmReService; + + @PostMapping("/missionStateCallback") + @Log("KMReS接口回调") + @ApiOperation("KMReS接口回调") + @AnonymousAccess + public ResponseEntity missionStateCallback(@RequestBody MissionStateCallback missionStateCallback) { + String id = missionStateCallback.getMissionCode();//作业 id + String containerCode = missionStateCallback.getContainerCode();//容器编号 + String missionStatus = missionStateCallback.getMissionStatus();//作业当前状态 + String currentPosition = missionStateCallback.getCurrentPosition();//容器当前位置 + try { + //货架任务 + AgvTask agvTask = agvTaskService.findById(Long.parseLong(id)); + kmReService.missionStateCallback(agvTask, missionStatus, containerCode, currentPosition); + return new ResponseEntity<>(ApiResult.success(), HttpStatus.OK); + } catch (Exception e) { + return new ResponseEntity<>(ApiResult.fail(e.getMessage()), HttpStatus.BAD_REQUEST); + } + } +} 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 372a1bf..399a239 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 @@ -95,11 +95,11 @@ public interface AgvTaskService { * 创建agvTask任务 * @param bizStatus 状态 * @param stock 容器 - * @param srcPoint 起点 - * @param endPoint 终点 + * @param srcPointCode 起点 + * @param endPointCode 终点 * @param jobType 任务类型 */ - AgvTask createAgvTask(String bizStatus, Stock stock, Point srcPoint, Point endPoint,String jobType); + AgvTask createAgvTask(String bizStatus, Stock stock, String srcPointCode, String endPointCode,String jobType); /** * 根据容器查询任务 diff --git a/youchain-system/src/main/java/com/youchain/businessdata/service/KMReService.java b/youchain-system/src/main/java/com/youchain/businessdata/service/KMReService.java index 95f8dfd..6f62d16 100644 --- a/youchain-system/src/main/java/com/youchain/businessdata/service/KMReService.java +++ b/youchain-system/src/main/java/com/youchain/businessdata/service/KMReService.java @@ -70,9 +70,10 @@ public interface KMReService { * 下发agv牵引车任务JSON * * @param agvTask 任务 + * @param tugCount 牵引车数量 * @param tugModels 牵引车型号 */ - String sendAgvTaskQYCJson(AgvTask agvTask, List tugModels); + String sendAgvTaskQYCJson(AgvTask agvTask, int tugCount, List tugModels); /** * 下发agv任务 @@ -97,4 +98,9 @@ public interface KMReService { * @param agvTask 任务 */ String operationFeedbackJson(AgvTask agvTask); + + /** + * 更新牵引车拖挂车信息 + */ + String updateTuggerTrailerInfo(List tugModels); } diff --git a/youchain-system/src/main/java/com/youchain/businessdata/service/LesService.java b/youchain-system/src/main/java/com/youchain/businessdata/service/LesService.java index 710e0cc..2d4f1c2 100644 --- a/youchain-system/src/main/java/com/youchain/businessdata/service/LesService.java +++ b/youchain-system/src/main/java/com/youchain/businessdata/service/LesService.java @@ -83,4 +83,10 @@ public interface LesService { */ String lesCallBack(String currentPositionCode,String taskCode); + /** + * 任务到达节点记录时间 + * @param agvTaskId 任务 + * @param currentPositionCode 当前点位 + */ + void arrivedLes(Long agvTaskId,String currentPositionCode); } diff --git a/youchain-system/src/main/java/com/youchain/businessdata/service/dto/LesQueryCriteria.java b/youchain-system/src/main/java/com/youchain/businessdata/service/dto/LesQueryCriteria.java index 9208448..55aa3e0 100644 --- a/youchain-system/src/main/java/com/youchain/businessdata/service/dto/LesQueryCriteria.java +++ b/youchain-system/src/main/java/com/youchain/businessdata/service/dto/LesQueryCriteria.java @@ -1,8 +1,13 @@ package com.youchain.businessdata.service.dto; +import com.youchain.annotation.Query; import lombok.Data; @Data public class LesQueryCriteria { + @Query(type = Query.Type.LEFT_LIKE) + private String taskCode; + @Query(type = Query.Type.LEFT_LIKE) + private String materialCode; } 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 3959a6c..b7a29b8 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 @@ -126,14 +126,15 @@ public class AgvTaskServiceImpl implements AgvTaskService { @Override @Transactional(rollbackFor = Exception.class) - public AgvTask createAgvTask(String bizStatus, Stock stock, Point srcPoint, Point endPoint, String jobType) { + public AgvTask createAgvTask(String bizStatus, Stock stock, String srcPointCode, String endPointCode, String jobType) { AgvTask agvTask = AgvTask.builder() - .type(bizStatus) - .stockCode(stock.getCode()) - .startSlotCode(srcPoint.getCode()) - .endSlotCode(endPoint.getCode()) + .type(BizStatus.MOVE) + .stockCode(stock==null?null:stock.getCode()) + .startSlotCode(srcPointCode) + .endSlotCode(endPointCode) .status(BizStatus.OPEN) .jobType(jobType) + .jobPriority(1) .build(); agvTaskRepository.save(agvTask); return agvTask; diff --git a/youchain-system/src/main/java/com/youchain/businessdata/service/impl/KMReServiceImpl.java b/youchain-system/src/main/java/com/youchain/businessdata/service/impl/KMReServiceImpl.java index 3df0f56..6f6cc2a 100644 --- a/youchain-system/src/main/java/com/youchain/businessdata/service/impl/KMReServiceImpl.java +++ b/youchain-system/src/main/java/com/youchain/businessdata/service/impl/KMReServiceImpl.java @@ -20,6 +20,7 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.sql.Array; import java.sql.Timestamp; import java.util.*; @@ -30,8 +31,8 @@ public class KMReServiceImpl implements KMReService { private final DictRepository dictRepository; private final StockService stockService; private final PointService pointService; - private final TaskService taskService; private final AgvTaskService agvTaskService; + private final LesService lesService; /** @@ -316,7 +317,7 @@ public class KMReServiceImpl implements KMReService { } @Override - public String sendAgvTaskQYCJson(AgvTask agvTask, List tugModels) { + public String sendAgvTaskQYCJson(AgvTask agvTask ,int tugCount, List tugModels) { JSONObject jsonObject = new JSONObject(true); String requestId = TimeNumberUtils.getGTTaskCode(); Map objMap = new LinkedHashMap<>(); @@ -336,26 +337,37 @@ public class KMReServiceImpl implements KMReService { JSONObject missionDataObj = new JSONObject(true); Map missionDataMap = new LinkedHashMap<>(); + Point point = pointService.validatePoint(agvTask.getStartSlotCode()); + String areaCode = point.getArea().getCode(); + if("XJQ".equals(areaCode)){ + tugModels=Arrays.asList("modelA", "modelB"); + }else{ + tugCount=tugModels.size(); + } missionDataMap.put("sequence", 1);//序号 missionDataMap.put("type", "NODE_POINT");//作业类型:点位:NODE_POINT;区域:NODE_AREA missionDataMap.put("position", agvTask.getStartSlotCode());//起点 missionDataMap.put("actionType", "TUGGER_ATTACH");//动作:TUGGER_ATTACH:挂钩;TUGGER_DETACH:脱钩 - missionDataMap.put("tugCount", tugModels.size());//牵引车后方的拖挂车数量 + missionDataMap.put("tugCount", tugCount);//牵引车后方的拖挂车数量 missionDataMap.put("passStrategy", "MANUAL");//当前任务点结束后放行策略:自动:AUTO;手动:MANUAL missionDataMap.put("tugModels", tugModels);//牵引车后方的拖挂车规格【模型名字】需要和tugCount一致 missionDataObj.putAll(missionDataMap); missionDataArray.add(missionDataObj); - JSONObject missionDataObj2 = new JSONObject(true); - Map missionDataMap2 = new LinkedHashMap<>(); - missionDataMap2.put("sequence", 2);//序号 - missionDataMap2.put("type", "NODE_AREA");//作业类型:点位:NODE_POINT;区域:NODE_AREA - missionDataMap2.put("position", agvTask.getEndSlotCode());//终点 - missionDataMap.put("actionType", "TUGGER_DETACH");//动作:TUGGER_ATTACH:挂钩;TUGGER_DETACH:脱钩 - missionDataMap.put("passStrategy", "AUTO");//当前任务点结束后放行策略:自动:AUTO;手动:MANUAL - missionDataMap2.put("waitingMillis", 0);//自动触发离开当前任务节点的时间,默认单位:毫秒 - missionDataObj2.putAll(missionDataMap2); - missionDataArray.add(missionDataObj2); + String [] endSlotCodes =agvTask.getEndSlotCode().split(","); + int sum=1; + for (int i = 0; i < endSlotCodes.length; i++) { + JSONObject missionDataObj2 = new JSONObject(true); + Map missionDataMap2 = new LinkedHashMap<>(); + missionDataMap2.put("sequence", (sum + (i + 1)));//序号 + missionDataMap2.put("type", "NODE_POINT");//作业类型:点位:NODE_POINT;区域:NODE_AREA + missionDataMap2.put("position", endSlotCodes[i]);//终点 + missionDataMap2.put("actionType", "TUGGER_DETACH");//动作:TUGGER_ATTACH:挂钩;TUGGER_DETACH:脱钩 + missionDataMap2.put("passStrategy", "AUTO");//当前任务点结束后放行策略:自动:AUTO;手动:MANUAL + missionDataMap2.put("waitingMillis", 0);//自动触发离开当前任务节点的时间,默认单位:毫秒 + missionDataObj2.putAll(missionDataMap2); + missionDataArray.add(missionDataObj2); + } objMap.put("missionData", missionDataArray); jsonObject.putAll(objMap); @@ -395,32 +407,23 @@ public class KMReServiceImpl implements KMReService { @Override @Transactional(rollbackFor = Exception.class) public void missionStateCallback(AgvTask agvTask, String status, String containerCode, String currentPosition) { - Stock stock = stockService.validateStock(containerCode); - //顶升的是起点;其它终点; - Point point; - String pointCode; - if ("UP_CONTAINER".equals(status) || "FORK_UP".equals(status)) { - pointCode = agvTask.getStartSlotCode(); - } else { - pointCode = agvTask.getEndSlotCode(); - } - point = pointService.queryPoint(pointCode, null, null, null); + switch (status) { case "UP_CONTAINER": - case "FORK_UP": - handleUpContainer(agvTask, stock, point);//容器顶升 - break; - case "FORK_DOWN": - //容器放下 + //容器顶升 + handleUpContainer(agvTask); break; case "ARRIVED": //容器到达 + handleArrivedContainer(agvTask,currentPosition); break; case "COMPLETED": - handleComContainer(agvTask, stock, point);//任务完成 + //任务完成 + handleComContainer(agvTask); break; case "CANCELED": - handleCanceledTask(agvTask, stock, point);//任务取消 + //任务取消 + handleCanceledTask(agvTask); break; case "RESEND": handleResendTask(agvTask);//重新发送 @@ -431,65 +434,99 @@ public class KMReServiceImpl implements KMReService { @Override public String operationFeedbackJson(AgvTask agvTask) { - JSONObject jsonObject = new JSONObject(new LinkedHashMap<>()); + JSONObject jsonObject = new JSONObject(true); //请求 id jsonObject.put("requestId", String.valueOf(System.currentTimeMillis())); - //容器类型 + //当前执行任务的容器号 jsonObject.put("containerCode", ""); - //容器编号 + //当前执行作业id jsonObject.put("missionCode", agvTask.getId()); - //容器当前位置 + //当前执行作业的节点 jsonObject.put("position", ""); return jsonObject.toString(); } + @Override + public String updateTuggerTrailerInfo(List tugModels) { + JSONObject jsonObject = new JSONObject(true); + //请求 id + String requestId = String.valueOf(System.currentTimeMillis()); + jsonObject.put("requestId", requestId); + //当前执行作业id + jsonObject.put("missionCode", requestId); + //当前执行任务的小车号 + jsonObject.put("robotId", ""); + //拖挂车数量 + jsonObject.put("tugCount", tugModels.size()); + //拖挂车类型集 + jsonObject.put("tugModels", tugModels); + //是否同步继续(放行)任务 + jsonObject.put("resumeMission", true); + return jsonObject.toString(); + } + /** * 容器顶升 * * @param agvTask 任务 - * @param stock 容器 */ - private void handleUpContainer(AgvTask agvTask, Stock stock, Point startPoint) { - //顶升,起点释放点位 - pointService.freePoint(startPoint); - agvTask.setStockCode(stock == null ? null : stock.getCode()); + private void handleUpContainer(AgvTask agvTask) { agvTask.setStatus(BizStatus.UP_CONTAINER); agvTaskService.update(agvTask); } + /** + * 容器到达 + * + * @param agvTask 任务 + */ + private void handleArrivedContainer(AgvTask agvTask, String currentPosition) { + // 验证当前点位 + pointService.validatePoint(currentPosition); + // 记录当前节点 + lesService.arrivedLes(agvTask.getId(), currentPosition); + agvTask.setStatus(BizStatus.ARRIVED); + + // 更新点位路径 + updateSlotCode(agvTask, currentPosition); + + agvTaskService.update(agvTask); + } + + private void updateSlotCode(AgvTask agvTask, String newPosition) { + String currentSlotCode = agvTask.getSlotCode(); + + // 处理空路径情况 + if (StringUtils.isEmpty(currentSlotCode)) { + agvTask.setSlotCode(newPosition); + return; + } + + // 使用 Set 快速检查重复点位 + Set existingPositions = new HashSet<>(Arrays.asList(currentSlotCode.split(","))); + if (!existingPositions.contains(newPosition)) { + agvTask.setSlotCode(currentSlotCode + "," + newPosition); + } + } + /** * 任务完成 * * @param agvTask 任务 - * @param stock 容器 */ - private void handleComContainer(AgvTask agvTask, Stock stock, Point endPoint) { - //任务完成;根据AGV任务的目标点位走对应流程 - switch (agvTask.getType()) { - case BizStatus.PICK: - break; - case BizStatus.ASN: - break; - default: - throw new BadRequestException("任务类型不存在!"); - } - + private void handleComContainer(AgvTask agvTask) { //更新任务状态 - this.updateAgvTaskStatus(agvTask, stock, BizStatus.FINISH); - + this.updateAgvTaskStatus(agvTask, BizStatus.FINISH); } /** * 任务取消完成 * * @param agvTask 任务 - * @param stock 容器 */ - private void handleCanceledTask(AgvTask agvTask, Stock stock, Point endPoint) { - + private void handleCanceledTask(AgvTask agvTask) { //更新任务状态 - this.updateAgvTaskStatus(agvTask, stock, BizStatus.CANCEL); - + this.updateAgvTaskStatus(agvTask, BizStatus.CANCEL); } /** @@ -515,13 +552,6 @@ public class KMReServiceImpl implements KMReService { .build(); agvTaskService.create(newAgvTask); - List taskList = new ArrayList<>(); - - for (Task task : taskList) { - task.setAgvTask(newAgvTask); - taskService.update(task); - } - // 根据任务类型发送不同的实现 switch (agvTask.getJobType()) { @@ -546,11 +576,9 @@ public class KMReServiceImpl implements KMReService { * 更新任务状态 * * @param agvTask 任务 - * @param stock 容器 * @param status 状态 */ - private void updateAgvTaskStatus(AgvTask agvTask, Stock stock, String status) { - agvTask.setStockCode(stock == null ? null : stock.getCode()); + private void updateAgvTaskStatus(AgvTask agvTask, String status) { agvTask.setStatus(status); agvTask.setEndTime(new Timestamp(new Date().getTime())); agvTaskService.update(agvTask); diff --git a/youchain-system/src/main/java/com/youchain/businessdata/service/impl/LesServiceImpl.java b/youchain-system/src/main/java/com/youchain/businessdata/service/impl/LesServiceImpl.java index 70a4e24..13ccba6 100644 --- a/youchain-system/src/main/java/com/youchain/businessdata/service/impl/LesServiceImpl.java +++ b/youchain-system/src/main/java/com/youchain/businessdata/service/impl/LesServiceImpl.java @@ -87,7 +87,7 @@ public class LesServiceImpl implements LesService { Map map = new LinkedHashMap<>(); map.put("任务号", les.getTaskCode()); map.put("任务类型", les.getTaskType()); - map.put("物料代码", les.getMaterialCode()); + map.put("物料号", les.getMaterialCode()); map.put("编组/线路", les.getRouteCode()); map.put("料箱号", les.getBoxNo()); map.put("上线单号", les.getOnlineNo()); @@ -121,7 +121,7 @@ public class LesServiceImpl implements LesService { } @Override - public String lesCallBack(String currentPositionCode,String taskCode) { + public String lesCallBack(String currentPositionCode, String taskCode) { JSONObject jsonObject = new JSONObject(true); String guid = String.valueOf(System.currentTimeMillis()); //LES任务的业务单号,不一定唯一 @@ -146,6 +146,18 @@ public class LesServiceImpl implements LesService { return jsonObject.toString(); } + @Override + @Transactional(rollbackFor = Exception.class) + public void arrivedLes(Long agvTaskId, String currentPositionCode) { + List lesList = lesRepository.findByAgvTaskId(agvTaskId, currentPositionCode); + for (Les les : lesList) { + les.setArrivedTime(new Timestamp(new Date().getTime())); + } + if (!lesList.isEmpty()) { + lesRepository.saveAll(lesList); + } + } + /** * 验证参数有效性 * @@ -157,19 +169,19 @@ public class LesServiceImpl implements LesService { } //物料有值;说明是料箱上线场景 if (StringUtils.isNotEmpty(lesRequest.getMaterialCode())) { - if(StringUtils.isEmpty(lesRequest.getRouteCode())){ + if (StringUtils.isEmpty(lesRequest.getRouteCode())) { throw new BadRequestException("routeCode必填"); } - if(StringUtils.isEmpty(lesRequest.getBoxNo())){ + if (StringUtils.isEmpty(lesRequest.getBoxNo())) { throw new BadRequestException("boxNo必填"); } - if(StringUtils.isEmpty(lesRequest.getOnlineNo())){ + if (StringUtils.isEmpty(lesRequest.getOnlineNo())) { throw new BadRequestException("onlineNo必填"); } - if (lesRequest.getPositionCodePath()==null ||lesRequest.getPositionCodePath().isEmpty() || lesRequest.getPositionCodePath().size() < 2) { + if (lesRequest.getPositionCodePath() == null || lesRequest.getPositionCodePath().isEmpty() || lesRequest.getPositionCodePath().size() < 2) { throw new BadRequestException("节点不能为空且长度至少为2"); } } 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 23f7025..e909bd1 100644 --- a/youchain-system/src/main/java/com/youchain/utils/BizStatus.java +++ b/youchain-system/src/main/java/com/youchain/utils/BizStatus.java @@ -60,9 +60,9 @@ public interface BizStatus { public static String ATCALL = "ATCALL"; /** - * 任务状态-工作中 + * 任务状态-到达 */ - public static String ATWORK = "ATWORK"; + public static String ARRIVED = "ARRIVED"; /** * 任务状态-顶升