From b2ad4e4aa11206b53f36c5c65c9d29d756b160f6 Mon Sep 17 00:00:00 2001 From: skyouc Date: 星期六, 30 八月 2025 13:26:19 +0800 Subject: [PATCH] 站点功能优化 --- rsf-server/src/main/java/com/vincent/rsf/server/manager/schedules/TaskSchedules.java | 252 +++++++++++++++++++++++++++++++++++++++----------- 1 files changed, 197 insertions(+), 55 deletions(-) diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/schedules/TaskSchedules.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/schedules/TaskSchedules.java index d74fa92..d96d3df 100644 --- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/schedules/TaskSchedules.java +++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/schedules/TaskSchedules.java @@ -1,8 +1,20 @@ package com.vincent.rsf.server.manager.schedules; +import com.alibaba.fastjson.JSONArray; +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.R; import com.vincent.rsf.framework.exception.CoolException; -import com.vincent.rsf.server.api.service.WcsService; +import com.vincent.rsf.server.api.config.RemotesInfoProperties; +import com.vincent.rsf.server.api.entity.CommonResponse; +import com.vincent.rsf.server.api.entity.constant.RcsConstant; +import com.vincent.rsf.server.api.entity.params.TaskItemParam; +import com.vincent.rsf.server.api.entity.params.WcsTaskParams; import com.vincent.rsf.server.api.utils.LocUtils; import com.vincent.rsf.server.common.constant.Constants; import com.vincent.rsf.server.manager.controller.params.LocToTaskParams; @@ -10,21 +22,27 @@ import com.vincent.rsf.server.manager.entity.*; import com.vincent.rsf.server.manager.service.*; import com.vincent.rsf.server.manager.service.impl.LocServiceImpl; -import com.vincent.rsf.server.manager.service.impl.TransferOrderServiceImpl; -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.system.entity.Config; import com.vincent.rsf.server.system.service.ConfigService; +import com.vincent.rsf.server.system.utils.SerialRuleUtils; import com.vincent.rsf.server.system.utils.SystemAuthUtils; +import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpMethod; +import org.springframework.http.ResponseEntity; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.client.RestTemplate; import java.util.*; import java.util.stream.Collectors; @@ -33,6 +51,7 @@ * @Author Ryan * 浠诲姟宸ヤ綔妗� */ +@Slf4j @Component public class TaskSchedules { @@ -67,6 +86,12 @@ @Autowired private TransferService transferService; + @Autowired + private RestTemplate restTemplate; + + @Autowired + private RemotesInfoProperties.RcsApi rcsApi; + /** * @param * @return @@ -92,6 +117,7 @@ * @version 1.0 */ @Scheduled(cron = "0/5 * * * * ? ") + @Transactional(rollbackFor = Exception.class) public void complateOutStock() throws Exception { List<Task> tasks = taskService.list(new LambdaQueryWrapper<Task>() .eq(Task::getTaskStatus, TaskStsType.COMPLETE_OUT.id) @@ -103,12 +129,12 @@ List<Task> vaildTasks = taskService.list(new LambdaQueryWrapper<Task>().in(Task::getId, longSet)); taskService.completeTask(vaildTasks); - List<TaskItem> taskItems = taskItemService.list(new LambdaQueryWrapper<TaskItem>() - .eq(TaskItem::getWkType, OrderWorkType.ORDER_WORK_TYPE_STOCK_TERANSFER.type) - .in(TaskItem::getTaskId, longSet)); - if (!taskItems.isEmpty()) { - genInStock(taskItems); - } +// List<TaskItem> taskItems = taskItemService.list(new LambdaQueryWrapper<TaskItem>() +// .eq(TaskItem::getWkType, OrderWorkType.ORDER_WORK_TYPE_STOCK_TERANSFER.type) +// .in(TaskItem::getTaskId, longSet)); +// if (!taskItems.isEmpty()) { +// genInStock(taskItems); +// } } /** @@ -118,18 +144,30 @@ * @version 1.0 */ @Transactional(rollbackFor = Exception.class) - public void genInStock(List<TaskItem> taskItems) { + public void genInStock(List<TaskItem> taskItems) throws Exception { Set<Long> orderIds = taskItems.stream().map(TaskItem::getSourceId).collect(Collectors.toSet()); List<WkOrder> wkOrders = outStockService.list(new LambdaQueryWrapper<WkOrder>().in(WkOrder::getId, orderIds)); wkOrders.forEach(wkOrder -> { - List<WkOrderItem> orderItems = outStockItemService.list(new LambdaQueryWrapper<WkOrderItem>().eq(WkOrderItem::getOrderId, wkOrder.getId())); + List<WkOrderItem> orderItems = outStockItemService.list(new LambdaQueryWrapper<WkOrderItem>() + .eq(WkOrderItem::getOrderId, wkOrder.getId())); if (!orderItems.isEmpty()) { WkOrder order = new WkOrder(); BeanUtils.copyProperties(wkOrder, order); + String ruleCode = SerialRuleUtils.generateRuleCode(SerialRuleCode.SYS_ASN_ORDER, order); + if (StringUtils.isBlank(ruleCode)) { + throw new CoolException("鍏ュ簱鍗曞彿鐢熸垚澶辫触锛侊紒"); + } order.setWkType(OrderWorkType.ORDER_WORK_TYPE_OTHER_TERANSFER.type) .setId(null) - .setType(OrderType.ORDER_IN.type) - .setExceStatus(AsnExceStatus.ASN_EXCE_STATUS_RECEIPT_DONE.val); + .setCode(ruleCode) + .setExceStatus(AsnExceStatus.ASN_EXCE_STATUS_UN_EXCE.val) + .setType(OrderType.ORDER_IN.type); +// Config config = configService.getOne(new LambdaQueryWrapper<Config>().eq(Config::getFlag, GlobalConfigCode.DIRECT_WAIT_PAKIN)); +// if (!Boolean.parseBoolean(config.getVal())) { +// order.setExceStatus(AsnExceStatus.ASN_EXCE_STATUS_UN_EXCE.val); +// } else { +// order.setExceStatus(AsnExceStatus.ASN_EXCE_STATUS_UN_EXCE.val); +// } if (!asnOrderService.save(order)) { throw new CoolException("鍏ュ簱鍗曠敓鎴愬け璐ワ紒锛�"); } @@ -140,50 +178,60 @@ throw new CoolException("鍏ュ簱鍗曟槑缁嗕繚瀛樺け璐ワ紒锛�"); } }); + + Transfer transfer = transferService.getById(order.getPoId()); + + TransferOrder transferOrder = new TransferOrder(); + transferOrder.setOrderId(order.getId()) + .setType(OrderType.ORDER_IN.type) + .setTransferId(transfer.getId()); + if (!transferOrderService.save(transferOrder)) { + throw new CoolException("鍏宠仈鍗曚繚瀛樺け璐ワ紒锛�"); + } } }); - Set<Long> taskIds = taskItems.stream().map(TaskItem::getTaskId).collect(Collectors.toSet()); - List<Task> tasks = taskService.listByIds(taskIds); - if (!tasks.isEmpty()) { - tasks.forEach(task -> { - TaskItem one = taskItemService.getOne(new LambdaQueryWrapper<TaskItem>().eq(TaskItem::getTaskId, task.getId()), false); - if (Objects.isNull(one)) { - throw new CoolException("鏁版嵁閿欒锛氫换鍔℃槑缁嗕涪澶憋紒锛�"); - } - TransferOrder order = transferOrderService.getOne(new LambdaQueryWrapper<TransferOrder>().eq(TransferOrder::getOrderId, one.getOrderId())); - if (Objects.isNull(order)) { - throw new CoolException("鏁版嵁閿欒锛侊紒"); - } - Transfer transfer = transferService.getById(order.getTransferId()); - Task task1 = new Task(); - BeanUtils.copyProperties(task, task1); - String targetLoc = LocManageUtil.getTargetLoc(transfer.getTarAreaId()); - if (Objects.isNull(targetLoc)) { - throw new CoolException("鏈兘鎵惧埌鏈夋晥搴撲綅"); - } - task.setTaskType(TaskType.TASK_TYPE_IN.type) - .setTargLoc(targetLoc) - .setTargSite(null) - .setId(null) - .setTaskStatus(TaskStsType.GENERATE_IN.id); - if (!taskService.save(task1)) { - throw new CoolException("浠诲姟鐢熸垚澶辫触锛侊紒"); - } - List<TaskItem> items = taskItemService.list(new LambdaQueryWrapper<TaskItem>().eq(TaskItem::getTaskId, task.getId())); - if (items.isEmpty()) { - throw new CoolException("鏁版嵁閿欒锛侊紒"); - } - items.forEach(taskItem -> { - TaskItem item = new TaskItem(); - BeanUtils.copyProperties(taskItem, item); - item.setTaskId(task1.getId()).setId(null); - if (!taskItemService.save(item)) { - throw new CoolException("鍏ュ簱浠诲姟鏄庣粏淇濆瓨澶辫触锛侊紒"); - } - }); - }); - } +// Set<Long> taskIds = taskItems.stream().map(TaskItem::getTaskId).collect(Collectors.toSet()); +// List<Task> tasks = taskService.listByIds(taskIds); +// if (!tasks.isEmpty()) { +// tasks.forEach(task -> { +// TaskItem one = taskItemService.getOne(new LambdaQueryWrapper<TaskItem>().eq(TaskItem::getTaskId, task.getId()), false); +// if (Objects.isNull(one)) { +// throw new CoolException("鏁版嵁閿欒锛氫换鍔℃槑缁嗕涪澶憋紒锛�"); +// } +// TransferOrder order = transferOrderService.getOne(new LambdaQueryWrapper<TransferOrder>().eq(TransferOrder::getOrderId, one.getOrderId())); +// if (Objects.isNull(order)) { +// throw new CoolException("鏁版嵁閿欒锛侊紒"); +// } +// Transfer transfer = transferService.getById(order.getTransferId()); +// Task task1 = new Task(); +// BeanUtils.copyProperties(task, task1); +// String targetLoc = LocManageUtil.getTargetLoc(transfer.getTarAreaId()); +// if (Objects.isNull(targetLoc)) { +// throw new CoolException("鏈兘鎵惧埌鏈夋晥搴撲綅"); +// } +// task.setTaskType(TaskType.TASK_TYPE_IN.type) +// .setTargLoc(targetLoc) +// .setTargSite(null) +// .setId(null) +// .setTaskStatus(TaskStsType.GENERATE_IN.id); +// if (!taskService.save(task1)) { +// throw new CoolException("浠诲姟鐢熸垚澶辫触锛侊紒"); +// } +// List<TaskItem> items = taskItemService.list(new LambdaQueryWrapper<TaskItem>().eq(TaskItem::getTaskId, task.getId())); +// if (items.isEmpty()) { +// throw new CoolException("鏁版嵁閿欒锛侊紒"); +// } +// items.forEach(taskItem -> { +// TaskItem item = new TaskItem(); +// BeanUtils.copyProperties(taskItem, item); +// item.setTaskId(task1.getId()).setId(null); +// if (!taskItemService.save(item)) { +// throw new CoolException("鍏ュ簱浠诲姟鏄庣粏淇濆瓨澶辫触锛侊紒"); +// } +// }); +// }); +// } } /** @@ -195,7 +243,9 @@ @Transactional(rollbackFor = Exception.class) public void taskToWCS() throws Exception { Long loginUserId = SystemAuthUtils.getLoginUserId(); - List<Integer> list = Arrays.asList(TaskType.TASK_TYPE_IN.type, TaskType.TASK_TYPE_OUT.type); + List<Integer> list = Arrays.asList(TaskType.TASK_TYPE_IN.type, TaskType.TASK_TYPE_OUT.type, TaskType.TASK_TYPE_LOC_MOVE.type, TaskType.TASK_TYPE_EMPITY_IN.type + ,TaskType.TASK_TYPE_CHECK_IN.type, TaskType.TASK_TYPE_MERGE_IN.type, TaskType.TASK_TYPE_EMPITY_OUT.type, + TaskType.TASK_TYPE_PICK_AGAIN_OUT.type, TaskType.TASK_TYPE_CHECK_OUT.type, TaskType.TASK_TYPE_MERGE_OUT.type); List<Integer> integers = Arrays.asList(TaskStsType.GENERATE_IN.id, TaskStsType.GENERATE_OUT.id); List<Task> tasks = taskService.list(new LambdaQueryWrapper<Task>() .in(Task::getTaskType, list) @@ -228,6 +278,7 @@ } } //TODO 璋冪敤涓嬪彂浠诲姟鎺ュ彛 + pubTaskToWcs(task); } } @@ -255,6 +306,97 @@ /** + * 涓嬪彂浠诲姟鑷砏CS + * @param task + */ + @Transactional(rollbackFor = Exception.class) + public void pubTaskToWcs(Task task) throws Exception{ + WcsTaskParams taskParams = new WcsTaskParams(); + TaskItemParam itemParam = new TaskItemParam(); + //浠诲姟绫诲瀷锛屼换鍔$紪鐮� + itemParam.setTaskType(RcsTaskType.getTypeDesc(task.getTaskType())) + .setSeqNum(task.getTaskCode()); + + //涓诲弬鏁� + taskParams.setBatch(task.getBarcode()); + + if (task.getTaskType().equals(TaskType.TASK_TYPE_IN.type) + || task.getTaskType().equals(TaskType.TASK_TYPE_CHECK_IN.type ) + || task.getTaskType().equals(TaskType.TASK_TYPE_PICK_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_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 if (task.getTaskType().equals(TaskType.TASK_TYPE_LOC_MOVE.type)) { + itemParam.setOriLoc(task.getOrgLoc()).setDestLoc(task.getTargLoc()); + } else { + itemParam.setOriSta(task.getOrgSite()).setDestSta(task.getTargSite()); + } + + List<TaskItemParam> items = Arrays.asList(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 { + ObjectMapper objectMapper = new ObjectMapper(); + objectMapper.coercionConfigDefaults() + .setCoercion(CoercionInputShape.EmptyString, CoercionAction.AsEmpty); + try { + CommonResponse result = objectMapper.readValue(exchange.getBody(), CommonResponse.class); + if (result.getCode() == 200) { + 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)) { + if (!taskService.update(new LambdaUpdateWrapper<Task>().eq(Task::getTaskCode, task.getTaskCode()) + .set(Task::getTaskStatus, TaskStsType.WCS_EXECUTE_IN.id))) { + throw new CoolException("浠诲姟鐘舵�佷慨鏀瑰け璐ワ紒锛�"); + } + } else if (task.getTaskType().equals(TaskType.TASK_TYPE_OUT.type)) { + if (!taskService.update(new LambdaUpdateWrapper<Task>().eq(Task::getTaskCode, task.getTaskCode()) + .set(Task::getTaskStatus, TaskStsType.WCS_EXECUTE_OUT.id))) { + throw new CoolException("浠诲姟鐘舵�佷慨鏀瑰け璐ワ紒锛�"); + } + } + + } else { + throw new CoolException("浠诲姟涓嬪彂澶辫触锛侊紒"); + } + } catch (JsonProcessingException e) { + throw new CoolException(e.getMessage()); + } + } + + } + + + /** * @param * @return * @author Ryan -- Gitblit v1.9.1