rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/TaskController.java
@@ -149,6 +149,16 @@ } } @PreAuthorize("hasAuthority('manager:task:update')") @ApiOperation("手动下发执行") @PostMapping("/task/menual/exce/{ids}") public R pubExce(@PathVariable Long[] ids) { if (Objects.isNull(ids)) { return R.error("手动下发执行!"); } return taskService.menualExceTask(Arrays.asList(ids)); } /** * 盘点出库(用于测试盘点出库) * rsf-server/src/main/java/com/vincent/rsf/server/manager/schedules/TaskSchedules.java
@@ -264,15 +264,10 @@ if (tasks.isEmpty()) { return; } Config config = configService.getOne(new LambdaQueryWrapper<Config>().eq(Config::getFlag, GlobalConfigCode.ALLOW_PUB_TASK)); Config config = configService.getOne(new LambdaQueryWrapper<Config>().eq(Config::getFlag, GlobalConfigCode.AUTO_RUN_CHECK_ORDERS)); if (!Objects.isNull(config) && !Objects.isNull(config.getVal())) { Integer val = Integer.parseInt(config.getVal()); if (val > 1) { List<Task> tasks1 = tasks.stream().sorted(Comparator.comparing(Task::getCreateTime)).collect(Collectors.toList()); Task task = tasks1.stream().findFirst().get(); if (DateUtils.diffToSeconds(task.getCreateTime(), new Date()) < val) { return; } if (Boolean.parseBoolean(config.getVal())) { return; } } // for (Task task : tasks) { @@ -287,7 +282,7 @@ // } // } /**下发普通站点任务,报错回滚,不再往下执行*/ pubTaskToWcs(tasks); taskService.pubTaskToWcs(tasks); } /** @@ -353,7 +348,7 @@ } /**下发任务*/ try { pubTaskToWcs(tasks); taskService.pubTaskToWcs(tasks); } catch (Exception e) { log.error("任务下发失败!!", e); } @@ -388,165 +383,165 @@ * * @param tasks */ @Transactional(rollbackFor = Exception.class) public void pubTaskToWcs(List<Task> tasks) { WcsTaskParams taskParams = new WcsTaskParams(); List<TaskItemParam> items = new ArrayList<>(); tasks.forEach(task -> { TaskItemParam itemParam = new TaskItemParam(); //任务类型,任务编码 itemParam.setTaskType(RcsTaskType.getTypeDesc(task.getTaskType())) .setSeqNum(task.getTaskCode()); //主参数 taskParams.setBatch(task.getBarcode()); BasStation station = null; if (!task.getTaskType().equals(TaskType.TASK_TYPE_LOC_MOVE.type)) { station = basStationService.getOne(new LambdaQueryWrapper<BasStation>().eq(BasStation::getStationName, task.getTargSite())); if (Objects.isNull(station)) { throw new CoolException("站点不存在!!"); } } /**判断是否光电站点,非光店站点需管控站点状态*/ if (!Objects.isNull(station) && station.getType().equals(StationTypeEnum.STATION_TYPE_NORMAL.type)) { if (task.getTaskType() <= TaskType.TASK_TYPE_CHECK_IN.type && !task.getTaskType().equals(TaskType.TASK_TYPE_LOC_MOVE.type)) { station.setUseStatus(LocStsType.LOC_STS_TYPE_R.type); if (!basStationService.updateById(station)) { throw new CoolException("站点状态更新失败!!"); } } else if (task.getTaskType() >= TaskType.TASK_TYPE_OUT.type) { station.setUseStatus(LocStsType.LOC_STS_TYPE_S.type); if (!basStationService.updateById(station)) { throw new CoolException("站点状态更新失败!!"); } } } /**移库参数*/ if (task.getTaskType().equals(TaskType.TASK_TYPE_LOC_MOVE.type)) { itemParam.setOriLoc(task.getOrgLoc()).setDestLoc(task.getTargLoc()); } else if (task.getTaskType().equals(TaskType.TASK_TYPE_IN.type) || task.getTaskType().equals(TaskType.TASK_TYPE_MERGE_IN.type) || task.getTaskType().equals(TaskType.TASK_TYPE_EMPITY_IN.type)) { /**全板入库参数*/ itemParam.setDestLoc(task.getTargLoc()) .setOriSta(task.getOrgSite()); } else if (task.getTaskType().equals(TaskType.TASK_TYPE_CHECK_IN.type) || task.getTaskType().equals(TaskType.TASK_TYPE_PICK_IN.type)) { /**拣料/盘点入库参数*/ itemParam.setDestLoc(task.getTargLoc()) .setOriSta(task.getTargSite()); } else if (task.getTaskType().equals(TaskType.TASK_TYPE_OUT.type) || task.getTaskType().equals(TaskType.TASK_TYPE_PICK_AGAIN_OUT.type) || task.getTaskType().equals(TaskType.TASK_TYPE_EMPITY_OUT.type) || task.getTaskType().equals(TaskType.TASK_TYPE_CHECK_OUT.type) || task.getTaskType().equals(TaskType.TASK_TYPE_MERGE_OUT.type)) { /**出库参数*/ itemParam.setOriLoc(task.getOrgLoc()) .setDestSta(task.getTargSite()); } else { /**站点间移库参数*/ itemParam.setOriSta(task.getOrgSite()).setDestSta(task.getTargSite()); BasStation curSta = basStationService.getOne(new LambdaQueryWrapper<BasStation>().eq(BasStation::getStationName, task.getOrgSite())); if (Objects.isNull(curSta)) { throw new CoolException("站点不存在!!"); } if (curSta.getType().equals(StationTypeEnum.STATION_TYPE_NORMAL.type)) { if (!curSta.getUseStatus().equals(LocStsType.LOC_STS_TYPE_F.type)) { throw new CoolException("当前站点不是F.在库状态!!"); } } if (station.getType().equals(StationTypeEnum.STATION_TYPE_NORMAL.type)) { if (!station.getUseStatus().equals(LocStsType.LOC_STS_TYPE_O.type)) { throw new CoolException("目标站点不是O.空闲状态!!"); } } } items.add(itemParam); }); taskParams.setTaskList(items); /**任务下发接口*/ String pubTakUrl = rcsApi.getHost() + ":" + rcsApi.getPort() + RcsConstant.pubTask; /**RCS基础配置链接*/ log.info("任务下发,请求地址: {}, 请求参数: {}", pubTakUrl, JSONObject.toJSONString(taskParams)); HttpHeaders headers = new HttpHeaders(); headers.add("Content-Type", "application/json"); headers.add("api-version", "v2.0"); HttpEntity httpEntity = new HttpEntity(taskParams, headers); ResponseEntity<String> exchange = restTemplate.exchange(pubTakUrl, HttpMethod.POST, httpEntity, String.class); log.info("任务下发后,响应结果: {}", exchange); if (Objects.isNull(exchange.getBody())) { throw new CoolException("任务下发失败!!"); } else { try { ObjectMapper objectMapper = new ObjectMapper(); objectMapper.coercionConfigDefaults() .setCoercion(CoercionInputShape.EmptyString, CoercionAction.AsEmpty); CommonResponse result = objectMapper.readValue(exchange.getBody(), CommonResponse.class); if (result.getCode() == 200) { tasks.forEach(task -> { if (task.getTaskType().equals(TaskType.TASK_TYPE_IN.type) || task.getTaskType().equals(TaskType.TASK_TYPE_PICK_IN.type) || task.getTaskType().equals(TaskType.TASK_TYPE_CHECK_IN.type) || task.getTaskType().equals(TaskType.TASK_TYPE_EMPITY_IN.type) || task.getTaskType().equals(TaskType.TASK_TYPE_MERGE_IN.type) || task.getTaskType().equals(TaskType.TASK_TYPE_LOC_MOVE.type)) { BasStation curSta = basStationService.getOne(new LambdaQueryWrapper<BasStation>().eq(BasStation::getStationName, task.getOrgSite())); if (Objects.isNull(curSta)) { throw new CoolException("站点不存在!!"); } if (!taskService.update(new LambdaUpdateWrapper<Task>().eq(Task::getTaskCode, task.getTaskCode()) .set(Task::getTaskStatus, TaskStsType.WCS_EXECUTE_IN.id))) { throw new CoolException("任务状态修改失败!!"); } /**排除移库功能*/ if (!task.getTaskType().equals(TaskType.TASK_TYPE_LOC_MOVE.type)) { /**如果是普通站点,修改站点状态为出库预约*/ if (curSta.getType().equals(StationTypeEnum.STATION_TYPE_NORMAL.type)) { curSta.setUseStatus(LocStsType.LOC_STS_TYPE_R.type); if (!basStationService.updateById(curSta)) { throw new CoolException("站点预约失败!!"); } } } } else if (task.getTaskType().equals(TaskType.TASK_TYPE_OUT.type) || task.getTaskType().equals(TaskType.TASK_TYPE_CHECK_OUT.type) || task.getTaskType().equals(TaskType.TASK_TYPE_MERGE_OUT.type) || task.getTaskType().equals(TaskType.TASK_TYPE_EMPITY_OUT.type) || task.getTaskType().equals(TaskType.TASK_TYPE_PICK_AGAIN_OUT.type)) { BasStation curSta = basStationService.getOne(new LambdaQueryWrapper<BasStation>().eq(BasStation::getStationName, task.getTargSite())); if (Objects.isNull(curSta)) { throw new CoolException("站点不存在!!"); } if (!taskService.update(new LambdaUpdateWrapper<Task>().eq(Task::getTaskCode, task.getTaskCode()) .set(Task::getTaskStatus, TaskStsType.WCS_EXECUTE_OUT.id))) { throw new CoolException("任务状态修改失败!!"); } /**如果是普通站点,修改站点状态为入库预约*/ if (curSta.getType().equals(StationTypeEnum.STATION_TYPE_NORMAL.type)) { curSta.setUseStatus(LocStsType.LOC_STS_TYPE_S.type); if (!basStationService.updateById(curSta)) { throw new CoolException("站点预约失败!!"); } } } }); } else { log.error(JSONObject.toJSONString(result)); // throw new CoolException("任务下发失败!!"); } } catch (JsonProcessingException e) { throw new CoolException(e.getMessage()); } } } // @Transactional(rollbackFor = Exception.class) // public void pubTaskToWcs(List<Task> tasks) { // WcsTaskParams taskParams = new WcsTaskParams(); // List<TaskItemParam> items = new ArrayList<>(); // tasks.forEach(task -> { // TaskItemParam itemParam = new TaskItemParam(); // //任务类型,任务编码 // itemParam.setTaskType(RcsTaskType.getTypeDesc(task.getTaskType())) // .setSeqNum(task.getTaskCode()); // //主参数 // taskParams.setBatch(task.getBarcode()); // // BasStation station = null; // if (!task.getTaskType().equals(TaskType.TASK_TYPE_LOC_MOVE.type)) { // station = basStationService.getOne(new LambdaQueryWrapper<BasStation>().eq(BasStation::getStationName, task.getTargSite())); // if (Objects.isNull(station)) { // throw new CoolException("站点不存在!!"); // } // } // // /**判断是否光电站点,非光店站点需管控站点状态*/ // if (!Objects.isNull(station) && station.getType().equals(StationTypeEnum.STATION_TYPE_NORMAL.type)) { // if (task.getTaskType() <= TaskType.TASK_TYPE_CHECK_IN.type && !task.getTaskType().equals(TaskType.TASK_TYPE_LOC_MOVE.type)) { // station.setUseStatus(LocStsType.LOC_STS_TYPE_R.type); // if (!basStationService.updateById(station)) { // throw new CoolException("站点状态更新失败!!"); // } // } else if (task.getTaskType() >= TaskType.TASK_TYPE_OUT.type) { // station.setUseStatus(LocStsType.LOC_STS_TYPE_S.type); // if (!basStationService.updateById(station)) { // throw new CoolException("站点状态更新失败!!"); // } // } // } // // /**移库参数*/ // if (task.getTaskType().equals(TaskType.TASK_TYPE_LOC_MOVE.type)) { // itemParam.setOriLoc(task.getOrgLoc()).setDestLoc(task.getTargLoc()); // } else if (task.getTaskType().equals(TaskType.TASK_TYPE_IN.type) // || task.getTaskType().equals(TaskType.TASK_TYPE_MERGE_IN.type) // || task.getTaskType().equals(TaskType.TASK_TYPE_EMPITY_IN.type)) { // /**全板入库参数*/ // itemParam.setDestLoc(task.getTargLoc()) // .setOriSta(task.getOrgSite()); // } else if (task.getTaskType().equals(TaskType.TASK_TYPE_CHECK_IN.type) || task.getTaskType().equals(TaskType.TASK_TYPE_PICK_IN.type)) { // /**拣料/盘点入库参数*/ // itemParam.setDestLoc(task.getTargLoc()) // .setOriSta(task.getTargSite()); // } else if (task.getTaskType().equals(TaskType.TASK_TYPE_OUT.type) // || task.getTaskType().equals(TaskType.TASK_TYPE_PICK_AGAIN_OUT.type) // || task.getTaskType().equals(TaskType.TASK_TYPE_EMPITY_OUT.type) // || task.getTaskType().equals(TaskType.TASK_TYPE_CHECK_OUT.type) // || task.getTaskType().equals(TaskType.TASK_TYPE_MERGE_OUT.type)) { // /**出库参数*/ // itemParam.setOriLoc(task.getOrgLoc()) // .setDestSta(task.getTargSite()); // } else { // /**站点间移库参数*/ // itemParam.setOriSta(task.getOrgSite()).setDestSta(task.getTargSite()); // // BasStation curSta = basStationService.getOne(new LambdaQueryWrapper<BasStation>().eq(BasStation::getStationName, task.getOrgSite())); // if (Objects.isNull(curSta)) { // throw new CoolException("站点不存在!!"); // } // if (curSta.getType().equals(StationTypeEnum.STATION_TYPE_NORMAL.type)) { // if (!curSta.getUseStatus().equals(LocStsType.LOC_STS_TYPE_F.type)) { // throw new CoolException("当前站点不是F.在库状态!!"); // } // } // if (station.getType().equals(StationTypeEnum.STATION_TYPE_NORMAL.type)) { // if (!station.getUseStatus().equals(LocStsType.LOC_STS_TYPE_O.type)) { // throw new CoolException("目标站点不是O.空闲状态!!"); // } // } // } // items.add(itemParam); // }); // taskParams.setTaskList(items); // /**任务下发接口*/ // String pubTakUrl = rcsApi.getHost() + ":" + rcsApi.getPort() + RcsConstant.pubTask; // /**RCS基础配置链接*/ // log.info("任务下发,请求地址: {}, 请求参数: {}", pubTakUrl, JSONObject.toJSONString(taskParams)); // HttpHeaders headers = new HttpHeaders(); // headers.add("Content-Type", "application/json"); // headers.add("api-version", "v2.0"); // HttpEntity httpEntity = new HttpEntity(taskParams, headers); // ResponseEntity<String> exchange = restTemplate.exchange(pubTakUrl, HttpMethod.POST, httpEntity, String.class); // log.info("任务下发后,响应结果: {}", exchange); // if (Objects.isNull(exchange.getBody())) { // throw new CoolException("任务下发失败!!"); // } else { // try { // ObjectMapper objectMapper = new ObjectMapper(); // objectMapper.coercionConfigDefaults() // .setCoercion(CoercionInputShape.EmptyString, CoercionAction.AsEmpty); // CommonResponse result = objectMapper.readValue(exchange.getBody(), CommonResponse.class); // if (result.getCode() == 200) { // tasks.forEach(task -> { // // if (task.getTaskType().equals(TaskType.TASK_TYPE_IN.type) // || task.getTaskType().equals(TaskType.TASK_TYPE_PICK_IN.type) // || task.getTaskType().equals(TaskType.TASK_TYPE_CHECK_IN.type) // || task.getTaskType().equals(TaskType.TASK_TYPE_EMPITY_IN.type) // || task.getTaskType().equals(TaskType.TASK_TYPE_MERGE_IN.type) // || task.getTaskType().equals(TaskType.TASK_TYPE_LOC_MOVE.type)) { // // BasStation curSta = basStationService.getOne(new LambdaQueryWrapper<BasStation>().eq(BasStation::getStationName, task.getOrgSite())); // if (Objects.isNull(curSta)) { // throw new CoolException("站点不存在!!"); // } // // if (!taskService.update(new LambdaUpdateWrapper<Task>().eq(Task::getTaskCode, task.getTaskCode()) // .set(Task::getTaskStatus, TaskStsType.WCS_EXECUTE_IN.id))) { // throw new CoolException("任务状态修改失败!!"); // } // /**排除移库功能*/ // if (!task.getTaskType().equals(TaskType.TASK_TYPE_LOC_MOVE.type)) { // /**如果是普通站点,修改站点状态为出库预约*/ // if (curSta.getType().equals(StationTypeEnum.STATION_TYPE_NORMAL.type)) { // curSta.setUseStatus(LocStsType.LOC_STS_TYPE_R.type); // if (!basStationService.updateById(curSta)) { // throw new CoolException("站点预约失败!!"); // } // } // } // } else if (task.getTaskType().equals(TaskType.TASK_TYPE_OUT.type) // || task.getTaskType().equals(TaskType.TASK_TYPE_CHECK_OUT.type) // || task.getTaskType().equals(TaskType.TASK_TYPE_MERGE_OUT.type) // || task.getTaskType().equals(TaskType.TASK_TYPE_EMPITY_OUT.type) // || task.getTaskType().equals(TaskType.TASK_TYPE_PICK_AGAIN_OUT.type)) { // BasStation curSta = basStationService.getOne(new LambdaQueryWrapper<BasStation>().eq(BasStation::getStationName, task.getTargSite())); // if (Objects.isNull(curSta)) { // throw new CoolException("站点不存在!!"); // } // // if (!taskService.update(new LambdaUpdateWrapper<Task>().eq(Task::getTaskCode, task.getTaskCode()) // .set(Task::getTaskStatus, TaskStsType.WCS_EXECUTE_OUT.id))) { // throw new CoolException("任务状态修改失败!!"); // } // /**如果是普通站点,修改站点状态为入库预约*/ // if (curSta.getType().equals(StationTypeEnum.STATION_TYPE_NORMAL.type)) { // curSta.setUseStatus(LocStsType.LOC_STS_TYPE_S.type); // if (!basStationService.updateById(curSta)) { // throw new CoolException("站点预约失败!!"); // } // } // } // }); // } else { // log.error(JSONObject.toJSONString(result)); //// throw new CoolException("任务下发失败!!"); // } // } catch (JsonProcessingException e) { // throw new CoolException(e.getMessage()); // } // } // // } // /** * @param @@ -664,7 +659,6 @@ throw new CoolException("原始任务明细删除失败!!"); } } }); } rsf-server/src/main/java/com/vincent/rsf/server/manager/service/TaskService.java
@@ -6,6 +6,7 @@ import com.vincent.rsf.server.manager.entity.*; import java.util.List; import java.util.Map; public interface TaskService extends IService<Task> { @@ -30,4 +31,8 @@ void moveToDeep(Long loginUserId, String curLoc) throws Exception; void saveOutStockItem(List<TaskItem> taskItems, WkOrderItem orderItem, WaveItem waveItem, WkOrderItem diffItem, Long loginUserId) throws Exception; R menualExceTask(List<Long> ids); void pubTaskToWcs(List<Task> tasks); } rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/TaskServiceImpl.java
@@ -1,10 +1,21 @@ package com.vincent.rsf.server.manager.service.impl; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.cfg.CoercionAction; import com.fasterxml.jackson.databind.cfg.CoercionInputShape; import com.vincent.rsf.framework.common.Cools; import com.vincent.rsf.framework.common.DateUtils; import com.vincent.rsf.server.api.config.RemotesInfoProperties; import com.vincent.rsf.server.api.controller.erp.params.TaskInParam; import com.vincent.rsf.server.api.entity.CommonResponse; import com.vincent.rsf.server.api.entity.constant.RcsConstant; import com.vincent.rsf.server.api.entity.dto.InTaskMsgDto; import com.vincent.rsf.server.api.entity.params.TaskItemParam; import com.vincent.rsf.server.api.entity.params.WcsTaskParams; import com.vincent.rsf.server.api.service.WcsService; import com.vincent.rsf.server.common.constant.Constants; import com.vincent.rsf.server.manager.controller.params.LocToTaskParams; @@ -18,8 +29,12 @@ import com.vincent.rsf.server.manager.service.*; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.vincent.rsf.server.manager.utils.LocManageUtil; import com.vincent.rsf.server.system.constant.GlobalConfigCode; import com.vincent.rsf.server.system.constant.SerialRuleCode; import com.vincent.rsf.server.manager.enums.LocStsType; import com.vincent.rsf.server.system.entity.Config; import com.vincent.rsf.server.system.service.ConfigService; import com.vincent.rsf.server.system.service.impl.ConfigServiceImpl; import com.vincent.rsf.server.system.utils.SerialRuleUtils; import com.vincent.rsf.server.system.utils.SystemAuthUtils; import lombok.Synchronized; @@ -29,10 +44,16 @@ import org.slf4j.LoggerFactory; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpEntity; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpMethod; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.client.RestTemplate; import java.util.*; import java.util.concurrent.atomic.AtomicBoolean; import java.util.stream.Collectors; @Slf4j @@ -95,6 +116,12 @@ private CheckDiffItemService checkDiffItemService; @Autowired private BasContainerService basContainerService; @Autowired private ConfigService configService; @Autowired private RestTemplate restTemplate; @Autowired private RemotesInfoProperties.RcsApi rcsApi; @Override @Transactional(rollbackFor = Exception.class) @@ -425,25 +452,27 @@ * @param tasks * @throws Exception */ @Synchronized @Override public void complateInTask(List<Task> tasks) throws Exception { Long loginUserId = SystemAuthUtils.getLoginUserId(); for (Task task : tasks) { try { if (task.getTaskType().equals(TaskType.TASK_TYPE_IN.type)) { //1.入库 complateInstock(task, loginUserId); } else if (task.getTaskType().equals(TaskType.TASK_TYPE_PICK_IN.type) || task.getTaskType().equals(TaskType.TASK_TYPE_CHECK_IN.type)) { //53.拣料再入库 //57.盘点再入库 pickComplateInStock(task, loginUserId); } else if (task.getTaskType().equals(TaskType.TASK_TYPE_LOC_MOVE.type)) { //移库 moveInStock(task, loginUserId); AtomicBoolean success = new AtomicBoolean(false); if (success.compareAndSet(false, true)) { Long loginUserId = SystemAuthUtils.getLoginUserId(); for (Task task : tasks) { try { if (task.getTaskType().equals(TaskType.TASK_TYPE_IN.type)) { //1.入库 complateInstock(task, loginUserId); } else if (task.getTaskType().equals(TaskType.TASK_TYPE_PICK_IN.type) || task.getTaskType().equals(TaskType.TASK_TYPE_CHECK_IN.type)) { //53.拣料再入库 //57.盘点再入库 pickComplateInStock(task, loginUserId); } else if (task.getTaskType().equals(TaskType.TASK_TYPE_LOC_MOVE.type)) { //移库 moveInStock(task, loginUserId); } } catch (Exception ex) { log.error(ex.getMessage(), ex); } } catch (Exception ex) { log.error(ex.getMessage(), ex); } } } @@ -1019,7 +1048,7 @@ tempLocs.forEach(working -> { taskItems.forEach(taskItem -> { if (taskItem.getMatnrId().equals(working.getMatnrId())) { if (taskItem.getId().equals(working.getMatnrId()) && taskItem.getFieldsIndex().equals(working.getFieldsIndex())) { Double minQty = taskItem.getAnfme(); if (!task.getTaskType().equals(TaskType.TASK_TYPE_CHECK_IN.type)) { minQty = Math.round((working.getAnfme() - taskItem.getAnfme()) * 100) / 100.0; @@ -1050,6 +1079,7 @@ .setMatnrCode(working.getMatnrCode()) .setSpec(working.getSpec()) .setAnfme(working.getAnfme()) .setQty(0.0) .setBatch(working.getBatch()) .setFieldsIndex(working.getFieldsIndex()) .setUnit(working.getUnit()) @@ -1316,6 +1346,206 @@ } } /** * 手动下发执行任务 * @author Ryan * @date 2025/11/22 13:45 * @param ids * @return com.vincent.rsf.framework.common.R */ @Override @Transactional(rollbackFor = Exception.class) public R menualExceTask(List<Long> ids) { if (Objects.isNull(ids) || ids.isEmpty()) { return R.error("任务编码不能为空!!"); } List<Integer> integers = Arrays.asList(TaskStsType.GENERATE_IN.id, TaskStsType.GENERATE_OUT.id); List<Task> tasks = taskService.list(new LambdaQueryWrapper<Task>() .in(Task::getId, ids) .in(Task::getTaskStatus, integers) .orderByDesc(Task::getSort)); if (tasks.isEmpty()) { return R.error("任务已在执行中!!"); } Config config = configService.getOne(new LambdaQueryWrapper<Config>().eq(Config::getFlag, GlobalConfigCode.AUTO_RUN_CHECK_ORDERS)); if (!Objects.isNull(config) && !Objects.isNull(config.getVal())) { if (Boolean.parseBoolean(config.getVal())) { return R.error("自动生成任务已开启,无需手动下发!!"); } } taskService.pubTaskToWcs(tasks); return R.ok(); } /** * 下发任务至WCS * * @param tasks */ @Override @Transactional(rollbackFor = Exception.class) public void pubTaskToWcs(List<Task> tasks) { WcsTaskParams taskParams = new WcsTaskParams(); List<TaskItemParam> items = new ArrayList<>(); tasks.forEach(task -> { TaskItemParam itemParam = new TaskItemParam(); //任务类型,任务编码 itemParam.setTaskType(RcsTaskType.getTypeDesc(task.getTaskType())) .setSeqNum(task.getTaskCode()); //主参数 taskParams.setBatch(task.getBarcode()); BasStation station = null; if (!task.getTaskType().equals(TaskType.TASK_TYPE_LOC_MOVE.type)) { station = basStationService.getOne(new LambdaQueryWrapper<BasStation>().eq(BasStation::getStationName, task.getTargSite())); if (Objects.isNull(station)) { throw new CoolException("站点不存在!!"); } } /**判断是否光电站点,非光店站点需管控站点状态*/ if (!Objects.isNull(station) && station.getType().equals(StationTypeEnum.STATION_TYPE_NORMAL.type)) { if (task.getTaskType() <= TaskType.TASK_TYPE_CHECK_IN.type && !task.getTaskType().equals(TaskType.TASK_TYPE_LOC_MOVE.type)) { station.setUseStatus(LocStsType.LOC_STS_TYPE_R.type); if (!basStationService.updateById(station)) { throw new CoolException("站点状态更新失败!!"); } } else if (task.getTaskType() >= TaskType.TASK_TYPE_OUT.type) { station.setUseStatus(LocStsType.LOC_STS_TYPE_S.type); if (!basStationService.updateById(station)) { throw new CoolException("站点状态更新失败!!"); } } } /**移库参数*/ if (task.getTaskType().equals(TaskType.TASK_TYPE_LOC_MOVE.type)) { itemParam.setOriLoc(task.getOrgLoc()).setDestLoc(task.getTargLoc()); } else if (task.getTaskType().equals(TaskType.TASK_TYPE_IN.type) || task.getTaskType().equals(TaskType.TASK_TYPE_MERGE_IN.type) || task.getTaskType().equals(TaskType.TASK_TYPE_EMPITY_IN.type)) { /**全板入库参数*/ itemParam.setDestLoc(task.getTargLoc()) .setOriSta(task.getOrgSite()); } else if (task.getTaskType().equals(TaskType.TASK_TYPE_CHECK_IN.type) || task.getTaskType().equals(TaskType.TASK_TYPE_PICK_IN.type)) { /**拣料/盘点入库参数*/ itemParam.setDestLoc(task.getTargLoc()) .setOriSta(task.getTargSite()); } else if (task.getTaskType().equals(TaskType.TASK_TYPE_OUT.type) || task.getTaskType().equals(TaskType.TASK_TYPE_PICK_AGAIN_OUT.type) || task.getTaskType().equals(TaskType.TASK_TYPE_EMPITY_OUT.type) || task.getTaskType().equals(TaskType.TASK_TYPE_CHECK_OUT.type) || task.getTaskType().equals(TaskType.TASK_TYPE_MERGE_OUT.type)) { /**出库参数*/ itemParam.setOriLoc(task.getOrgLoc()) .setDestSta(task.getTargSite()); } else { /**站点间移库参数*/ itemParam.setOriSta(task.getOrgSite()).setDestSta(task.getTargSite()); BasStation curSta = basStationService.getOne(new LambdaQueryWrapper<BasStation>().eq(BasStation::getStationName, task.getOrgSite())); if (Objects.isNull(curSta)) { throw new CoolException("站点不存在!!"); } if (curSta.getType().equals(StationTypeEnum.STATION_TYPE_NORMAL.type)) { if (!curSta.getUseStatus().equals(LocStsType.LOC_STS_TYPE_F.type)) { throw new CoolException("当前站点不是F.在库状态!!"); } } if (station.getType().equals(StationTypeEnum.STATION_TYPE_NORMAL.type)) { if (!station.getUseStatus().equals(LocStsType.LOC_STS_TYPE_O.type)) { throw new CoolException("目标站点不是O.空闲状态!!"); } } } items.add(itemParam); }); taskParams.setTaskList(items); /**任务下发接口*/ String pubTakUrl = rcsApi.getHost() + ":" + rcsApi.getPort() + RcsConstant.pubTask; /**RCS基础配置链接*/ log.info("任务下发,请求地址: {}, 请求参数: {}", pubTakUrl, JSONObject.toJSONString(taskParams)); HttpHeaders headers = new HttpHeaders(); headers.add("Content-Type", "application/json"); headers.add("api-version", "v2.0"); HttpEntity httpEntity = new HttpEntity(taskParams, headers); ResponseEntity<String> exchange = restTemplate.exchange(pubTakUrl, HttpMethod.POST, httpEntity, String.class); log.info("任务下发后,响应结果: {}", exchange); if (Objects.isNull(exchange.getBody())) { throw new CoolException("任务下发失败!!"); } else { try { ObjectMapper objectMapper = new ObjectMapper(); objectMapper.coercionConfigDefaults() .setCoercion(CoercionInputShape.EmptyString, CoercionAction.AsEmpty); CommonResponse result = objectMapper.readValue(exchange.getBody(), CommonResponse.class); if (result.getCode() == 200) { tasks.forEach(task -> { if (task.getTaskType().equals(TaskType.TASK_TYPE_IN.type) || task.getTaskType().equals(TaskType.TASK_TYPE_PICK_IN.type) || task.getTaskType().equals(TaskType.TASK_TYPE_CHECK_IN.type) || task.getTaskType().equals(TaskType.TASK_TYPE_EMPITY_IN.type) || task.getTaskType().equals(TaskType.TASK_TYPE_MERGE_IN.type) || task.getTaskType().equals(TaskType.TASK_TYPE_LOC_MOVE.type)) { BasStation curSta = basStationService.getOne(new LambdaQueryWrapper<BasStation>().eq(BasStation::getStationName, task.getOrgSite())); if (Objects.isNull(curSta)) { throw new CoolException("站点不存在!!"); } if (!taskService.update(new LambdaUpdateWrapper<Task>().eq(Task::getTaskCode, task.getTaskCode()) .set(Task::getTaskStatus, TaskStsType.WCS_EXECUTE_IN.id))) { throw new CoolException("任务状态修改失败!!"); } /**排除移库功能*/ if (!task.getTaskType().equals(TaskType.TASK_TYPE_LOC_MOVE.type)) { /**如果是普通站点,修改站点状态为出库预约*/ if (curSta.getType().equals(StationTypeEnum.STATION_TYPE_NORMAL.type)) { curSta.setUseStatus(LocStsType.LOC_STS_TYPE_R.type); if (!basStationService.updateById(curSta)) { throw new CoolException("站点预约失败!!"); } } } } else if (task.getTaskType().equals(TaskType.TASK_TYPE_OUT.type) || task.getTaskType().equals(TaskType.TASK_TYPE_CHECK_OUT.type) || task.getTaskType().equals(TaskType.TASK_TYPE_MERGE_OUT.type) || task.getTaskType().equals(TaskType.TASK_TYPE_EMPITY_OUT.type) || task.getTaskType().equals(TaskType.TASK_TYPE_PICK_AGAIN_OUT.type)) { BasStation curSta = basStationService.getOne(new LambdaQueryWrapper<BasStation>().eq(BasStation::getStationName, task.getTargSite())); if (Objects.isNull(curSta)) { throw new CoolException("站点不存在!!"); } if (!taskService.update(new LambdaUpdateWrapper<Task>().eq(Task::getTaskCode, task.getTaskCode()) .set(Task::getTaskStatus, TaskStsType.WCS_EXECUTE_OUT.id))) { throw new CoolException("任务状态修改失败!!"); } /**如果是普通站点,修改站点状态为入库预约*/ if (curSta.getType().equals(StationTypeEnum.STATION_TYPE_NORMAL.type)) { curSta.setUseStatus(LocStsType.LOC_STS_TYPE_S.type); if (!basStationService.updateById(curSta)) { throw new CoolException("站点预约失败!!"); } } } }); } else { log.error(JSONObject.toJSONString(result)); // throw new CoolException("任务下发失败!!"); } } catch (JsonProcessingException e) { throw new CoolException(e.getMessage()); } } }/** /** * @author Ryan * @date 2025/5/20 @@ -1336,7 +1566,7 @@ * @version 1.0 */ @Transactional(rollbackFor = Exception.class) public void complateInstock(Task task, Long loginUserId) { public synchronized void complateInstock(Task task, Long loginUserId) { if (Objects.isNull(task)) { return; } @@ -1397,7 +1627,7 @@ * @time 2025/4/30 16:32 */ @Transactional(rollbackFor = Exception.class) public void removeReceiptStock(WaitPakinItem pakinItem, Long loginUserId) { public synchronized void removeReceiptStock(WaitPakinItem pakinItem, Long loginUserId) { WarehouseAreasItem itemServiceOne = warehouseAreasItemService.getOne(new LambdaQueryWrapper<WarehouseAreasItem>() .eq(WarehouseAreasItem::getId, pakinItem.getSource())); if (Objects.isNull(itemServiceOne)) { @@ -1435,7 +1665,7 @@ * @time 2025/4/15 15:28 */ @Transactional(rollbackFor = Exception.class) public void saveLocItem(List<TaskItem> items, Long taskId, Long loginUserId) throws Exception { public synchronized void saveLocItem(List<TaskItem> items, Long taskId, Long loginUserId) throws Exception { Task task = this.getById(taskId); if (Objects.isNull(task)) { throw new CoolException("任务不存在!!"); @@ -1481,7 +1711,7 @@ * @return */ @Transactional(rollbackFor = Exception.class) public void saveStockItems(List<TaskItem> items, Task task, Long id, String code, Short wkType, String type, Long loginUserId) { public synchronized void saveStockItems(List<TaskItem> items, Task task, Long id, String code, Short wkType, String type, Long loginUserId) { Stock stock = new Stock(); String ruleCode = SerialRuleUtils.generateRuleCode(SerialRuleCode.SYS_STOCK_CODE, null); if (StringUtils.isBlank(ruleCode)) { rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/WaitPakinServiceImpl.java
@@ -231,7 +231,7 @@ if (item.getReceiptQty().compareTo(0.00) == 0) { throw new CoolException("解绑数量不能为零!!"); } Double reslt = Math.round((pakinItems.get(i1).getAnfme() - pakinItems.get(i1).getWorkQty() - pakinItems.get(i1).getQty()) * 10000) / 10000.0; Double reslt = Math.round((pakinItems.get(i1).getAnfme() - pakinItems.get(i1).getWorkQty() - pakinItems.get(i1).getQty()) * 100) / 100.0; if (item.getReceiptQty().compareTo(reslt) > 0) { throw new CoolException("解绑数量不能大于剩余可执行数!!"); }