Merge remote-tracking branch 'origin/main'

main
WINDOWS-DN6K5JD\EDY 2024-05-06 13:52:47 +08:00
commit b05414c6d9
13 changed files with 333 additions and 444 deletions

View File

@ -23,6 +23,7 @@ import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.redis.connection.RedisConnection; import org.springframework.data.redis.connection.RedisConnection;
import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.*; import org.springframework.data.redis.core.*;
import org.springframework.data.redis.serializer.JdkSerializationRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer; import org.springframework.data.redis.serializer.StringRedisSerializer;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
@ -45,6 +46,7 @@ public class RedisUtils {
this.redisTemplate.setHashKeySerializer(new StringRedisSerializer()); this.redisTemplate.setHashKeySerializer(new StringRedisSerializer());
this.redisTemplate.setKeySerializer(new StringRedisSerializer()); this.redisTemplate.setKeySerializer(new StringRedisSerializer());
this.redisTemplate.setStringSerializer(new StringRedisSerializer()); this.redisTemplate.setStringSerializer(new StringRedisSerializer());
this.redisTemplate.setValueSerializer(new JdkSerializationRedisSerializer());
} }
/** /**

View File

@ -55,6 +55,8 @@ public class AppRun {
// 或者在 application.yml 添加文件路径,方便 killkill `cat /home/eladmin/app.pid` // 或者在 application.yml 添加文件路径,方便 killkill `cat /home/eladmin/app.pid`
springApplication.addListeners(new ApplicationPidFileWriter()); springApplication.addListeners(new ApplicationPidFileWriter());
springApplication.run(args); springApplication.run(args);
} }
@Bean @Bean

View File

@ -1,19 +1,20 @@
/* /*
* 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.repository; package com.youchain.businessdata.repository;
import com.youchain.businessdata.domain.AgvTask; import com.youchain.businessdata.domain.AgvTask;
import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor; import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
@ -22,63 +23,18 @@ import org.springframework.data.jpa.repository.Query;
import java.util.List; import java.util.List;
/** /**
* @website https://eladmin.vip * @author baobinglin
* @author baobinglin * @website https://eladmin.vip
* @date 2023-08-18 * @date 2023-08-18
**/ **/
public interface AgvTaskRepository extends JpaRepository<AgvTask, Integer>, JpaSpecificationExecutor<AgvTask> { public interface AgvTaskRepository extends JpaRepository<AgvTask, Integer>, JpaSpecificationExecutor<AgvTask> {
/**
*
* @return
*/
@Query(value = "SELECT * FROM data_agv_task where type='PICK' and job_type='ROLLER_MOVE' and status not in ('FINISH','CANCEL') and stock_code=?1 ", nativeQuery = true)
AgvTask findBycontainerCode(String containerCode);
/** /**
* *
*
* @return * @return
*/ */
@Query(value = "select * FROM data_agv_task a where a.`status` in ('ATCALL','UP_CONTAINER','OPEN') AND a.end_slot_code like 'MA1151-QH%'" + @Query(value = "select * FROM data_agv_task a where a.`status` in ('ATCALL','UP_CONTAINER','OPEN') AND a.end_slot_code like 'MA1151-QH%'" +
" UNION select * FROM data_agv_task a where a.`status` in ('ATCALL','UP_CONTAINER','OPEN') AND a.start_slot_code like 'MA1151-QH%' ", nativeQuery = true) " UNION select * FROM data_agv_task a where a.`status` in ('ATCALL','UP_CONTAINER','OPEN') AND a.start_slot_code like 'MA1151-QH%' ", nativeQuery = true)
List<AgvTask> queryAgvTaskPerformedQH(); List<AgvTask> queryAgvTaskPerformedQH();
/**
* @param status-
* @param type-
* @param be_scan-
* @return
*/
@Query(value = "SELECT * FROM data_agv_task where 1=1 and if((?1 !='' or ?1 is not null) ,stock_code=?1,1=1) and status=?2 and type=?3 and be_scan=?4 and job_type=?5 order by update_time ", nativeQuery = true)
List<AgvTask> queryByAgvTask(String stockCode, String status, String type, int be_scan,String jobType);
/**
*
* @param startPoint
* @return
*/
@Query(value = "select * FROM data_agv_task a where a.`status` in ('ATCALL','UP_CONTAINER') AND a.start_slot_code = ?1", nativeQuery = true)
List<AgvTask> findStartTask(String startPoint);
/**
*
* @param endPoint
* @return
*/
@Query(value = "select * FROM data_agv_task a where a.`status` in ('ATCALL','UP_CONTAINER') AND a.end_slot_code = ?1", nativeQuery = true)
List<AgvTask> findEndTask(String endPoint);
/**
* 线
* @return
*/
@Query(value = "select line_slot_code from data_agv_task where type='PICK' and `status`='OPEN' and line_slot_code is not null GROUP BY line_slot_code order by line_slot_code ", nativeQuery = true)
List<Object> queryGroupAgvTask();
/**
* 线
* @return
*/
@Query(value = "select * from data_agv_task where line_slot_code=?1 and type='PICK' and `status`='OPEN' and line_slot_code is not null ORDER BY create_time ", nativeQuery = true)
List<AgvTask> queryLineAgvTask(String line_slot_code);
} }

View File

@ -30,6 +30,7 @@ import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus; import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity; import org.springframework.http.ResponseEntity;
import org.springframework.scheduling.annotation.Async; import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
@ -49,6 +50,7 @@ import static org.springframework.http.HttpStatus.OK;
@Api(tags = "KMReS") @Api(tags = "KMReS")
@RequestMapping("/interfaces/api/amr") @RequestMapping("/interfaces/api/amr")
@Slf4j @Slf4j
@EnableAsync
public class KMReSController { public class KMReSController {
private final AgvTaskService agvTaskService; private final AgvTaskService agvTaskService;
@ -63,57 +65,78 @@ public class KMReSController {
@ApiOperation("KMReS接口回调") @ApiOperation("KMReS接口回调")
@AnonymousAccess @AnonymousAccess
public ResponseEntity<Object> missionStateCallback(@RequestBody MissionStateCallback missionStateCallback) { public ResponseEntity<Object> missionStateCallback(@RequestBody MissionStateCallback missionStateCallback) {
String id = missionStateCallback.getMissionCode();//作业 id String id = missionStateCallback.getMissionCode(); // 作业 id
String containerCode = missionStateCallback.getContainerCode();//容器编号 String containerCode = missionStateCallback.getContainerCode(); // 容器编号
String missionStatus = missionStateCallback.getMissionStatus();//作业当前状态 String missionStatus = missionStateCallback.getMissionStatus(); // 作业当前状态
try { try {
//料箱出库任务 if (id.contains("LX")) {
if(id.indexOf("XJ")!=-1){ //出库
if(missionStatus.equals("CANCELED")){ pickTask(id, containerCode, missionStatus);
List<AgvTask> agvTaskList= agvTaskService.findByjobCode(id); } else {
for(AgvTask agvTask:agvTaskList){ //入库
if(!agvTask.getStatus().equals(BizStatus.FINISH)){ asnTask(id, missionStatus);
}
return ResponseEntity.ok(ApiResult.success(HttpStatus.OK.value(), "", ""));
} catch (Exception e) {
return new ResponseEntity<>(ApiResult.fail(HttpStatus.BAD_REQUEST.value(), "KMReS接口回调异常", e.getMessage()), HttpStatus.BAD_REQUEST);
}
}
private void asnTask(String id, String missionStatus) {
AgvTaskDto agvTaskDto = agvTaskService.findById(Integer.parseInt(id));
AgvTask agvTask = agvTaskService.toEntity(agvTaskDto);
Task task = getFirstTask(agvTask.getId());
if (task == null) {
throw new RuntimeException("任务不存在!");
}
agvTaskService.agvTaskCallback(agvTask, task, missionStatus);
returnMo(task.getBillCode()); // 回传 MO 信息
}
private void pickTask(String id, String containerCode, String missionStatus) throws Exception {
if ("CANCELED".equals(missionStatus)) {
cancelAgvTasks(id);
} else {
AgvTask agvTask = agvTaskService.findByjobCode(id, containerCode);
agvTaskService.agvTaskCallback(agvTask, missionStatus, containerCode);
Task task = getFirstTask(agvTask.getId());
if (task == null) {
throw new RuntimeException("任务不存在!");
}
returnIssue(task); // 叫料结果回传
}
}
private void cancelAgvTasks(String id) {
List<AgvTask> agvTaskList = agvTaskService.findByjobCode(id);
for (AgvTask agvTask : agvTaskList) {
if (!agvTask.getStatus().equals(BizStatus.FINISH)) {
agvTask.setStatus(BizStatus.CANCEL); agvTask.setStatus(BizStatus.CANCEL);
agvTask.setEndTime(new Timestamp(new Date().getTime())); agvTask.setEndTime(new Timestamp(new Date().getTime()));
agvTaskService.update(agvTask); agvTaskService.update(agvTask);
} }
} }
}else {
AgvTask agvTask= agvTaskService.findByjobCode(id,containerCode);
agvTaskService.agvTaskCallback(agvTask,missionStatus,containerCode);
List<Task> taskList = taskRepository.getAgvTaskList(agvTask.getId());
Task task = taskList.get(0);
if(task==null){
return new ResponseEntity<>(ApiResult.fail(BAD_REQUEST.value(), "任务不存在!", ""), BAD_REQUEST);
}
returnIssue(task);//叫料结果回传
} }
}else{ private Task getFirstTask(Integer agvTaskId) {
//入库 List<Task> taskList = taskRepository.getAgvTaskList(agvTaskId);
AgvTaskDto agvTaskDto = agvTaskService.findById(Integer.parseInt(id)); return taskList.isEmpty() ? null : taskList.get(0);
AgvTask agvTask = agvTaskService.toEntity(agvTaskDto);//转实体
List<Task> taskList = taskRepository.getAgvTaskList(agvTask.getId());
if (taskList.isEmpty()) {
return new ResponseEntity<>(ApiResult.fail(BAD_REQUEST.value(), "任务不存在!", ""), BAD_REQUEST);
}
Task task = taskList.get(0);
agvTaskService.agvTaskCallback(agvTask, task, missionStatus);
returnMo(task.getBillCode());//回传MO信息
} }
return new ResponseEntity<>(ApiResult.success(OK.value(), "", ""), HttpStatus.OK);
} catch (Exception e) {
return new ResponseEntity<>(ApiResult.fail(BAD_REQUEST.value(), "KMReS接口回调异常", e.getMessage()), BAD_REQUEST);
}
}
/** /**
* MO * MO
* *
* @param billCode * @param billCode
*/ */
@Async
public void returnMo(String billCode) { public void returnMo(String billCode) {
OrderDto orderDto = orderService.findByBarcodeNumber(billCode); OrderDto orderDto = orderService.findByBarcodeNumber(billCode);
@ -131,8 +154,7 @@ public class KMReSController {
long endTime = System.currentTimeMillis(); long endTime = System.currentTimeMillis();
long time = endTime - startTime; long time = endTime - startTime;
// 保存日志 // 保存日志
logService.saveLogInfo(returnMoInfo,UrlApi.publicApi, resultJson, "按MO票入库", time); logService.saveLogInfo(returnMoInfo, UrlApi.publicApi, resultJson, "按MO票入库", time);
} }
@ -143,6 +165,7 @@ public class KMReSController {
* *
* @param task * @param task
*/ */
@Async
public void returnIssue(@RequestBody Task task) { public void returnIssue(@RequestBody Task task) {
ReturnIssueInfo returnIssueInfo = getReturnIssueInfo(task); ReturnIssueInfo returnIssueInfo = getReturnIssueInfo(task);
@ -151,12 +174,10 @@ public class KMReSController {
long endTime = System.currentTimeMillis(); long endTime = System.currentTimeMillis();
long time = endTime - startTime; long time = endTime - startTime;
// 保存日志 // 保存日志
logService.saveLogInfo(returnIssueInfo,UrlApi.publicApi, resultJson, "叫料结果回传", time); logService.saveLogInfo(returnIssueInfo, UrlApi.publicApi, resultJson, "叫料结果回传", time);
} }
public static ReturnMoInfo getReturnMoInfo(List<Task> tasks) { public static ReturnMoInfo getReturnMoInfo(List<Task> tasks) {
ReturnMoParams params = new ReturnMoParams(); ReturnMoParams params = new ReturnMoParams();
params.setOrgId(808); params.setOrgId(808);

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.service; package com.youchain.businessdata.service;
import com.youchain.annotation.Log; import com.youchain.annotation.Log;
@ -23,29 +23,32 @@ import com.youchain.businessdata.service.dto.AgvTaskDto;
import com.youchain.businessdata.service.dto.AgvTaskQueryCriteria; import com.youchain.businessdata.service.dto.AgvTaskQueryCriteria;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Pageable;
import java.util.Map; import java.util.Map;
import java.util.List; import java.util.List;
import java.io.IOException; import java.io.IOException;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
/** /**
* @website https://eladmin.vip * @author baobinglin
* @description * @website https://eladmin.vip
* @author baobinglin * @description
* @date 2023-08-18 * @date 2023-08-18
**/ **/
public interface AgvTaskService { public interface AgvTaskService {
/** /**
* *
*
* @param criteria * @param criteria
* @param pageable * @param pageable
* @return Map<String,Object> * @return Map<String, Object>
*/ */
Map<String,Object> queryAll(AgvTaskQueryCriteria criteria, Pageable pageable); Map<String, Object> queryAll(AgvTaskQueryCriteria criteria, Pageable pageable);
/** /**
* *
*
* @param criteria * @param criteria
* @return List<AgvTaskDto> * @return List<AgvTaskDto>
*/ */
@ -53,6 +56,7 @@ public interface AgvTaskService {
/** /**
* ID * ID
*
* @param id ID * @param id ID
* @return AgvTaskDto * @return AgvTaskDto
*/ */
@ -60,6 +64,7 @@ public interface AgvTaskService {
/** /**
* *
*
* @param resources / * @param resources /
* @return AgvTaskDto * @return AgvTaskDto
*/ */
@ -67,18 +72,21 @@ public interface AgvTaskService {
/** /**
* *
*
* @param resources / * @param resources /
*/ */
void update(AgvTask resources); void update(AgvTask resources);
/** /**
* *
*
* @param ids / * @param ids /
*/ */
void deleteAll(Integer[] ids); void deleteAll(Integer[] ids);
/** /**
* *
*
* @param all * @param all
* @param response / * @param response /
* @throws IOException / * @throws IOException /
@ -87,6 +95,7 @@ public interface AgvTaskService {
/** /**
* *
*
* @param agvTasks * @param agvTasks
* @return * @return
*/ */
@ -94,45 +103,25 @@ public interface AgvTaskService {
/** /**
* *
*
* @param agvTasks * @param agvTasks
* @return * @return
*/ */
public String sendAgvTaskLXImpl(List<AgvTask> agvTasks); String sendAgvTaskLXImpl(List<AgvTask> agvTasks);
/** String containerIn(String containerCode, String position);
*
* @param agvTasks1-
* @param agvTasks1-
* @return
*/
public String sendAgvTaskGTImpl(List<AgvTask> agvTasks1,List<AgvTask> agvTasks2);
String containerIn(String containerCode,String position);
/** /**
* *
*
* @param containerCode- * @param containerCode-
* @return * @return
*/ */
String containerOut(String containerCode); String containerOut(String containerCode);
/**
*
* @param containerCode-
* @return
*/
String containerQuery(String containerCode);
/**
* 线
* @param taskCode-线
* @return
*/
int QueryCount(String taskCode);
/** /**
* 线 * 线
*
* @param conveyorId-线 * @param conveyorId-线
* @return * @return
*/ */
@ -142,32 +131,43 @@ public interface AgvTaskService {
/** /**
* *
*
* @param agvTask * @param agvTask
* @param status * @param status
* @param * @param
*/ */
void agvTaskCallback(AgvTask agvTask,Task task, String status); void agvTaskCallback(AgvTask agvTask, Task task, String status);
void agvTaskCallback(AgvTask agvTask,String status,String containerCode); void agvTaskCallback(AgvTask agvTask, String status, String containerCode);
List<AgvTask> findById(List<Integer> ids); // List<AgvTask> findById(List<Integer> ids);
double queryBillCodeSum(String billCode); double queryBillCodeSum(String billCode);
/** /**
*+AGV * +AGV
*
* @param jobForce- * @param jobForce-
* @param containerCode- * @param containerCode-
* @return * @return
*/ */
AgvTask findByjobCode(String jobForce,String containerCode); AgvTask findByjobCode(String jobForce, String containerCode);
/** /**
*+AGV * +AGV
*
* @param jobForce- * @param jobForce-
* @return * @return
*/ */
List<AgvTask> findByjobCode(String jobForce); List<AgvTask> findByjobCode(String jobForce);
/**
*
* @param status
* @param type
* @return
*/
List<AgvTask> queryByAgvTask(String status,String type);
} }

View File

@ -235,7 +235,7 @@ public class AgvTaskServiceImpl implements AgvTaskService {
@Override @Override
public synchronized String sendAgvTaskLXImpl(List<AgvTask> agvTasks) { public synchronized String sendAgvTaskLXImpl(List<AgvTask> agvTasks) {
JSONObject jsonObject = new JSONObject(new LinkedHashMap<>()); JSONObject jsonObject = new JSONObject(new LinkedHashMap<>());
String agvCode = TimeNumberUtils.getXJTaskCode(); String agvCode = TimeNumberUtils.getLXTaskCode();
Map<String, Object> objMap = new LinkedHashMap<>(); Map<String, Object> objMap = new LinkedHashMap<>();
objMap.put("orgId", agvCode);//库存组织 ID(或工厂代码,供应商代码) objMap.put("orgId", agvCode);//库存组织 ID(或工厂代码,供应商代码)
objMap.put("requestId", agvCode);//请求 id objMap.put("requestId", agvCode);//请求 id
@ -273,10 +273,19 @@ public class AgvTaskServiceImpl implements AgvTaskService {
objMap.put("missionData", missionDataArray); objMap.put("missionData", missionDataArray);
jsonObject.putAll(objMap); jsonObject.putAll(objMap);
System.out.println(jsonObject.toString()); String resultJson="{\n" +
String resultJson = HttpPostUtil.sendPostReq(UrlApi.submitMission, jsonObject.toString()); " \"data\": null,\n" +
" \"code\": \"0\",\n" +
" \"message\": null,\n" +
" \"success\": true\n" +
"}";
//String resultJson = HttpPostUtil.sendPostReq(UrlApi.submitMission, jsonObject.toString());
if (resultJson == null) {
return null;
}
JSONObject resulObject = JSON.parseObject(resultJson); JSONObject resulObject = JSON.parseObject(resultJson);
String code = resulObject.getString("code") == null ? "" : resulObject.getString("code"); String code = resulObject.getString("code") == null ? "" : resulObject.getString("code");
if (code.equals("0")) { if (code.equals("0")) {
for (int i = 0; i < agvTasks.size(); i++) { for (int i = 0; i < agvTasks.size(); i++) {
AgvTask agvTask = agvTasks.get(i); AgvTask agvTask = agvTasks.get(i);
@ -299,92 +308,6 @@ public class AgvTaskServiceImpl implements AgvTaskService {
return resultJson; return resultJson;
} }
@Override
public synchronized String sendAgvTaskGTImpl(List<AgvTask> agvTasks1, List<AgvTask> agvTasks2) {
JSONObject jsonObject = new JSONObject(new LinkedHashMap<>());
String agvCode = TimeNumberUtils.getGTTaskCode();
Map<String, Object> objMap = new LinkedHashMap<>();
objMap.put("orgId", agvCode);//库存组织 ID(或工厂代码,供应商代码)
objMap.put("requestId", agvCode);//请求 id
objMap.put("missionCode", agvCode);//任务编号
objMap.put("missionType", "ROLLER_MOVE");//任务类型 :滚筒
objMap.put("viewBoardType", "");//上视识别类型:
JSONArray missionDataArray = new JSONArray();
for (int i = 0; i < agvTasks1.size(); i++) {
AgvTask agvTask = agvTasks1.get(i);
JSONObject missionDataObj = new JSONObject(new LinkedHashMap<>());
Map<String, Object> missionDataMap = new LinkedHashMap<>();
missionDataMap.put("sequence", (i + 1));//序号
missionDataMap.put("binCode", agvTask.getStockCode());//料箱号
missionDataMap.put("startDeviceCode", agvTask.getStartSlotCode());//料箱所在的起始槽位
missionDataMap.put("endDeviceCode", agvTask.getEndSlotCode());//料箱所在的目标槽位
missionDataMap.put("rollerLevel", 2);//层
missionDataMap.put("rollerColumn", (i + 1));//列
missionDataObj.putAll(missionDataMap);
missionDataArray.add(missionDataObj);
}
int sum = agvTasks1.size();
if (agvTasks2.size() > 0) {
for (int i = 0; i < agvTasks2.size(); i++) {
AgvTask agvTask = agvTasks2.get(i);
JSONObject missionDataObj = new JSONObject(new LinkedHashMap<>());
Map<String, Object> missionDataMap = new LinkedHashMap<>();
missionDataMap.put("sequence", (sum + (i + 1)));//序号
missionDataMap.put("binCode", agvTask.getStockCode());//料箱号
missionDataMap.put("startDeviceCode", agvTask.getStartSlotCode());//料箱所在的起始槽位
missionDataMap.put("endDeviceCode", agvTask.getEndSlotCode());//料箱所在的目标槽位
missionDataMap.put("rollerLevel", 1);//层
missionDataMap.put("rollerColumn", (i + 1));//列
missionDataObj.putAll(missionDataMap);
missionDataArray.add(missionDataObj);
}
}
objMap.put("missionData", missionDataArray);
jsonObject.putAll(objMap);
System.out.println(jsonObject.toString());
String resultJson = HttpPostUtil.sendPostReq(UrlApi.submitMission, jsonObject.toString());//返回ResponseJson*/
JSONObject resulObject = JSON.parseObject(resultJson);
String code = resulObject.getString("code") == null ? "" : resulObject.getString("code");
if (code.equals("0")) {
for (int i = 0; i < agvTasks1.size(); i++) {
AgvTask agvTask = agvTasks1.get(i);
agvTask.setJobForce(agvCode);//任务组
agvTask.setJobForceAsc((i + 1));
agvTask.setStatus(BizStatus.ATCALL);
agvTask.setJobMessage(resultJson);
agvTask.setReqMessage(jsonObject.toString());
agvTask.setStartTime(new Timestamp(new Date().getTime()));
update(agvTask);
}
for (int i = 0; i < agvTasks2.size(); i++) {
AgvTask agvTask = agvTasks2.get(i);
agvTask.setJobForce(agvCode);//任务组
agvTask.setJobForceAsc((i + 1));
agvTask.setStatus(BizStatus.ATCALL);
agvTask.setJobMessage(resultJson);
agvTask.setReqMessage(jsonObject.toString());
agvTask.setStartTime(new Timestamp(new Date().getTime()));
update(agvTask);
}
} else {
for (int i = 0; i < agvTasks1.size(); i++) {
AgvTask agvTask = agvTasks1.get(i);
agvTask.setJobMessage(resultJson);
agvTask.setReqMessage(jsonObject.toString());
update(agvTask);
}
for (int i = 0; i < agvTasks2.size(); i++) {
AgvTask agvTask = agvTasks2.get(i);
agvTask.setJobMessage(resultJson);
agvTask.setReqMessage(jsonObject.toString());
update(agvTask);
}
}
return resultJson;
}
@Override @Override
public synchronized String containerIn(String containerCode, String position) { public synchronized String containerIn(String containerCode, String position) {
JSONObject jsonObject = new JSONObject(new LinkedHashMap<>()); JSONObject jsonObject = new JSONObject(new LinkedHashMap<>());
@ -406,28 +329,6 @@ public class AgvTaskServiceImpl implements AgvTaskService {
return jsonObject.toJSONString(); return jsonObject.toJSONString();
} }
@Override
public String containerQuery(String containerCode) {
JSONObject jsonObject = new JSONObject(new LinkedHashMap<>());
jsonObject.put("nodeCode", "");//点位编码
jsonObject.put("containerModelCode", "");//容器模型编码
jsonObject.put("containerCode", containerCode);//容器编号
jsonObject.put("areaCode", "");//区域编码
jsonObject.put("emptyFullStatus", 2);//容器的空满状态 空 0 满 1 全部 2
return jsonObject.toJSONString();
}
@Override
public int QueryCount(String taskCode) {
String jsonObject = "{\"taskCode\":\"" + taskCode + "\"}";//查询出库缓存输送线上满料箱总数
String resultJson = HttpPostUtil.sendPostReq(UrlApi.QueryCount, jsonObject);
JSONObject json = JSON.parseObject(resultJson);
String queryCount = json.getString("queryCount");
return Integer.parseInt(queryCount);
}
@Override @Override
public void getConveyorState(String conveyorId) { public void getConveyorState(String conveyorId) {
/* String resultJson= HttpPostUtil.sendPostReq(UrlApi.agv_url, jsonObject.toString());//返回ResponseJson*/ /* String resultJson= HttpPostUtil.sendPostReq(UrlApi.agv_url, jsonObject.toString());//返回ResponseJson*/
@ -524,16 +425,6 @@ public class AgvTaskServiceImpl implements AgvTaskService {
} }
} }
@Override
public List<AgvTask> findById(List<Integer> ids) {
String agvTaskIds = StringUtils.strip(ids.toString(), "[]");
String hql = " from AgvTask agv where agv.id in (" + agvTaskIds + ") ";
Query query = entityMapper.createQuery(hql);
List<AgvTask> agvTaskList = query.getResultList();
return agvTaskList;
}
@Override @Override
public double queryBillCodeSum(String billCode) { public double queryBillCodeSum(String billCode) {
String hql = "select sum(task.moveQty) from Task task where task.billCode= :billCode"; String hql = "select sum(task.moveQty) from Task task where task.billCode= :billCode";
@ -569,4 +460,14 @@ public class AgvTaskServiceImpl implements AgvTaskService {
return agvTaskList; return agvTaskList;
} }
@Override
public List<AgvTask> queryByAgvTask(String status, String type) {
String hql = " from AgvTask agv where agv.status= :status and agv.type= :type";
Query query = entityMapper.createQuery(hql);
query.setParameter("status", status);
query.setParameter("type", type);
List<AgvTask> agvTaskList = query.getResultList();
return agvTaskList;
}
} }

View File

@ -95,29 +95,26 @@ public class MlsServiceImpl implements MlsService {
@Override @Override
public void getOrderInfo(String resultJson) { public void getOrderInfo(String resultJson) {
if (StringUtils.isEmpty(resultJson)) { if (StringUtils.isEmpty(resultJson)) {
throw new RuntimeException("获取送货单接口失败!"); throw new IllegalArgumentException("获取送货单接口失败!");
} }
JSONObject resulObject = JSON.parseObject(resultJson); JSONObject resulObject = JSON.parseObject(resultJson);
if (resulObject == null) {
throw new RuntimeException("获取送货单接口返回数据为空!");
}
String code = resulObject.getString("code") == null ? "" : resulObject.getString("code"); String code = resulObject.getString("code") == null ? "" : resulObject.getString("code");
String msg = resulObject.getString("msg") == null ? "" : resulObject.getString("msg"); String msg = resulObject.getString("msg") == null ? "" : resulObject.getString("msg");
//判断接口是否成功 //判断接口是否成功
if (!"0".equals(code)) { if (!"0".equals(code)) {
throw new RuntimeException("获取送货单接口异常信息:" + msg); throw new IllegalArgumentException("获取送货单接口异常信息:" + msg);
} }
String data = resulObject.getString("data") == null ? "" : resulObject.getString("data"); String data = resulObject.getString("data") == null ? "" : resulObject.getString("data");
JSONObject dataObject = JSON.parseObject(data); if (StringUtils.isEmpty(data)) {
if (dataObject == null) { throw new IllegalArgumentException("获取送货单接口返回数据为空!");
throw new RuntimeException("获取送货单接口返回数据为空!");
} }
JSONObject dataObject = JSON.parseObject(data);
JSONArray details = dataObject.getJSONArray("list"); JSONArray details = dataObject.getJSONArray("list");
//判断是否有送货单数据 //判断是否有送货单数据
if (details == null || details.size() == 0) { if (details == null || details.isEmpty()) {
throw new RuntimeException("没有获取到送货单数据!"); throw new IllegalArgumentException("没有获取到送货单数据!");
} }
List<Order> ordersToCreate = new ArrayList<>();//新增订单集合 List<Order> ordersToCreate = new ArrayList<>();//新增订单集合
@ -233,31 +230,29 @@ public class MlsServiceImpl implements MlsService {
* @return * @return
*/ */
@Override @Override
@Transactional(rollbackFor = Exception.class)
public void getMoInfo(String resultJson) { public void getMoInfo(String resultJson) {
if (StringUtils.isEmpty(resultJson)) { if (StringUtils.isEmpty(resultJson)) {
throw new RuntimeException("获取MO票接口失败!"); throw new IllegalArgumentException("MO票接口失败!");
} }
JSONObject resulObject = JSON.parseObject(resultJson); JSONObject resulObject = JSON.parseObject(resultJson);
if (resulObject == null) {
throw new RuntimeException("获取MO票接口返回数据为空!");
}
String code = resulObject.getString("code") == null ? "" : resulObject.getString("code"); String code = resulObject.getString("code") == null ? "" : resulObject.getString("code");
String msg = resulObject.getString("msg") == null ? "" : resulObject.getString("msg"); String msg = resulObject.getString("msg") == null ? "" : resulObject.getString("msg");
if (!"0".equals(code)) { if (!"0".equals(code)) {
throw new RuntimeException("获取MO票接口异常信息:" + msg); throw new IllegalArgumentException("MO票接口异常: " + msg);
} }
String data = resulObject.getString("data") == null ? "" : resulObject.getString("data"); String data = resulObject.getString("data") == null ? "" : resulObject.getString("data");
JSONObject dataObject = JSON.parseObject(data); if (StringUtils.isEmpty(data)) {
if (dataObject == null) { throw new IllegalArgumentException("获取MO票接口返回数据为空!");
throw new RuntimeException("获取MO票接口返回数据为空!");
} }
JSONObject dataObject = JSON.parseObject(data);
JSONArray details = dataObject.getJSONArray("list"); JSONArray details = dataObject.getJSONArray("list");
//判断是否有MO票数据 //判断是否有MO票数据
if (details == null || details.size() == 0) { if (details == null || details.isEmpty()) {
throw new RuntimeException("没有获取到MO票数据!"); throw new IllegalArgumentException("未获取到MO票数据!");
} }
List<Mo> mosToCreate = new ArrayList<>();//新增Mo集合 List<Mo> mosToCreate = new ArrayList<>();//新增Mo集合
@ -278,21 +273,11 @@ public class MlsServiceImpl implements MlsService {
Map<String, Mo> existingMos = moService.findBylabelNos(labelNos); Map<String, Mo> existingMos = moService.findBylabelNos(labelNos);
//获取仓库 //获取仓库
Dept dept = null; Dept dept = getDeptFromCache();
boolean flag = redisUtils.hasKey("dept");
if (flag) {
dept = (Dept) redisUtils.get("dept");
} else {
DeptDto deptDto = deptService.findById(7L);
dept = deptService.toEntity(deptDto);
redisUtils.set("dept", dept, 0);
}
//循环处理每个MO票 //循环处理每个MO票
for (int i = 0; i < details.size(); i++) { for (int i = 0; i < details.size(); i++) {
JSONObject detail = details.getJSONObject(i); JSONObject detail = details.getJSONObject(i);
String labelState = detail.getString("labelState");//标签状态
//物料编码 //物料编码
String itemCode = detail.getString("itemCode").trim(); String itemCode = detail.getString("itemCode").trim();
Item item = null; Item item = null;
@ -328,6 +313,22 @@ public class MlsServiceImpl implements MlsService {
} }
} }
private Dept getDeptFromCache() {
// 从缓存中获取部门信息
Dept dept = (Dept) redisUtils.get("dept");
if (dept == null) {
try {
// 缓存中不存在,从数据库中获取
DeptDto deptDto = deptService.findById(7L);
dept = deptService.toEntity(deptDto);
redisUtils.set("dept", dept); // 存储到缓存,可考虑设置适当的过期时间或不设
} catch (Exception e) {
e.printStackTrace();
}
}
return dept;
}
/** /**
* *
* *
@ -397,8 +398,7 @@ public class MlsServiceImpl implements MlsService {
} }
@Override @Override
@Transactional(rollbackFor = Exception.class) public void getIssueInfo(IssueInfo issueInfo) {
public synchronized void getIssueInfo(IssueInfo issueInfo) {
String taskNumber = issueInfo.getTaskNumber();//任务号 String taskNumber = issueInfo.getTaskNumber();//任务号
// 指定Set的类型 // 指定Set的类型
Set<String> workOrderNameSet = issueInfo.getWorkOrderName(); Set<String> workOrderNameSet = issueInfo.getWorkOrderName();
@ -407,18 +407,18 @@ public class MlsServiceImpl implements MlsService {
} }
List<Inventory> inventoryList = inventoryService.findInvByBillCode(workOrderNameSet);//根据工单号查询库存信息 List<Inventory> inventoryList = inventoryService.findInvByBillCode(workOrderNameSet);//根据工单号查询库存信息
if (inventoryList.size() == 0) { if (inventoryList.isEmpty()) {
throw new RuntimeException("无库存信息!"); throw new RuntimeException("无库存信息!");
} }
//目标点 //目标点
Point endPoint = null; Point endPoint = null;
boolean flag = redisUtils.hasKey("endPoint"); boolean flag = redisUtils.hasKey("ckjbk");
if (flag) { if (flag) {
endPoint = (Point) redisUtils.get("endPoint"); endPoint = (Point) redisUtils.get("ckjbk");
} else { } else {
endPoint = pointService.findByCode(null, null, null, "出库接驳口", null); endPoint = pointService.findByCode(null, null, null, "出库接驳口", null);
redisUtils.set("endPoint", endPoint, 0); redisUtils.set("ckjbk", endPoint);
} }
List<Inventory> inventoryToUpdate = new ArrayList<>(); List<Inventory> inventoryToUpdate = new ArrayList<>();
@ -444,10 +444,11 @@ public class MlsServiceImpl implements MlsService {
pd.setOrderQty(inv.getQuantity()); pd.setOrderQty(inv.getQuantity());
pd.setAllocatedQty(inv.getQuantity()); pd.setAllocatedQty(inv.getQuantity());
pd.setStatus(BizStatus.ALLOCATE); pd.setStatus(BizStatus.ALLOCATE);
pd.setDept(item.getDept());
pickDetailToCreate.add(pd); pickDetailToCreate.add(pd);
//生成搬运任务 //生成搬运任务
AgvTask agvTask = new AgvTask(BizStatus.PICK, stock.getCode(), startPoint.getCode(), endPoint.getCode(), BizStatus.OPEN, "01"); AgvTask agvTask = new AgvTask(BizStatus.PICK, stock.getCode(), startPoint.getCode(), endPoint.getCode(), BizStatus.OPEN, "PICKER_MOVE");
agvTaskToCreate.add(agvTask); agvTaskToCreate.add(agvTask);
//生成Task //生成Task
@ -478,14 +479,17 @@ public class MlsServiceImpl implements MlsService {
batchCreateOrUpdate.batchUpdate(inventoryToUpdate); batchCreateOrUpdate.batchUpdate(inventoryToUpdate);
} }
//批量生成出库明细
if (!pickDetailToCreate.isEmpty()) { if (!pickDetailToCreate.isEmpty()) {
batchCreateOrUpdate.batchCreate(pickDetailToCreate); batchCreateOrUpdate.batchCreate(pickDetailToCreate);
} }
//批量生成agv任务
if (!agvTaskToCreate.isEmpty()) { if (!agvTaskToCreate.isEmpty()) {
batchCreateOrUpdate.batchCreate(agvTaskToCreate); batchCreateOrUpdate.batchCreate(agvTaskToCreate);
} }
//批量生成task任务
if (!taskToCreate.isEmpty()) { if (!taskToCreate.isEmpty()) {
batchCreateOrUpdate.batchCreate(taskToCreate); batchCreateOrUpdate.batchCreate(taskToCreate);
} }

View File

@ -35,6 +35,7 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import org.springframework.data.domain.Page; import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Pageable;
import java.util.*; import java.util.*;
import java.io.IOException; import java.io.IOException;
import javax.persistence.EntityManager; import javax.persistence.EntityManager;
@ -63,6 +64,7 @@ public class MoServiceImpl implements MoService {
private final TaskService taskService; private final TaskService taskService;
private final AsnDetailService asnDetailService; private final AsnDetailService asnDetailService;
private final ItemKeyService itemKeyService; private final ItemKeyService itemKeyService;
private final RedisUtils redisUtils;
@Override @Override
public Map<String, Object> queryAll(MoQueryCriteria criteria, Pageable pageable) { public Map<String, Object> queryAll(MoQueryCriteria criteria, Pageable pageable) {
@ -153,63 +155,62 @@ public class MoServiceImpl implements MoService {
public void scanMo(String mo) { public void scanMo(String mo) {
//条码格式12227000016951-qth1847-240411422924 //条码格式12227000016951-qth1847-240411422924
String[] arr = mo.split("-"); // 验证条码格式
if (arr.length != 3) { validateBarcodeFormat(mo);
throw new RuntimeException("条码格式错误!");
}
String[] arr = mo.split("-");
String itemCode = arr[0];//物料编号 String itemCode = arr[0];//物料编号
String stockCode = arr[1];//容器编号 String stockCode = arr[1];//容器编号
String labelNo = arr[2];//标签号 String labelNo = arr[2];//标签号
Item item = itemService.existItem(itemCode); // 验证物料是否存在
if (item == null) { Item item = null;
throw new RuntimeException(itemCode + "系统无此物料!"); boolean flagItem = redisUtils.hasKey(itemCode);
if (flagItem) {
item = (Item) redisUtils.get(itemCode);
} else {
item = getOrThrow(Optional.ofNullable(itemService.existItem(itemCode)), itemCode + " 系统无此物料!");
redisUtils.set(itemCode,item);
} }
Stock stock = stockService.findByCode(stockCode, null); // 验证容器是否存在
if (stock == null) { Stock stock=null;
throw new RuntimeException(stockCode + "系统无此容器!"); boolean flagStock = redisUtils.hasKey(stockCode);
if (flagStock) {
stock = (Stock) redisUtils.get(stockCode);
} else {
stock = getOrThrow(Optional.ofNullable(stockService.findByCode(stockCode, null)), stockCode + " 系统无此容器!");
redisUtils.set(stockCode,stock);
} }
// 验证容器状态
validateStockStatus(stock);
if (stock.getStatus().equals(BaseStatus.USED)) { //验证入库接驳口是否存在
throw new RuntimeException(stockCode + "箱码已经有绑定关系!"); Point srcPoint = null;
boolean flagSrcPoint = redisUtils.hasKey("rkjbk");
if (flagSrcPoint) {
srcPoint = (Point) redisUtils.get("rkjbk");
} else {
srcPoint = getOrThrow(Optional.ofNullable(pointService.findByCode(null, null, null, "入库接驳口", null)), "系统无入库接驳口!");
redisUtils.set("rkjbk", srcPoint, 0);
} }
Point endPoint = getOrThrow(Optional.ofNullable(pointService.findByCode(null, BaseStatus.FREE, BaseStatus.STORAGE, "存储区", null)), "存储区没有空闲点位!");
Point srcPoint = pointService.findByCode(null, null, null, "入库接驳口", null); MoDto moDto = getOrThrow(Optional.ofNullable(findByLabelNo(labelNo)), labelNo + " 系统无此标签!");
if (srcPoint == null) {
throw new RuntimeException("系统无入库接驳口!");
}
Point endPoint = pointService.findByCode(null, BaseStatus.FREE, BaseStatus.STORAGE, "存储区", null); // 验证标签状态
if (endPoint == null) { validateLabelState(moDto);
throw new RuntimeException("存储区没有空闲点位!");
}
MoDto moDto = this.findByLabelNo(labelNo); // 验证标签是否已入库
if (moDto == null) { validateTask(moDto);
throw new RuntimeException(labelNo + "系统无此标签!");
}
if (!moDto.getLabelState().equals("PRINTED")) { // 验证送货单是否存在
throw new RuntimeException(labelNo + "标签已被接收(已接收状态)!"); OrderDto orderDto = getOrThrow(Optional.ofNullable(orderService.findByDeliveryHeaderId(moDto.getDeliveryHeaderId())), moDto.getDeliveryHeaderId() + " 系统无此送货单!");
}
if (taskService.findByLabelNo(labelNo).size() > 0) { // 验证送货单状态
throw new RuntimeException(labelNo + "此标签已入库!"); validateOrder(orderDto, moDto);
}
OrderDto orderDto = orderService.findByDeliveryHeaderId(moDto.getDeliveryHeaderId());
if (orderDto == null) {
throw new RuntimeException(moDto.getDeliveryHeaderId() + "系统无此订单!");
}
if (!orderDto.getDeliveryStatus().equals("lm_initial")) {
throw new RuntimeException(moDto.getLabelNo() + "标签背后的送货单" + orderDto.getBarcodeNumber() + "已取消(标签失效)!");
}
// 生成AGV任务和入库任务 // 生成AGV任务和入库任务
createTasks(item, stock, srcPoint, endPoint, moDto.getLabelNo(), moDto, orderDto); createTasks(item, stock, srcPoint, endPoint, moDto.getLabelNo(), moDto, orderDto);
@ -220,6 +221,40 @@ public class MoServiceImpl implements MoService {
} }
private void validateBarcodeFormat(String mo) {
if (mo.split("-").length != 3) {
throw new IllegalArgumentException("条码格式错误!");
}
}
private <T> T getOrThrow(Optional<T> optional, String errorMessage) {
return optional.orElseThrow(() -> new RuntimeException(errorMessage));
}
private void validateStockStatus(Stock stock) {
if (stock.getStatus().equals(BaseStatus.USED)) {
throw new RuntimeException(stock.getCode() + " 箱码已经有绑定关系!");
}
}
private void validateLabelState(MoDto moDto) {
if (!"PRINTED".equals(moDto.getLabelState())) {
throw new RuntimeException(moDto.getLabelNo() + " 标签已被接收(已接收状态)!");
}
}
private void validateTask(MoDto moDto) {
if (taskService.findByLabelNo(moDto.getLabelNo()).size() > 0) {
throw new RuntimeException(moDto.getLabelNo() + "此标签已入库!");
}
}
private void validateOrder(OrderDto orderDto, MoDto moDto) {
if (!orderDto.getDeliveryStatus().equals("lm_initial")) {
throw new RuntimeException(moDto.getLabelNo() + "标签背后的送货单" + orderDto.getBarcodeNumber() + "已取消(标签失效)!");
}
}
@Override @Override
public Map<String, Mo> findBylabelNos(Set labelNos) { public Map<String, Mo> findBylabelNos(Set labelNos) {
String hql = "from Mo where labelNo in (:labelNos) "; String hql = "from Mo where labelNo in (:labelNos) ";
@ -235,7 +270,7 @@ public class MoServiceImpl implements MoService {
public void createTasks(Item item, Stock stock, Point srcPoint, Point endPoint, String propC1, MoDto moDto, OrderDto orderDto) { public void createTasks(Item item, Stock stock, Point srcPoint, Point endPoint, String propC1, MoDto moDto, OrderDto orderDto) {
// 生成AGV任务 // 生成AGV任务
AgvTask agvTask = new AgvTask(BizStatus.ASN, stock.getCode(), srcPoint.getCode(), endPoint.getCode(), BizStatus.OPEN, "RACK_MOVE_FULL"); AgvTask agvTask = new AgvTask(BizStatus.ASN, stock.getCode(), srcPoint.getCode(), endPoint.getCode(), BizStatus.OPEN, "PICKER_MOVE");
agvTaskService.create(agvTask); agvTaskService.create(agvTask);
// 生成入库任务 // 生成入库任务

View File

@ -2,14 +2,12 @@ package com.youchain.modules.quartz.task;
import com.youchain.businessdata.inputJson.MoInfo; import com.youchain.businessdata.inputJson.MoInfo;
import com.youchain.businessdata.inputJson.MoParams; import com.youchain.businessdata.inputJson.MoParams;
import com.youchain.businessdata.rest.MlsController;
import com.youchain.businessdata.service.MlsService; import com.youchain.businessdata.service.MlsService;
import com.youchain.service.LogService; import com.youchain.service.LogService;
import com.youchain.utils.UrlApi; import com.youchain.utils.UrlApi;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.HashSet; import java.util.HashSet;
import java.util.Set; import java.util.Set;
@ -46,8 +44,8 @@ public class moTask {
params.setInvCodes(invCodes); params.setInvCodes(invCodes);
//DateUtil.format(DateUtil.beginOfDay(new Date()), "yyyy-MM-dd HH:mm:ss") //DateUtil.format(DateUtil.beginOfDay(new Date()), "yyyy-MM-dd HH:mm:ss")
params.setIqcResult(""); params.setIqcResult("");
params.setStartTime("2024-04-28 00:00:00"); params.setStartTime("2024-04-27 00:00:00");
params.setEndTime("2024-04-28 23:59:59"); params.setEndTime("2024-04-27 23:59:59");
params.setPageNo(1); params.setPageNo(1);
params.setPageSize(100); params.setPageSize(100);
MoInfo moInfo = new MoInfo(); MoInfo moInfo = new MoInfo();

View File

@ -26,77 +26,45 @@ import java.util.concurrent.CopyOnWriteArrayList;
@Service @Service
public class pickTask { public class pickTask {
@Autowired
public AgvTaskRepository agvTaskRepository;
@Autowired @Autowired
public AgvTaskService agvTaskService; public AgvTaskService agvTaskService;
private Map<String, List<Integer>> groupedTasks = new HashMap<>(); private static final int MAX_TASK_COUNT = 5;
private static final long TIMEOUT_MS = 2*60*1000;
private long lastTaskTime = System.currentTimeMillis(); private long lastTaskTime = System.currentTimeMillis();
public void pickTask() { public void pickTask() {
//按线边分组 下发出库任务 // 下发出库任务
List<Object> objectList = agvTaskRepository.queryGroupAgvTask(); List<AgvTask> agvTaskList = agvTaskService.queryByAgvTask(BizStatus.OPEN,BizStatus.PICK);
for (Object obj : objectList) { if (agvTaskList.size() > 0) {
List<AgvTask> agvTaskList = agvTaskRepository.queryLineAgvTask(obj.toString()); if ((agvTaskList.size() == MAX_TASK_COUNT)) {
for (AgvTask agvTask : agvTaskList) { Result(agvTaskService.sendAgvTaskLXImpl(agvTaskList));
List<Integer> agvTaskList1 = groupedTasks.get(obj.toString());
if (agvTaskList1 == null) {
groupedTasks.computeIfAbsent(obj.toString(), k -> new CopyOnWriteArrayList<>()).add(agvTask.getId());
} else if (agvTaskList1.size() <= 4) {
boolean containsElement = agvTaskList1.contains(agvTask.getId());
if (!containsElement) {
groupedTasks.computeIfAbsent(obj.toString(), k -> new CopyOnWriteArrayList<>()).add(agvTask.getId());
}
}
}
// 检查是否满足四个为一组或者时间超过五分钟
if ((isGroupingConditionsMet() || timeExceeded()) && isLine() ) {
issueGroupedTasks();
groupedTasks.clear();
lastTaskTime = System.currentTimeMillis(); lastTaskTime = System.currentTimeMillis();
}else if((System.currentTimeMillis() - lastTaskTime >=TIMEOUT_MS) ){
if(agvTaskList.size()>MAX_TASK_COUNT){
List<AgvTask> newAgvTask = agvTaskList.subList(0,MAX_TASK_COUNT);
Result(agvTaskService.sendAgvTaskLXImpl(newAgvTask));
}else{ }else{
log.info("小件出库料箱任务未满足条件!"); Result(agvTaskService.sendAgvTaskLXImpl(agvTaskList));
lastTaskTime = System.currentTimeMillis();
} }
} else {
throw new RuntimeException("出库料箱任务未满足条件(不满足五个料箱需等待2分钟)!");
}
} else {
throw new RuntimeException("无出库料箱任务!");
} }
} }
private boolean isLine() { private void Result(String result) {
// 判断缓存输送线上的料箱总数+AGV执行中的数量 不能超过6个 if(result==null ||result.length()==0){
int queryCount = agvTaskService.QueryCount("6x1"); throw new RuntimeException("任务下发失败!");
//出库料箱AGV执行中的数量
//List<AgvTask> agvTaskList= agvTaskService.findByAgvList(BizStatus.PICK,"PICKER_MOVE");
if(queryCount<=6){
return true;
} }
return false;
}
private boolean isGroupingConditionsMet() {
// 判断是否满足四个为一组的条件
return groupedTasks.values().stream().anyMatch(tasks -> tasks.size() == 4);
}
private boolean timeExceeded() {
// 判断时间是否超过3分钟
return System.currentTimeMillis() - lastTaskTime >= 2 * 60 * 1000;
}
private void issueGroupedTasks() {
// 实现任务下发的逻辑
// 可以遍历groupedTasks处理每个分组的任务
for (List<Integer> tasksInGroup : groupedTasks.values()) {
List<AgvTask> agvTaskList= agvTaskService.findById(tasksInGroup);
String rul=agvTaskService.sendAgvTaskLXImpl(agvTaskList);
System.out.println(rul);
} }
}
} }

View File

@ -31,12 +31,12 @@ public class TimeNumberUtils {
return "RC"+datetime +addLeftZero(s, length); return "RC"+datetime +addLeftZero(s, length);
} }
public static synchronized String getXJTaskCode() { public static synchronized String getLXTaskCode() {
sequence = sequence >= 999999 ? 1 : sequence + 1; sequence = sequence >= 999999 ? 1 : sequence + 1;
String datetime = new SimpleDateFormat("yyMMddHHmmss") String datetime = new SimpleDateFormat("yyMMddHHmmss")
.format(new Date()); .format(new Date());
String s = Integer.toString(sequence); String s = Integer.toString(sequence);
return "XJ"+datetime +addLeftZero(s, length); return "LX"+datetime +addLeftZero(s, length);
} }
public static synchronized String getGTTaskCode() { public static synchronized String getGTTaskCode() {

View File

@ -18,6 +18,8 @@ package com.youchain.modules.security.service.dto;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Data; import lombok.Data;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.util.Date; import java.util.Date;
/** /**
@ -27,7 +29,7 @@ import java.util.Date;
@Data @Data
@AllArgsConstructor @AllArgsConstructor
@NoArgsConstructor @NoArgsConstructor
public class OnlineUserDto { public class OnlineUserDto implements Serializable {
/** /**
* *