package com.prolog.cs.biz.outbound.service.impl.eis;

import cn.hutool.core.collection.CollUtil;
import com.alibaba.fastjson.JSONObject;
import com.prolog.cs.biz.outbound.service.MqOutBoundProducer;
import com.prolog.entity.vo.*;
import com.prolog.inte.EisHandler;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.List;

@Slf4j
@Service
public class EisOutBoundHandler implements EisHandler {

    @Resource
    private MqOutBoundProducer producer;


    /**
     * 本接口支持的作业类型有：
     * 正常出库(销售出库、购进退货出库):
     * （1）一楼四向库区：WMS指定货主品批出库，WMS将出库任务推送给EIS系统，EIS系统根据WMS出库任务确定具体的出库货位（WMS发送任务时带上WMS大货位，EIS根据WMS大货位确定出库区域:四向库区、AGV整件区、AGV拆零区）；立库整托（不考虑单订单或多订单整托分开）和非整托由EIS计算，分别搬运到一楼整托出库口和一楼人工在线拣选平台。
     * （2）二楼阴凉AGV整件区：WMS指定货主品批出库，EIS计算 单订单整托、多订单整托、拼托。单订单整托AGV直接搬运到一楼集货区支架。非单订单整托，二楼拣选支架进行RF拣选下架
     * （3）二楼阴凉AGV拆零区：WMS指定货主品批出库，EIS计算命中AGV地堆还是AGV货架进行总拣下架
     * （4）一楼四向库北面平库整件地堆区：该出库任务不推送EIS，WMS平库下架完成后自动推送整件地堆托盘搬运出库借道，托盘送至入库口，BCR扫码EIS判断是否存在出库借道任务，如果存在生成搬运任务至相应目标集货区
     *
     * WMS出库任务下发增加库存缺货策略字段：
     * 0：优先库存出库-满足订单部分数量出库原则 1：优先订单整单出库-订单部分库存不足整单挂起不自动取消原则
     *
     * 主动补货；
     * （1）拆零区补货：
     * WMS指定货主品批出库，WMS将出库任务推送给EIS系统；按照业务逻辑，EIS根据指定货主、商品、批次、数量、大货位定位托盘；EIS内部判断上架到AGV拆零料架或地堆。AGV拆零料架上架存在余料回库AGV整件地堆或四向库。支持超补，超补需WMS同意或者WMS本身允许此任务超补
     *
     * 盘点：
     * （1）一楼四向库区：WMS指定容器号盘点出库，WMS将出库任务推送给EIS系统，EIS系统根据WMS出库任务确定具体的出库货位（WMS发送任务时带上WMS大货位，EIS根据WMS大货位确定出库区域:四向库区、AGV整件区、AGV拆零区）；托盘搬运到一楼人工在线拣选平台
     * （2）二楼阴凉AGV整件区：WMS指定容器号盘点出库，AGV搬运到二楼AGV拣选支架
     * （3）二楼阴凉AGV拆零区：WMS指定容器号盘点出库，AGV搬运到二楼AGV拆零上架支架
     *
     * 养护：
     * （1）一楼四向库区：WMS指定容器号养护出库，WMS将出库任务推送给EIS系统，EIS系统根据WMS出库任务确定具体的出库货位（WMS发送任务时带上WMS大货位，EIS根据WMS大货位确定出库区域:四向库区、AGV整件区、AGV拆零区）；托盘搬运到一楼人工在线拣选平台
     * （2）二楼阴凉AGV整件区：WMS指定容器号养护出库，AGV搬运到二楼AGV整件拣选支架
     * （3）二楼阴凉AGV拆零区：WMS指定容器号养护出库，AGV搬运到二楼AGV拆零上架支架
     */
    @Override
    public void outBoundRequest(List<OutBoundRequestVO> list) {
        log.info("outBoundRequest:{}", JSONObject.toJSONString(list));
        if (CollUtil.isEmpty(list)) {
            return;
        }
        producer.outBoundRequest(list);
    }

    /**
     * 提升优先级接口
     */
    @Override
    public void upgradePriority(List<UpdatePriorityVO> list) {
        log.info("upgradePriority:{}", JSONObject.toJSONString(list));
        if (CollUtil.isEmpty(list)) {
            return;
        }
        producer.upgradePriority(list);

    }

    /**
     * 作业任务取消
     */
    @Override
    public void cancelTasks(List<CancelTasksVO> list) {
        log.info("cancelTasks:{}", JSONObject.toJSONString(list));
        if (CollUtil.isEmpty(list)) {
            return;
        }
        producer.cancelTasks(list);
    }

    /**
     * 作业完成确认
     */
    @Override
    public void operationComplete(List<OperationCompleteVO> list) {
        log.info("operationComplete:{}", JSONObject.toJSONString(list));
        if (CollUtil.isEmpty(list)) {
            return;
        }
        producer.operationComplete(list);
    }

    /**
     * 容器借道下发
     */
    @Override
    public void containerTailgatingRequest(List<ContainerTailgatingRequestVO> list) {
        log.info("containerTailgatingRequest:{}", JSONObject.toJSONString(list));
        if (CollUtil.isEmpty(list)) {
            return;
        }
        producer.containerTailgatingRequest(list);
    }
}
