diff --git a/youchain-common/src/main/java/com/youchain/utils/RedisUtils.java b/youchain-common/src/main/java/com/youchain/utils/RedisUtils.java index 8eb3f3f..59bfebb 100644 --- a/youchain-common/src/main/java/com/youchain/utils/RedisUtils.java +++ b/youchain-common/src/main/java/com/youchain/utils/RedisUtils.java @@ -23,6 +23,7 @@ import org.springframework.beans.factory.annotation.Value; import org.springframework.data.redis.connection.RedisConnection; import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis.core.*; +import org.springframework.data.redis.serializer.JdkSerializationRedisSerializer; import org.springframework.data.redis.serializer.StringRedisSerializer; import org.springframework.stereotype.Component; @@ -45,6 +46,7 @@ public class RedisUtils { this.redisTemplate.setHashKeySerializer(new StringRedisSerializer()); this.redisTemplate.setKeySerializer(new StringRedisSerializer()); this.redisTemplate.setStringSerializer(new StringRedisSerializer()); + this.redisTemplate.setValueSerializer(new JdkSerializationRedisSerializer()); } /** diff --git a/youchain-common/target/classes/com/youchain/utils/RedisUtils.class b/youchain-common/target/classes/com/youchain/utils/RedisUtils.class index 320a355..7cf34f6 100644 Binary files a/youchain-common/target/classes/com/youchain/utils/RedisUtils.class and b/youchain-common/target/classes/com/youchain/utils/RedisUtils.class differ diff --git a/youchain-system/src/main/java/com/youchain/AppRun.java b/youchain-system/src/main/java/com/youchain/AppRun.java index 472bfa7..4aa6a42 100644 --- a/youchain-system/src/main/java/com/youchain/AppRun.java +++ b/youchain-system/src/main/java/com/youchain/AppRun.java @@ -55,6 +55,8 @@ public class AppRun { // 或者在 application.yml 添加文件路径,方便 kill,kill `cat /home/eladmin/app.pid` springApplication.addListeners(new ApplicationPidFileWriter()); springApplication.run(args); + + } @Bean 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 9bae964..e48a867 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 @@ -1,19 +1,20 @@ /* -* Copyright 2019-2020 Zheng Jie -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ + * Copyright 2019-2020 Zheng Jie + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package com.youchain.businessdata.repository; + import com.youchain.businessdata.domain.AgvTask; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.JpaSpecificationExecutor; @@ -22,63 +23,18 @@ import org.springframework.data.jpa.repository.Query; import java.util.List; /** -* @website https://eladmin.vip -* @author baobinglin -* @date 2023-08-18 -**/ + * @author baobinglin + * @website https://eladmin.vip + * @date 2023-08-18 + **/ public interface AgvTaskRepository extends JpaRepository, JpaSpecificationExecutor { - /** - * 查询滚筒出库任务执行中的任务 - * @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 */ @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) List 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 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 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 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 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 queryLineAgvTask(String line_slot_code); } 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 index 7fc0f65..495887a 100644 --- a/youchain-system/src/main/java/com/youchain/businessdata/rest/KMReSController.java +++ b/youchain-system/src/main/java/com/youchain/businessdata/rest/KMReSController.java @@ -30,6 +30,7 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; 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.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; @@ -49,6 +50,7 @@ import static org.springframework.http.HttpStatus.OK; @Api(tags = "KMReS") @RequestMapping("/interfaces/api/amr") @Slf4j +@EnableAsync public class KMReSController { private final AgvTaskService agvTaskService; @@ -63,57 +65,78 @@ public class KMReSController { @ApiOperation("KMReS接口回调") @AnonymousAccess public ResponseEntity missionStateCallback(@RequestBody MissionStateCallback missionStateCallback) { - String id = missionStateCallback.getMissionCode();//作业 id - String containerCode = missionStateCallback.getContainerCode();//容器编号 - String missionStatus = missionStateCallback.getMissionStatus();//作业当前状态 - try { - //料箱出库任务 - if(id.indexOf("XJ")!=-1){ - if(missionStatus.equals("CANCELED")){ - List agvTaskList= agvTaskService.findByjobCode(id); - for(AgvTask agvTask:agvTaskList){ - if(!agvTask.getStatus().equals(BizStatus.FINISH)){ - agvTask.setStatus(BizStatus.CANCEL); - agvTask.setEndTime(new Timestamp(new Date().getTime())); - agvTaskService.update(agvTask); - } - } - }else { - AgvTask agvTask= agvTaskService.findByjobCode(id,containerCode); - agvTaskService.agvTaskCallback(agvTask,missionStatus,containerCode); - List 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);//叫料结果回传 - } + String id = missionStateCallback.getMissionCode(); // 作业 id + String containerCode = missionStateCallback.getContainerCode(); // 容器编号 + String missionStatus = missionStateCallback.getMissionStatus(); // 作业当前状态 - }else{ + try { + if (id.contains("LX")) { + //出库 + pickTask(id, containerCode, missionStatus); + } else { //入库 - AgvTaskDto agvTaskDto = agvTaskService.findById(Integer.parseInt(id)); - AgvTask agvTask = agvTaskService.toEntity(agvTaskDto);//转实体 - List 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信息 + asnTask(id, missionStatus); } - return new ResponseEntity<>(ApiResult.success(OK.value(), "", ""), HttpStatus.OK); + return ResponseEntity.ok(ApiResult.success(HttpStatus.OK.value(), "", "")); } catch (Exception e) { - return new ResponseEntity<>(ApiResult.fail(BAD_REQUEST.value(), "KMReS接口回调异常", e.getMessage()), BAD_REQUEST); + 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 agvTaskList = agvTaskService.findByjobCode(id); + for (AgvTask agvTask : agvTaskList) { + if (!agvTask.getStatus().equals(BizStatus.FINISH)) { + agvTask.setStatus(BizStatus.CANCEL); + agvTask.setEndTime(new Timestamp(new Date().getTime())); + agvTaskService.update(agvTask); + } + } + } + + private Task getFirstTask(Integer agvTaskId) { + List taskList = taskRepository.getAgvTaskList(agvTaskId); + return taskList.isEmpty() ? null : taskList.get(0); + } + + /** * 回传MO信息 * * @param billCode */ + @Async public void returnMo(String billCode) { OrderDto orderDto = orderService.findByBarcodeNumber(billCode); @@ -131,8 +154,7 @@ public class KMReSController { long endTime = System.currentTimeMillis(); 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 */ + @Async public void returnIssue(@RequestBody Task task) { ReturnIssueInfo returnIssueInfo = getReturnIssueInfo(task); @@ -151,12 +174,10 @@ public class KMReSController { long endTime = System.currentTimeMillis(); long time = endTime - startTime; // 保存日志 - logService.saveLogInfo(returnIssueInfo,UrlApi.publicApi, resultJson, "叫料结果回传", time); + logService.saveLogInfo(returnIssueInfo, UrlApi.publicApi, resultJson, "叫料结果回传", time); } - - public static ReturnMoInfo getReturnMoInfo(List tasks) { ReturnMoParams params = new ReturnMoParams(); params.setOrgId(808); 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 3cc3097..0efb4bf 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 @@ -1,18 +1,18 @@ /* -* Copyright 2019-2020 Zheng Jie -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ + * Copyright 2019-2020 Zheng Jie + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package com.youchain.businessdata.service; import com.youchain.annotation.Log; @@ -23,70 +23,79 @@ import com.youchain.businessdata.service.dto.AgvTaskDto; import com.youchain.businessdata.service.dto.AgvTaskQueryCriteria; import io.swagger.annotations.Api; import org.springframework.data.domain.Pageable; + import java.util.Map; import java.util.List; import java.io.IOException; import javax.servlet.http.HttpServletResponse; /** -* @website https://eladmin.vip -* @description 服务接口 -* @author baobinglin -* @date 2023-08-18 -**/ + * @author baobinglin + * @website https://eladmin.vip + * @description 服务接口 + * @date 2023-08-18 + **/ public interface AgvTaskService { /** - * 查询数据分页 - * @param criteria 条件 - * @param pageable 分页参数 - * @return Map - */ - Map queryAll(AgvTaskQueryCriteria criteria, Pageable pageable); + * 查询数据分页 + * + * @param criteria 条件 + * @param pageable 分页参数 + * @return Map + */ + Map queryAll(AgvTaskQueryCriteria criteria, Pageable pageable); /** - * 查询所有数据不分页 - * @param criteria 条件参数 - * @return List - */ + * 查询所有数据不分页 + * + * @param criteria 条件参数 + * @return List + */ List queryAll(AgvTaskQueryCriteria criteria); /** * 根据ID查询 + * * @param id ID * @return AgvTaskDto */ AgvTaskDto findById(Integer id); /** - * 创建 - * @param resources / - * @return AgvTaskDto - */ + * 创建 + * + * @param resources / + * @return AgvTaskDto + */ AgvTaskDto create(AgvTask resources); /** - * 编辑 - * @param resources / - */ + * 编辑 + * + * @param resources / + */ void update(AgvTask resources); /** - * 多选删除 - * @param ids / - */ + * 多选删除 + * + * @param ids / + */ void deleteAll(Integer[] ids); /** - * 导出数据 - * @param all 待导出的数据 - * @param response / - * @throws IOException / - */ + * 导出数据 + * + * @param all 待导出的数据 + * @param response / + * @throws IOException / + */ void download(List all, HttpServletResponse response) throws IOException; /** * 发送货架搬运接口任务 + * * @param agvTasks * @return */ @@ -94,45 +103,25 @@ public interface AgvTaskService { /** * 发送料箱搬运接口任务 + * * @param agvTasks * @return */ - public String sendAgvTaskLXImpl(List agvTasks); + String sendAgvTaskLXImpl(List agvTasks); - /** - * 发送滚筒搬运接口任务 - * @param agvTasks1-满箱任务 - * @param agvTasks1-控销任务 - * @return - */ - public String sendAgvTaskGTImpl(List agvTasks1,List agvTasks2); - - - String containerIn(String containerCode,String position); + String containerIn(String containerCode, String position); /** * 容器出场 + * * @param containerCode-容器编号 * @return */ String containerOut(String containerCode); - /** - * 查询容器状态 - * @param containerCode-容器编号 - * @return - */ - String containerQuery(String containerCode); - - /** - * 查询输送线上料箱总数 - * @param taskCode-输送线编号 - * @return - */ - int QueryCount(String taskCode); - /** * 读取输送线、流利式货架状态 + * * @param conveyorId-输送线编号 * @return */ @@ -142,32 +131,43 @@ public interface AgvTaskService { /** * 任务回报更新状态 + * * @param agvTask * @param status * @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 findById(List ids); +// List findById(List ids); double queryBillCodeSum(String billCode); /** - *根据组号+料箱号招找到对应的AGV + * 根据组号+料箱号招找到对应的AGV + * * @param jobForce-任务组号 * @param containerCode-容器号 * @return */ - AgvTask findByjobCode(String jobForce,String containerCode); + AgvTask findByjobCode(String jobForce, String containerCode); /** - *根据组号+找到对应的AGV集合 + * 根据组号+找到对应的AGV集合 + * * @param jobForce-任务组号 * @return */ List findByjobCode(String jobForce); + /** + * + * @param status + * @param type + * @return + */ + List queryByAgvTask(String status,String type); + } 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 76c22fc..c7bc0b9 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 @@ -235,7 +235,7 @@ public class AgvTaskServiceImpl implements AgvTaskService { @Override public synchronized String sendAgvTaskLXImpl(List agvTasks) { JSONObject jsonObject = new JSONObject(new LinkedHashMap<>()); - String agvCode = TimeNumberUtils.getXJTaskCode(); + String agvCode = TimeNumberUtils.getLXTaskCode(); Map objMap = new LinkedHashMap<>(); objMap.put("orgId", agvCode);//库存组织 ID(或工厂代码,供应商代码) objMap.put("requestId", agvCode);//请求 id @@ -273,10 +273,19 @@ public class AgvTaskServiceImpl implements AgvTaskService { objMap.put("missionData", missionDataArray); jsonObject.putAll(objMap); - System.out.println(jsonObject.toString()); - String resultJson = HttpPostUtil.sendPostReq(UrlApi.submitMission, jsonObject.toString()); + String resultJson="{\n" + + " \"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); String code = resulObject.getString("code") == null ? "" : resulObject.getString("code"); + if (code.equals("0")) { for (int i = 0; i < agvTasks.size(); i++) { AgvTask agvTask = agvTasks.get(i); @@ -299,92 +308,6 @@ public class AgvTaskServiceImpl implements AgvTaskService { return resultJson; } - @Override - public synchronized String sendAgvTaskGTImpl(List agvTasks1, List agvTasks2) { - JSONObject jsonObject = new JSONObject(new LinkedHashMap<>()); - String agvCode = TimeNumberUtils.getGTTaskCode(); - Map 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 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 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 public synchronized String containerIn(String containerCode, String position) { JSONObject jsonObject = new JSONObject(new LinkedHashMap<>()); @@ -406,28 +329,6 @@ public class AgvTaskServiceImpl implements AgvTaskService { 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 public void getConveyorState(String conveyorId) { /* String resultJson= HttpPostUtil.sendPostReq(UrlApi.agv_url, jsonObject.toString());//返回ResponseJson*/ @@ -463,7 +364,7 @@ public class AgvTaskServiceImpl implements AgvTaskService { @Override public void agvTaskCallback(AgvTask agvTask, Task task, String status) { - if (status.equals("COMPLETED")) { + if (status.equals("COMPLETED")) { //入库 if (agvTask.getType().equals(BizStatus.ASN)) { //增加库存 @@ -524,16 +425,6 @@ public class AgvTaskServiceImpl implements AgvTaskService { } } - @Override - public List findById(List ids) { - String agvTaskIds = StringUtils.strip(ids.toString(), "[]"); - String hql = " from AgvTask agv where agv.id in (" + agvTaskIds + ") "; - Query query = entityMapper.createQuery(hql); - List agvTaskList = query.getResultList(); - return agvTaskList; - } - - @Override public double queryBillCodeSum(String 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; } + @Override + public List 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 agvTaskList = query.getResultList(); + return agvTaskList; + } + } diff --git a/youchain-system/src/main/java/com/youchain/businessdata/service/impl/MlsServiceImpl.java b/youchain-system/src/main/java/com/youchain/businessdata/service/impl/MlsServiceImpl.java index 03d7d8c..e7afcc9 100644 --- a/youchain-system/src/main/java/com/youchain/businessdata/service/impl/MlsServiceImpl.java +++ b/youchain-system/src/main/java/com/youchain/businessdata/service/impl/MlsServiceImpl.java @@ -95,29 +95,26 @@ public class MlsServiceImpl implements MlsService { @Override public void getOrderInfo(String resultJson) { if (StringUtils.isEmpty(resultJson)) { - throw new RuntimeException("获取送货单接口失败!"); + throw new IllegalArgumentException("获取送货单接口失败!"); } JSONObject resulObject = JSON.parseObject(resultJson); - if (resulObject == null) { - throw new RuntimeException("获取送货单接口返回数据为空!"); - } String code = resulObject.getString("code") == null ? "" : resulObject.getString("code"); String msg = resulObject.getString("msg") == null ? "" : resulObject.getString("msg"); //判断接口是否成功 if (!"0".equals(code)) { - throw new RuntimeException("获取送货单接口异常信息:" + msg); + throw new IllegalArgumentException("获取送货单接口异常信息:" + msg); } String data = resulObject.getString("data") == null ? "" : resulObject.getString("data"); - JSONObject dataObject = JSON.parseObject(data); - if (dataObject == null) { - throw new RuntimeException("获取送货单接口返回数据为空!"); + if (StringUtils.isEmpty(data)) { + throw new IllegalArgumentException("获取送货单接口返回数据为空!"); } + JSONObject dataObject = JSON.parseObject(data); JSONArray details = dataObject.getJSONArray("list"); //判断是否有送货单数据 - if (details == null || details.size() == 0) { - throw new RuntimeException("没有获取到送货单数据!"); + if (details == null || details.isEmpty()) { + throw new IllegalArgumentException("没有获取到送货单数据!"); } List ordersToCreate = new ArrayList<>();//新增订单集合 @@ -233,31 +230,29 @@ public class MlsServiceImpl implements MlsService { * @return */ @Override - @Transactional(rollbackFor = Exception.class) public void getMoInfo(String resultJson) { if (StringUtils.isEmpty(resultJson)) { - throw new RuntimeException("获取MO票接口失败!"); + throw new IllegalArgumentException("MO票接口失败!"); } JSONObject resulObject = JSON.parseObject(resultJson); - if (resulObject == null) { - throw new RuntimeException("获取MO票接口返回数据为空!"); - } String code = resulObject.getString("code") == null ? "" : resulObject.getString("code"); String msg = resulObject.getString("msg") == null ? "" : resulObject.getString("msg"); + if (!"0".equals(code)) { - throw new RuntimeException("获取MO票接口异常信息:" + msg); + throw new IllegalArgumentException("MO票接口异常: " + msg); } String data = resulObject.getString("data") == null ? "" : resulObject.getString("data"); - JSONObject dataObject = JSON.parseObject(data); - if (dataObject == null) { - throw new RuntimeException("获取MO票接口返回数据为空!"); + if (StringUtils.isEmpty(data)) { + throw new IllegalArgumentException("获取MO票接口返回数据为空!"); } + + JSONObject dataObject = JSON.parseObject(data); JSONArray details = dataObject.getJSONArray("list"); //判断是否有MO票数据 - if (details == null || details.size() == 0) { - throw new RuntimeException("没有获取到MO票数据!"); + if (details == null || details.isEmpty()) { + throw new IllegalArgumentException("未获取到MO票数据!"); } List mosToCreate = new ArrayList<>();//新增Mo集合 @@ -278,21 +273,11 @@ public class MlsServiceImpl implements MlsService { Map existingMos = moService.findBylabelNos(labelNos); //获取仓库 - Dept dept = null; - 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); - } - + Dept dept = getDeptFromCache(); //循环处理每个MO票 for (int i = 0; i < details.size(); i++) { JSONObject detail = details.getJSONObject(i); - String labelState = detail.getString("labelState");//标签状态 //物料编码 String itemCode = detail.getString("itemCode").trim(); 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 - @Transactional(rollbackFor = Exception.class) - public synchronized void getIssueInfo(IssueInfo issueInfo) { + public void getIssueInfo(IssueInfo issueInfo) { String taskNumber = issueInfo.getTaskNumber();//任务号 // 指定Set的类型 Set workOrderNameSet = issueInfo.getWorkOrderName(); @@ -407,18 +407,18 @@ public class MlsServiceImpl implements MlsService { } List inventoryList = inventoryService.findInvByBillCode(workOrderNameSet);//根据工单号查询库存信息 - if (inventoryList.size() == 0) { + if (inventoryList.isEmpty()) { throw new RuntimeException("无库存信息!"); } //目标点 Point endPoint = null; - boolean flag = redisUtils.hasKey("endPoint"); + boolean flag = redisUtils.hasKey("ckjbk"); if (flag) { - endPoint = (Point) redisUtils.get("endPoint"); + endPoint = (Point) redisUtils.get("ckjbk"); } else { endPoint = pointService.findByCode(null, null, null, "出库接驳口", null); - redisUtils.set("endPoint", endPoint, 0); + redisUtils.set("ckjbk", endPoint); } List inventoryToUpdate = new ArrayList<>(); @@ -444,10 +444,11 @@ public class MlsServiceImpl implements MlsService { pd.setOrderQty(inv.getQuantity()); pd.setAllocatedQty(inv.getQuantity()); pd.setStatus(BizStatus.ALLOCATE); + pd.setDept(item.getDept()); 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); //生成Task @@ -478,14 +479,17 @@ public class MlsServiceImpl implements MlsService { batchCreateOrUpdate.batchUpdate(inventoryToUpdate); } + //批量生成出库明细 if (!pickDetailToCreate.isEmpty()) { batchCreateOrUpdate.batchCreate(pickDetailToCreate); } + //批量生成agv任务 if (!agvTaskToCreate.isEmpty()) { batchCreateOrUpdate.batchCreate(agvTaskToCreate); } + //批量生成task任务 if (!taskToCreate.isEmpty()) { batchCreateOrUpdate.batchCreate(taskToCreate); } diff --git a/youchain-system/src/main/java/com/youchain/businessdata/service/impl/MoServiceImpl.java b/youchain-system/src/main/java/com/youchain/businessdata/service/impl/MoServiceImpl.java index 6ddb96d..9d41383 100644 --- a/youchain-system/src/main/java/com/youchain/businessdata/service/impl/MoServiceImpl.java +++ b/youchain-system/src/main/java/com/youchain/businessdata/service/impl/MoServiceImpl.java @@ -35,6 +35,7 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; + import java.util.*; import java.io.IOException; import javax.persistence.EntityManager; @@ -63,6 +64,7 @@ public class MoServiceImpl implements MoService { private final TaskService taskService; private final AsnDetailService asnDetailService; private final ItemKeyService itemKeyService; + private final RedisUtils redisUtils; @Override public Map queryAll(MoQueryCriteria criteria, Pageable pageable) { @@ -153,63 +155,62 @@ public class MoServiceImpl implements MoService { public void scanMo(String mo) { //条码格式;12227000016951-qth1847-240411422924 - String[] arr = mo.split("-"); - if (arr.length != 3) { - throw new RuntimeException("条码格式错误!"); - } + // 验证条码格式 + validateBarcodeFormat(mo); + String[] arr = mo.split("-"); String itemCode = arr[0];//物料编号 String stockCode = arr[1];//容器编号 String labelNo = arr[2];//标签号 - Item item = itemService.existItem(itemCode); - if (item == null) { - throw new RuntimeException(itemCode + "系统无此物料!"); + // 验证物料是否存在 + Item item = null; + 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) { - throw new RuntimeException(stockCode + "系统无此容器!"); + // 验证容器是否存在 + Stock stock=null; + 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); - if (srcPoint == null) { - throw new RuntimeException("系统无入库接驳口!"); - } + MoDto moDto = getOrThrow(Optional.ofNullable(findByLabelNo(labelNo)), labelNo + " 系统无此标签!"); - Point endPoint = pointService.findByCode(null, BaseStatus.FREE, BaseStatus.STORAGE, "存储区", null); - if (endPoint == null) { - throw new RuntimeException("存储区没有空闲点位!"); - } + // 验证标签状态 + validateLabelState(moDto); - MoDto moDto = this.findByLabelNo(labelNo); - if (moDto == null) { - throw new RuntimeException(labelNo + "系统无此标签!"); - } + // 验证标签是否已入库 + validateTask(moDto); - 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 + "此标签已入库!"); - } - - 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() + "已取消(标签失效)!"); - } + // 验证送货单状态 + validateOrder(orderDto, moDto); // 生成AGV任务和入库任务 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 getOrThrow(Optional 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 public Map findBylabelNos(Set 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) { // 生成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); // 生成入库任务 diff --git a/youchain-system/src/main/java/com/youchain/modules/quartz/task/moTask.java b/youchain-system/src/main/java/com/youchain/modules/quartz/task/moTask.java index 4b7ae65..c8396df 100644 --- a/youchain-system/src/main/java/com/youchain/modules/quartz/task/moTask.java +++ b/youchain-system/src/main/java/com/youchain/modules/quartz/task/moTask.java @@ -2,14 +2,12 @@ package com.youchain.modules.quartz.task; import com.youchain.businessdata.inputJson.MoInfo; import com.youchain.businessdata.inputJson.MoParams; -import com.youchain.businessdata.rest.MlsController; import com.youchain.businessdata.service.MlsService; import com.youchain.service.LogService; import com.youchain.utils.UrlApi; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; - import java.util.HashSet; import java.util.Set; @@ -46,8 +44,8 @@ public class moTask { params.setInvCodes(invCodes); //DateUtil.format(DateUtil.beginOfDay(new Date()), "yyyy-MM-dd HH:mm:ss") params.setIqcResult(""); - params.setStartTime("2024-04-28 00:00:00"); - params.setEndTime("2024-04-28 23:59:59"); + params.setStartTime("2024-04-27 00:00:00"); + params.setEndTime("2024-04-27 23:59:59"); params.setPageNo(1); params.setPageSize(100); MoInfo moInfo = new MoInfo(); diff --git a/youchain-system/src/main/java/com/youchain/modules/quartz/task/pickTask.java b/youchain-system/src/main/java/com/youchain/modules/quartz/task/pickTask.java index ae6de15..a3ff796 100644 --- a/youchain-system/src/main/java/com/youchain/modules/quartz/task/pickTask.java +++ b/youchain-system/src/main/java/com/youchain/modules/quartz/task/pickTask.java @@ -26,77 +26,45 @@ import java.util.concurrent.CopyOnWriteArrayList; @Service public class pickTask { - @Autowired - public AgvTaskRepository agvTaskRepository; - @Autowired public AgvTaskService agvTaskService; - private Map> 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(); public void pickTask() { - //按线边分组 下发出库任务 - List objectList = agvTaskRepository.queryGroupAgvTask(); - for (Object obj : objectList) { - List agvTaskList = agvTaskRepository.queryLineAgvTask(obj.toString()); - for (AgvTask agvTask : agvTaskList) { - List 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(); + // 下发出库任务 + List agvTaskList = agvTaskService.queryByAgvTask(BizStatus.OPEN,BizStatus.PICK); + if (agvTaskList.size() > 0) { + if ((agvTaskList.size() == MAX_TASK_COUNT)) { + Result(agvTaskService.sendAgvTaskLXImpl(agvTaskList)); lastTaskTime = System.currentTimeMillis(); - }else{ - log.info("小件出库料箱任务未满足条件!"); + }else if((System.currentTimeMillis() - lastTaskTime >=TIMEOUT_MS) ){ + if(agvTaskList.size()>MAX_TASK_COUNT){ + List newAgvTask = agvTaskList.subList(0,MAX_TASK_COUNT); + Result(agvTaskService.sendAgvTaskLXImpl(newAgvTask)); + }else{ + Result(agvTaskService.sendAgvTaskLXImpl(agvTaskList)); + lastTaskTime = System.currentTimeMillis(); + } + } else { + throw new RuntimeException("出库料箱任务未满足条件(不满足五个料箱需等待2分钟)!"); } + } else { + throw new RuntimeException("无出库料箱任务!"); } } - private boolean isLine() { - // 判断缓存输送线上的料箱总数+AGV执行中的数量 不能超过6个 - int queryCount = agvTaskService.QueryCount("6x1"); - - //出库料箱AGV执行中的数量 - //List agvTaskList= agvTaskService.findByAgvList(BizStatus.PICK,"PICKER_MOVE"); - if(queryCount<=6){ - return true; + private void Result(String result) { + if(result==null ||result.length()==0){ + throw new RuntimeException("任务下发失败!"); } - 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 tasksInGroup : groupedTasks.values()) { - List agvTaskList= agvTaskService.findById(tasksInGroup); - String rul=agvTaskService.sendAgvTaskLXImpl(agvTaskList); - System.out.println(rul); - } - - } } diff --git a/youchain-system/src/main/java/com/youchain/modules/quartz/utils/TimeNumberUtils.java b/youchain-system/src/main/java/com/youchain/modules/quartz/utils/TimeNumberUtils.java index a1df986..c6ea230 100644 --- a/youchain-system/src/main/java/com/youchain/modules/quartz/utils/TimeNumberUtils.java +++ b/youchain-system/src/main/java/com/youchain/modules/quartz/utils/TimeNumberUtils.java @@ -31,12 +31,12 @@ public class TimeNumberUtils { return "RC"+datetime +addLeftZero(s, length); } - public static synchronized String getXJTaskCode() { + public static synchronized String getLXTaskCode() { sequence = sequence >= 999999 ? 1 : sequence + 1; String datetime = new SimpleDateFormat("yyMMddHHmmss") .format(new Date()); String s = Integer.toString(sequence); - return "XJ"+datetime +addLeftZero(s, length); + return "LX"+datetime +addLeftZero(s, length); } public static synchronized String getGTTaskCode() { diff --git a/youchain-system/src/main/java/com/youchain/modules/security/service/dto/OnlineUserDto.java b/youchain-system/src/main/java/com/youchain/modules/security/service/dto/OnlineUserDto.java index bff2d35..19ba01d 100644 --- a/youchain-system/src/main/java/com/youchain/modules/security/service/dto/OnlineUserDto.java +++ b/youchain-system/src/main/java/com/youchain/modules/security/service/dto/OnlineUserDto.java @@ -18,6 +18,8 @@ package com.youchain.modules.security.service.dto; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; + +import java.io.Serializable; import java.util.Date; /** @@ -27,7 +29,7 @@ import java.util.Date; @Data @AllArgsConstructor @NoArgsConstructor -public class OnlineUserDto { +public class OnlineUserDto implements Serializable { /** * 用户名