skyouc
3 天以前 b2ad4e4aa11206b53f36c5c65c9d29d756b160f6
rsf-server/src/main/java/com/vincent/rsf/server/manager/schedules/TaskSchedules.java
@@ -1,29 +1,48 @@
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;
@@ -32,6 +51,7 @@
 * @Author Ryan
 * 任务工作档
 */
@Slf4j
@Component
public class TaskSchedules {
@@ -53,6 +73,24 @@
    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;
    /**
     * @param
@@ -79,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)
@@ -89,6 +128,110 @@
        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);
//        }
    }
    /**
     * @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("入库任务明细保存失败!!");
//                    }
//                });
//            });
//        }
    }
    /**
@@ -100,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)
@@ -133,29 +278,121 @@
                }
            }
            //TODO 调用下发任务接口
            pubTaskToWcs(task);
        }
    }
    /**
     * 每五秒校验深库位是否为空,如果浅库位有货,将浅库位移至深库位
     *///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;
    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());
        }
        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;
        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());
            }
            taskService.moveToDeep(SystemAuthUtils.getLoginUserId(), shallowLoc);
        }
    }