|  |  |  | 
|---|
|  |  |  | 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.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; | 
|---|
|  |  |  | import com.vincent.rsf.server.manager.enums.LocStsType; | 
|---|
|  |  |  | import com.vincent.rsf.server.manager.enums.TaskStsType; | 
|---|
|  |  |  | import com.vincent.rsf.server.manager.enums.*; | 
|---|
|  |  |  | import com.vincent.rsf.server.manager.entity.*; | 
|---|
|  |  |  | import com.vincent.rsf.server.manager.enums.TaskType; | 
|---|
|  |  |  | import com.vincent.rsf.server.manager.service.*; | 
|---|
|  |  |  | import com.vincent.rsf.server.manager.service.impl.LocServiceImpl; | 
|---|
|  |  |  | 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; | 
|---|
|  |  |  | 
|---|
|  |  |  | * @Author Ryan | 
|---|
|  |  |  | * 任务工作档 | 
|---|
|  |  |  | */ | 
|---|
|  |  |  | @Slf4j | 
|---|
|  |  |  | @Component | 
|---|
|  |  |  | public class TaskSchedules { | 
|---|
|  |  |  |  | 
|---|
|  |  |  | 
|---|
|  |  |  | private List<Integer> rows; | 
|---|
|  |  |  | @Autowired | 
|---|
|  |  |  | private LocItemService locItemService; | 
|---|
|  |  |  | @Autowired | 
|---|
|  |  |  | private OutStockService outStockService; | 
|---|
|  |  |  | @Autowired | 
|---|
|  |  |  | private OutStockItemService outStockItemService; | 
|---|
|  |  |  | @Autowired | 
|---|
|  |  |  | private AsnOrderItemService asnOrderItemService; | 
|---|
|  |  |  | @Autowired | 
|---|
|  |  |  | private AsnOrderService asnOrderService; | 
|---|
|  |  |  | @Autowired | 
|---|
|  |  |  | private TransferOrderService transferOrderService; | 
|---|
|  |  |  | @Autowired | 
|---|
|  |  |  | private TransferService transferService; | 
|---|
|  |  |  | @Autowired | 
|---|
|  |  |  | private RestTemplate restTemplate; | 
|---|
|  |  |  | @Autowired | 
|---|
|  |  |  | private RemotesInfoProperties.RcsApi rcsApi; | 
|---|
|  |  |  | @Autowired | 
|---|
|  |  |  | private BasStationService basStationService; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | * @param | 
|---|
|  |  |  | 
|---|
|  |  |  | * @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) | 
|---|
|  |  |  | 
|---|
|  |  |  | List<Long> longSet = tasks.stream().map(Task::getId).collect(Collectors.toList()); | 
|---|
|  |  |  | 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); | 
|---|
|  |  |  | //        } | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | * 任务自动下发 | 
|---|
|  |  |  | * @throws Exception | 
|---|
|  |  |  | * @author Ryan | 
|---|
|  |  |  | * @date 2025/7/29 | 
|---|
|  |  |  | * @description: 生成入库单 | 
|---|
|  |  |  | * @version 1.0 | 
|---|
|  |  |  | */ | 
|---|
|  |  |  | @Transactional(rollbackFor = Exception.class) | 
|---|
|  |  |  | 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())); | 
|---|
|  |  |  | 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) | 
|---|
|  |  |  | .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("入库单生成失败!!"); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | orderItems.forEach(orderItem -> { | 
|---|
|  |  |  | orderItem.setOrderId(order.getId()).setOrderCode(order.getCode()).setId(null); | 
|---|
|  |  |  | if (!asnOrderItemService.save(orderItem)) { | 
|---|
|  |  |  | 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("入库任务明细保存失败!!"); | 
|---|
|  |  |  | //                    } | 
|---|
|  |  |  | //                }); | 
|---|
|  |  |  | //            }); | 
|---|
|  |  |  | //        } | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | * 非光电站点任务下发 | 
|---|
|  |  |  | */ | 
|---|
|  |  |  | @Scheduled(cron = "0/5 * * * * ?  ") | 
|---|
|  |  |  | @Transactional(rollbackFor = Exception.class) | 
|---|
|  |  |  | public void taskToWCS() throws Exception { | 
|---|
|  |  |  | public void pubTaskToWcs() { | 
|---|
|  |  |  | 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_IN.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) | 
|---|
|  |  |  | .in(Task::getTaskStatus, integers) | 
|---|
|  |  |  | List<Task> tasks = taskService.list(new LambdaQueryWrapper<Task>() | 
|---|
|  |  |  | .in(Task::getTaskType, list) | 
|---|
|  |  |  | .in(Task::getTaskStatus, integers).last("limit 1") | 
|---|
|  |  |  | .orderByDesc(Task::getSort)); | 
|---|
|  |  |  | for (Task task : tasks) { | 
|---|
|  |  |  | Loc loc = locService.getOne(new LambdaQueryWrapper<Loc>().eq(Loc::getBarcode, task.getBarcode())); | 
|---|
|  |  |  | if (Objects.isNull(loc)) { | 
|---|
|  |  |  | continue; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | //判断是否深库位 | 
|---|
|  |  |  | if (!LocUtils.isShallowLoc(loc.getCode())) { | 
|---|
|  |  |  | //获取深库位对应的浅库位 | 
|---|
|  |  |  | String shallowLoc = LocUtils.getShallowLoc(loc.getCode()); | 
|---|
|  |  |  | if (StringUtils.isBlank(shallowLoc)) { | 
|---|
|  |  |  | /**移库不做站点操作*/ | 
|---|
|  |  |  | if (!task.getTaskType().equals(TaskType.TASK_TYPE_LOC_MOVE.type)) { | 
|---|
|  |  |  | BasStation station = basStationService.getOne(new LambdaQueryWrapper<BasStation>() | 
|---|
|  |  |  | .eq(BasStation::getStationName, | 
|---|
|  |  |  | task.getTaskStatus().equals(TaskStsType.GENERATE_IN.id) ? task.getOrgSite() : task.getTargSite())); | 
|---|
|  |  |  | if (station.getType().equals(StationTypeEnum.STATION_TYPE_MUTI.type)) { | 
|---|
|  |  |  | continue; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | Loc shalloc = locService.getOne(new LambdaQueryWrapper<Loc>().eq(Loc::getCode, shallowLoc)); | 
|---|
|  |  |  | if (Objects.isNull(shalloc) || !shalloc.getUseStatus().equals(LocStsType.LOC_STS_TYPE_F.type)) { | 
|---|
|  |  |  | //如果浅库位不在库跳出循环 | 
|---|
|  |  |  | } | 
|---|
|  |  |  | /**下发普通站点任务,报错回滚,不再往下执行*/ | 
|---|
|  |  |  | pubTaskToWcs(task); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | * @author Ryan | 
|---|
|  |  |  | * @date 2025/9/4 | 
|---|
|  |  |  | * @description: 光电站点任务下发 | 
|---|
|  |  |  | * @version 1.0 | 
|---|
|  |  |  | */ | 
|---|
|  |  |  | //    @Scheduled(cron = "0/5 * * * * ?  ") | 
|---|
|  |  |  | @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, 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) | 
|---|
|  |  |  | .in(Task::getTaskStatus, integers) | 
|---|
|  |  |  | .orderByDesc(Task::getSort)); | 
|---|
|  |  |  | for (Task task : tasks) { | 
|---|
|  |  |  | /**移库不做站点操作*/ | 
|---|
|  |  |  | if (!task.getTaskType().equals(TaskType.TASK_TYPE_LOC_MOVE.type)) { | 
|---|
|  |  |  | BasStation station = basStationService.getOne(new LambdaQueryWrapper<BasStation>().eq(BasStation::getStationName, | 
|---|
|  |  |  | task.getTaskStatus().equals(TaskStsType.GENERATE_IN.id) ? task.getOrgSite() : task.getTargSite())); | 
|---|
|  |  |  | /**过滤掉普通站点任务*/ | 
|---|
|  |  |  | if (station.getType().equals(StationTypeEnum.STATION_TYPE_NORMAL.type)) { | 
|---|
|  |  |  | continue; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | LocToTaskParams params = new LocToTaskParams(); | 
|---|
|  |  |  | params.setOrgLoc(shallowLoc).setType(TaskType.TASK_TYPE_LOC_MOVE.type + ""); | 
|---|
|  |  |  | //生成移库任务 | 
|---|
|  |  |  | Task moveTask = locItemService.genMoveTask(params, loginUserId); | 
|---|
|  |  |  | moveTask.setSort(!Objects.isNull(task.getSort()) ? task.getSort() + 1 : Constants.TASK_SORT_DEFAULT_VALUE + 1); | 
|---|
|  |  |  | if (!taskService.updateById(moveTask)) { | 
|---|
|  |  |  | throw new Exception("任务优先级更新失败!!"); | 
|---|
|  |  |  | Loc loc = locService.getOne(new LambdaQueryWrapper<Loc>().eq(Loc::getBarcode, task.getBarcode())); | 
|---|
|  |  |  | if (Objects.isNull(loc)) { | 
|---|
|  |  |  | continue; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | //判断是否深库位 | 
|---|
|  |  |  | if (!LocUtils.isShallowLoc(loc.getCode())) { | 
|---|
|  |  |  | //获取深库位对应的浅库位 | 
|---|
|  |  |  | String shallowLoc = LocUtils.getShallowLoc(loc.getCode()); | 
|---|
|  |  |  | if (StringUtils.isBlank(shallowLoc)) { | 
|---|
|  |  |  | continue; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | Loc shalloc = locService.getOne(new LambdaQueryWrapper<Loc>().eq(Loc::getCode, shallowLoc)); | 
|---|
|  |  |  | if (Objects.isNull(shalloc) || !shalloc.getUseStatus().equals(LocStsType.LOC_STS_TYPE_F.type)) { | 
|---|
|  |  |  | //如果浅库位不在库跳出循环 | 
|---|
|  |  |  | continue; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | LocToTaskParams params = new LocToTaskParams(); | 
|---|
|  |  |  | params.setOrgLoc(shallowLoc).setType(TaskType.TASK_TYPE_LOC_MOVE.type + ""); | 
|---|
|  |  |  | //生成移库任务 | 
|---|
|  |  |  | Task moveTask = locItemService.genMoveTask(params, loginUserId); | 
|---|
|  |  |  | moveTask.setSort(!Objects.isNull(task.getSort()) ? task.getSort() + 1 : Constants.TASK_SORT_DEFAULT_VALUE + 1); | 
|---|
|  |  |  | if (!taskService.updateById(moveTask)) { | 
|---|
|  |  |  | throw new Exception("任务优先级更新失败!!"); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | //TODO 调用下发任务接口 | 
|---|
|  |  |  | /**下发任务*/ | 
|---|
|  |  |  | try { | 
|---|
|  |  |  | pubTaskToWcs(task); | 
|---|
|  |  |  | } catch (Exception e) { | 
|---|
|  |  |  | log.error("任务下发失败!!", e); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | * 每五秒校验深库位是否为空,如果浅库位有货,将浅库位移至深库位 | 
|---|
|  |  |  | *///TODO 生成移库任务前,需要检查是否有任务前往当前托盘 | 
|---|
|  |  |  | //    @Scheduled(cron = "0/35 * * * * ?  ") | 
|---|
|  |  |  | //    @Transactional(rollbackFor = Exception.class) | 
|---|
|  |  |  | //    public void shallocToDeep() throws Exception { | 
|---|
|  |  |  | //        List<Loc> locs = locService.list(new LambdaQueryWrapper<Loc>() | 
|---|
|  |  |  | //                .eq(Loc::getUseStatus, LocStsType.LOC_STS_TYPE_O.type) | 
|---|
|  |  |  | //                .in(Loc::getRow, rows)); | 
|---|
|  |  |  | //        if (locs.isEmpty()) { | 
|---|
|  |  |  | //            return; | 
|---|
|  |  |  | //        } | 
|---|
|  |  |  | //        for (Loc loc : locs) { | 
|---|
|  |  |  | //            String shallowLoc = LocUtils.getShallowLoc(loc.getCode()); | 
|---|
|  |  |  | //            Loc one = locService.getOne(new LambdaQueryWrapper<Loc>().eq(Loc::getCode, shallowLoc)); | 
|---|
|  |  |  | //            if (Objects.isNull(one) || !one.getUseStatus().equals(LocStsType.LOC_STS_TYPE_F.type)) { | 
|---|
|  |  |  | //                continue; | 
|---|
|  |  |  | //            } | 
|---|
|  |  |  | //            taskService.moveToDeep(SystemAuthUtils.getLoginUserId(), shallowLoc); | 
|---|
|  |  |  | //        } | 
|---|
|  |  |  | //    } | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | * 下发任务至WCS | 
|---|
|  |  |  | * | 
|---|
|  |  |  | * @param task | 
|---|
|  |  |  | */ | 
|---|
|  |  |  | @Scheduled(cron = "0/35 * * * * ?  ") | 
|---|
|  |  |  | @Transactional(rollbackFor = Exception.class) | 
|---|
|  |  |  | public void shallocToDeep() throws Exception { | 
|---|
|  |  |  | List<Loc> locs = locService.list(new LambdaQueryWrapper<Loc>() | 
|---|
|  |  |  | .eq(Loc::getUseStatus, LocStsType.LOC_STS_TYPE_O.type) | 
|---|
|  |  |  | .in(Loc::getRow, rows)); | 
|---|
|  |  |  | if (locs.isEmpty()) { | 
|---|
|  |  |  | return; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | for (Loc loc : locs) { | 
|---|
|  |  |  | String shallowLoc = LocUtils.getShallowLoc(loc.getCode()); | 
|---|
|  |  |  | Loc one = locService.getOne(new LambdaQueryWrapper<Loc>().eq(Loc::getCode, shallowLoc)); | 
|---|
|  |  |  | if (Objects.isNull(one) || !one.getUseStatus().equals(LocStsType.LOC_STS_TYPE_F.type)) { | 
|---|
|  |  |  | continue; | 
|---|
|  |  |  | public void pubTaskToWcs(Task task) { | 
|---|
|  |  |  | WcsTaskParams taskParams = new WcsTaskParams(); | 
|---|
|  |  |  | 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("站点不存在!!"); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | taskService.moveToDeep(SystemAuthUtils.getLoginUserId(), shallowLoc); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | /**判断是否光电站点,非光店站点需管控站点状态*/ | 
|---|
|  |  |  | 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)) { | 
|---|
|  |  |  | //                if (!station.getUseStatus().equals(LocStsType.LOC_STS_TYPE_F.type)) { | 
|---|
|  |  |  | //                    throw new CoolException( "当前站点不是F.在库状态状态!!"); | 
|---|
|  |  |  | //                } | 
|---|
|  |  |  | station.setUseStatus(LocStsType.LOC_STS_TYPE_R.type); | 
|---|
|  |  |  | if (!basStationService.updateById(station)) { | 
|---|
|  |  |  | throw new CoolException("站点状态更新失败!!"); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } else if (task.getTaskType() >= TaskType.TASK_TYPE_OUT.type) { | 
|---|
|  |  |  | if (!station.getUseStatus().equals(LocStsType.LOC_STS_TYPE_O.type)) { | 
|---|
|  |  |  | throw new CoolException("目标站点不处O.空闲状态,无法预约出库。"); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | 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.空闲状态!!"); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | 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 { | 
|---|
|  |  |  | try { | 
|---|
|  |  |  | ObjectMapper objectMapper = new ObjectMapper(); | 
|---|
|  |  |  | objectMapper.coercionConfigDefaults() | 
|---|
|  |  |  | .setCoercion(CoercionInputShape.EmptyString, CoercionAction.AsEmpty); | 
|---|
|  |  |  | 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("任务状态修改失败!!"); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | /**排除移库功能*/ | 
|---|
|  |  |  | if (!task.getTaskType().equals(TaskType.TASK_TYPE_LOC_MOVE.type)) { | 
|---|
|  |  |  | /**如果是普通站点,修改站点状态为出库预约*/ | 
|---|
|  |  |  | if (station.getType().equals(StationTypeEnum.STATION_TYPE_NORMAL.type)) { | 
|---|
|  |  |  | station.setUseStatus(LocStsType.LOC_STS_TYPE_R.type); | 
|---|
|  |  |  | if (!basStationService.updateById(station)) { | 
|---|
|  |  |  | 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)) { | 
|---|
|  |  |  | if (!taskService.update(new LambdaUpdateWrapper<Task>().eq(Task::getTaskCode, task.getTaskCode()) | 
|---|
|  |  |  | .set(Task::getTaskStatus, TaskStsType.WCS_EXECUTE_OUT.id))) { | 
|---|
|  |  |  | throw new CoolException("任务状态修改失败!!"); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | /**如果是普通站点,修改站点状态为入库预约*/ | 
|---|
|  |  |  | if (station.getType().equals(StationTypeEnum.STATION_TYPE_NORMAL.type)) { | 
|---|
|  |  |  | station.setUseStatus(LocStsType.LOC_STS_TYPE_S.type); | 
|---|
|  |  |  | if (!basStationService.updateById(station)) { | 
|---|
|  |  |  | throw new CoolException("站点预约失败!!"); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | throw new CoolException("任务下发失败!!"); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } catch (JsonProcessingException e) { | 
|---|
|  |  |  | throw new CoolException(e.getMessage()); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|