package com.huaheng.api.erp.controller;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONException;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.huaheng.api.erp.domain.*;
import com.huaheng.api.erp.domain.tracedBack.*;
import com.huaheng.api.erp.service.CodingService;
import com.huaheng.api.wcs.service.WcsService;
import com.huaheng.common.constant.QuantityConstant;
import com.huaheng.common.exception.service.ServiceException;
import com.huaheng.common.utils.StringUtils;
import com.huaheng.common.utils.http.OkHttpUtils;
import com.huaheng.framework.aspectj.lang.annotation.ApiLogger;
import com.huaheng.framework.aspectj.lang.annotation.Log;
import com.huaheng.framework.aspectj.lang.constant.BusinessType;
import com.huaheng.framework.web.controller.BaseController;
import com.huaheng.framework.web.domain.AjaxResult;
import com.huaheng.framework.web.page.PageDomain;
import com.huaheng.framework.web.page.TableDataInfo;
import com.huaheng.framework.web.page.TableSupport;
import com.huaheng.pc.config.location.domain.Location;
import com.huaheng.pc.config.proPackaging.domain.ProPackaging;
import com.huaheng.pc.config.proPackaging.service.IProPackagingService;
import com.huaheng.pc.config.proPackaging.service.impl.ProPackagingServiceImpl;
import com.huaheng.pc.inventory.inventoryHeader.service.InventoryHeaderService;
import com.huaheng.pc.inventory.loadingConfirmed.domain.loadingConfirmed;
import com.huaheng.pc.shipment.shipmentHeader.domain.ShipmentHeader;
import com.huaheng.pc.shipment.shipmentHeader.service.ShipmentHeaderService;
import com.huaheng.pc.task.agvTask.domain.AgvTask;
import com.huaheng.pc.task.agvTask.service.AgvTaskService;
import com.huaheng.pc.task.taskHeader.domain.TaskHeader;
import io.swagger.annotations.ApiOperation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
WMS和赋码系统交互
 * @author 游杰
 */
@RestController
@RequestMapping("/API/WMS/v2")
public class CodingController extends BaseController {

    @Resource
    private CodingService codingService;
    @Resource
    private IProPackagingService proPackagingService;
    @Resource
    private ShipmentHeaderService shipmentHeaderService;


    @PostMapping("/receipt")
    @ApiOperation("入库组盘信息")
    @ResponseBody
    @ApiLogger(apiName = "入库组盘信息", from="码垛系统")
    public AjaxResult receipt(@RequestBody ERPReceipt erpReceipt) {
        if(erpReceipt == null) {
            return AjaxResult.error("入库组盘信息为空");
        }
        String Pack="";
        Integer so = 0;
        List<String> Box=new ArrayList<>();
        for(int i = 0;i<erpReceipt.getListBoxInfo().size();i++)
        {
            if(Box.contains(erpReceipt.getListBoxInfo().get(i).getBoxCode()))
            {
                return AjaxResult.error("箱码不能重复!!"+erpReceipt.getListBoxInfo().get(i).getBoxCode());
            }
            Box.add(erpReceipt.getListBoxInfo().get(i).getBoxCode());

            if (Pack.equals(erpReceipt.getListBoxInfo().get(i).getProPackaging())==false)
            {
                if (StringUtils.isNotEmpty(erpReceipt.getListBoxInfo().get(i).getProPackaging())){
                    Pack=erpReceipt.getListBoxInfo().get(i).getProPackaging();
                }
                LambdaQueryWrapper<ProPackaging> proPackagingLambdaQueryWrapper = Wrappers.lambdaQuery();
                proPackagingLambdaQueryWrapper.eq(ProPackaging::getName,Pack);
                ProPackaging packagingServiceOne = proPackagingService.getOne(proPackagingLambdaQueryWrapper);
                if (packagingServiceOne != null){
                    so=packagingServiceOne.getPieceBox();
                }

            }
            Integer integer = Integer.valueOf(String.valueOf(erpReceipt.getListBoxInfo().get(i).getQty()));


            if (erpReceipt.getTotalBoxes()==0)
            {
                return AjaxResult.error("箱数错误,不该为0");
            }

            if (erpReceipt.getTotalChips()==0)
            {
                return AjaxResult.error("片数错误,不该为0");
            }

            if (!Integer.valueOf(String.valueOf(erpReceipt.getListBoxInfo().get(i).getQty())).equals(so))
            {
                return AjaxResult.error("片数给的与发来的不对");
            }

            if (erpReceipt.getListBoxInfo().get(i).getChipInfos().size()!=so)
            {
                return AjaxResult.error("箱码"+erpReceipt.getListBoxInfo().get(i).getBoxCode()+"所对应的片码不相符合");
            }


        }

        String containerCode = erpReceipt.getContainerCode();
        String receiptCode = erpReceipt.getReceiptCode();
        String position = erpReceipt.getRequestInCode();
        String orderCode = erpReceipt.getOrderCode();
        String orderName = erpReceipt.getOrderName();
        Integer toalCases= erpReceipt.getTotalChips();
        BigDecimal weight = erpReceipt.getPieceWeight();
        List<BoxInfo> boxInfoList = erpReceipt.getListBoxInfo();
        int stack = erpReceipt.getStack();
        int qc = erpReceipt.getQc();
        int orderFinish = erpReceipt.getOrderFinish();
        int type = erpReceipt.getType();
        String k3Code = erpReceipt.getK3Code();
        String inType = erpReceipt.getInType();
        String operatorName = erpReceipt.getOperatorName();
        String qualityorName = erpReceipt.getQualityorName();

        if (!k3Code.equals(orderCode)||!k3Code.equals(receiptCode))
        {
            return AjaxResult.error("k3Code,orderCode,receiptCode三个字段是否不一致?");
        }
        if(toalCases==0) {
            return AjaxResult.error("入库组盘信息,总箱数为空");
        }

        if(StringUtils.isEmpty(receiptCode)) {
            return AjaxResult.error("入库组盘信息,排产订单编码为空");
        }
        if(StringUtils.isEmpty(containerCode)) {
            return AjaxResult.error("入库组盘信息,托盘号为空");
        }
        if(StringUtils.isEmpty(position)) {
            return AjaxResult.error("入库组盘信息,码垛站台位置为空");
        }
        if(StringUtils.isEmpty(orderCode)) {
            return AjaxResult.error("入库组盘信息,订单信息为空");
        }
        if(StringUtils.isEmpty(orderName)) {
            return AjaxResult.error("入库组盘信息,订单名称为空");
        }
        if(boxInfoList == null) {
            return AjaxResult.error("入库组盘信息,箱信息为空");
        }

        AjaxResult ajaxResult = handleMultiProcess("innerReceipt",new MultiProcessListener() {
            @Override
            public AjaxResult doProcess() {
                AjaxResult ajaxResult = codingService.innerReceipt(containerCode,
                        position, receiptCode, orderCode, orderName, boxInfoList,
                        stack, qc, orderFinish,weight, type, k3Code, inType, operatorName, qualityorName,toalCases);
                return ajaxResult;
            }
        });
        return ajaxResult;
    }


    @PostMapping("/inventoryCheck")
    @ApiOperation("库存查看接口")
    @ResponseBody
    @ApiLogger(apiName = "库存查看接口", from="库存查看接口")
    public AjaxResult inventoryCheck(@RequestBody Map<String,String> map) {
        String boxCode =  map.get("boxCode");
        String containerCode =  map.get("containerCode");
        //片码
        String chipCode =  map.get("chipCode");
        AjaxResult ajaxResult = handleMultiProcess("brickFalling",new MultiProcessListener() {
            @Override
            public AjaxResult doProcess() {
                AjaxResult ajaxResult = codingService.inventoryCheck(boxCode,containerCode,chipCode);
                return ajaxResult;
            }
        });
        return ajaxResult;
    }



    //查立库存在的系统库存位置
    @PostMapping("/PDACheck")
    @ApiOperation("PDA查看接口")
    @ResponseBody
    @ApiLogger(apiName = "PDA查看接口", from="PDA查看接口")
    public AjaxResult PDACheck(@RequestBody Map<String,String> map) {
        String boxCode =  map.get("boxCode");
        String containerCode =  map.get("containerCode");
        //片码
        String chipCode =  map.get("chipCode");
        List<MaterialInformation> materialInformationList= codingService.PDACheck(boxCode,containerCode,chipCode);
        if (materialInformationList.isEmpty())
        {
            return AjaxResult.error("数据为空");
        }
        return AjaxResult.success(materialInformationList);
    }

    @Resource
    private AgvTaskService agvTaskService;
    @Resource
    private WcsService wcsService;
    @Resource
    private InventoryHeaderService inventoryService;

    @PostMapping("/createEmpty")
    @ApiOperation("入库口空托入库+agv一条龙")
    @Log(title = "移动端空托入库", action = BusinessType.OTHER)
    @Transactional
    public AjaxResult createEmpty(@RequestBody Map<String, String> param) {
        String containerCode = param.get("containerCode");
        String fromPort = param.get("fromPort");
        String sTPoint = param.get("sTPoint");

        String toPort="";
        if (fromPort.equals(QuantityConstant.PORT_P1005)) {
            toPort = QuantityConstant.PORT_P1004;
        }

        if (fromPort.equals(QuantityConstant.PORT_P1001)) {
            toPort = QuantityConstant.PORT_P1000;
        }


        AjaxResult taskFromTo = agvTaskService.start("CS0001", QuantityConstant.ZONE_LK, containerCode,
                sTPoint,toPort, QuantityConstant.PLATFORM_CODING, 0);
        if (taskFromTo.hasErr()) {
            throw new ServiceException("生成agv任务失败"+taskFromTo.getMsg());
        }

        return  inventoryService.createEmptyIn(containerCode, "",fromPort);
    }



    //查立库存在的系统库存位置
    @PostMapping("/PDALoading")
    @ApiOperation("PDA查看装车历史")
    @ResponseBody
    @ApiLogger(apiName = "装车历史查看", from="装车历史查看")
    public AjaxResult PDALoading(@RequestBody Map<String,String> map) {
        String locationCode =  map.get("locationCode");
        String containerCode =  map.get("containerCode");
        String shipmentHeaderCode =  map.get("shipmentHeaderCode");
        String referCode =  map.get("referCode");
        String operator =  map.get("operator");

        List<loadingConfirmed> loadingConfirmedList= codingService.PDALoading(locationCode,containerCode,shipmentHeaderCode,referCode,operator);
        return AjaxResult.success(loadingConfirmedList);
    }

    @PostMapping("/agvGetLocation")
    @ApiOperation("agv重新获取库位")
    @ApiLogger(apiName = "agv重新获取库位", from="agv")
    public AjaxResult agvGetLocation(@RequestBody Map<String, String> param) {
        String containerCode =  param.get("containerCode");
        String taskNo =  param.get("taskNo");
        String zoneCode =  param.get("zoneCode");
        if (StringUtils.isEmpty(containerCode)||StringUtils.isEmpty(taskNo))
        {
            return AjaxResult.error("有请求参数为空");
        }
        AjaxResult ajaxResult = handleQuest("agvGetLocation",new MultiProcessListener() {
            @Override
            public AjaxResult doProcess() {
                AjaxResult ajaxResult = codingService.agvGetLocation(containerCode,taskNo,zoneCode);
                return ajaxResult;
            }
        });
        return ajaxResult;
    }




    @PostMapping("/brickFalling")
    @ApiOperation("掉砖pda接口")
    @ResponseBody
    @ApiLogger(apiName = "掉砖pda接口", from="掉砖pda接口")
    public AjaxResult brickFalling(@RequestBody Map<String,String> map) {
        String boxCode =  map.get("boxCode");
        String containerCode =  map.get("containerCode");
        String chipCode =  map.get("chipCode");
        if(StringUtils.isEmpty(boxCode)) {
            return AjaxResult.error("箱码不为空");
        }
        if(StringUtils.isEmpty(containerCode)) {
            return AjaxResult.error("托盘号不为空");
        }
        AjaxResult ajaxResult = handleMultiProcess("brickFalling",new MultiProcessListener() {
            @Override
            public AjaxResult doProcess() {
                AjaxResult ajaxResult = codingService.brickFalling(boxCode,containerCode,chipCode);
                return ajaxResult;
            }
        });
        return ajaxResult;
    }


    @PostMapping("/labelPrinting")
    @ApiOperation("pda补标签功能")
    @ResponseBody
    @ApiLogger(apiName = "pda补标签功能", from="pda补标签功能")
    public AjaxResult labelPrinting(@RequestBody Map<String,String> map) {
        String containerCode =  map.get("containerCode");
        String boxCode = map.get("boxCode");
        if(StringUtils.isEmpty(containerCode)&&StringUtils.isEmpty(boxCode)) {
            return AjaxResult.error("托盘号或者箱码两者不能都是空");
        }
        AjaxResult ajaxResult = handleMultiProcess("brickFalling",new MultiProcessListener() {
            @Override
            public AjaxResult doProcess() {
                AjaxResult ajaxResult = codingService.labelPrinting(containerCode,boxCode);
                return ajaxResult;
            }
        });
        return ajaxResult;
    }



    /**
     * 替换备货区的 其他地方不能替换 而且在追溯里面也一并替换
     */
    @PostMapping("/codeSubstitution")
    @ApiOperation("备货区箱码替换")
    @ResponseBody
    @ApiLogger(apiName = "备货区箱码替换", from="备货区箱码替换")
    public AjaxResult codeSubstitution(@RequestBody Map<String,String> map) {
        //要被替换掉的初始箱码
        String boxCode = map.get("boxCode");
        //要替换的箱码
        String toBoxCode = map.get("toBoxCode");

        String chipCode1 = map.get("chipCode1");
        //新片码
        String chipCode2 = map.get("chipCode2");


        //容器号
        String containerCode =  map.get("containerCode");
        if(StringUtils.isEmpty(boxCode)) {
            return AjaxResult.error("待箱码不为空");
        }
        if(StringUtils.isEmpty(toBoxCode)) {
            return AjaxResult.error("箱码不为空");
        }
        if(StringUtils.isEmpty(containerCode)) {
            return AjaxResult.error("托盘号不为空");
        }
        AjaxResult ajaxResult = handleMultiProcess("codeSubstitution",new MultiProcessListener() {
            @Override
            public AjaxResult doProcess() {
                AjaxResult ajaxResult = codingService.codeSubstitution(boxCode,toBoxCode,chipCode1,chipCode2,containerCode);
                return ajaxResult;
            }
        });
        return ajaxResult;
    }



    /**
     * 备货区插入
     */
    @PostMapping("/boxCodeInsert")
    @ApiOperation("备货区插入")
    @ResponseBody
    @Transactional
    @ApiLogger(apiName = "备货区插入", from="备货区插入")
    public AjaxResult boxCodeInsert(@RequestBody Map<String,String> map) {
        //备货区要插那一箱的箱码 根据箱码找组织
        String containerCode =  map.get("boxCode");
        //库里面出来的箱码
        String toBoxCode =  map.get("toBoxCode");
        if(StringUtils.isEmpty(containerCode)) {
            return AjaxResult.error("托盘号不能为空");
        }
        if(StringUtils.isEmpty(toBoxCode)) {
            return AjaxResult.error("库里面出来的箱码不为空");
        }
        AjaxResult ajaxResult = handleMultiProcess("codeSubstitution",new MultiProcessListener() {
            @Override
            public AjaxResult doProcess() {
                AjaxResult ajaxResult = codingService.boxCodeInsert(containerCode,toBoxCode);
                return ajaxResult;
            }
        });
        return ajaxResult;
    }


    /**
     * PDA散片出库功能
     */
    @PostMapping("/bulkDelivery")
    @ApiOperation("PDA散片出库功能")
    @ResponseBody
    @ApiLogger(apiName = "PDA散片出库功能", from="PDA散片出库功能")
    public AjaxResult bulkDelivery(@RequestBody Map<String,String> map) {
        //片码
        String chipCode =  map.get("chipCode");
        //箱码
        String boxCode =  map.get("boxCode");
        //
        String shipmentCode =  map.get("shipmentCode");

        //出库单明细
        String shipmentDetailId =  map.get("shipmentDetailId");

        if(StringUtils.isEmpty(boxCode)) {
            return AjaxResult.error("箱码不能为空");
        }
        if(StringUtils.isEmpty(chipCode)) {
            return AjaxResult.error("片码不能为空");
        }
        if(StringUtils.isEmpty(shipmentCode)) {
            return AjaxResult.error("容器号不能为空");
        }
        if (StringUtils.isEmpty(shipmentDetailId))
        {
            return  AjaxResult.error("明细id不能为空");
        }
        AjaxResult ajaxResult = handleMultiProcess("bulkDelivery",new MultiProcessListener() {
            @Override
            public AjaxResult doProcess() {
                AjaxResult ajaxResult = codingService.bulkDelivery(chipCode,boxCode,shipmentCode,shipmentDetailId);
                return ajaxResult;
            }
        });
        return ajaxResult;
    }

    /**
     * 发货单据绑定功能
     */
    @PostMapping("/flatLibraryBinding")
    @ApiOperation("平库-发货单据绑定功能")
    @ResponseBody
    @Transactional
    @Log(title = "平库-发货单据绑定功能", operating = "平库-发货单据绑定功能", action = BusinessType.INSERT)
    public AjaxResult flatLibraryBinding(@RequestBody Map<String,String> map) {
        String containerCode =  map.get("containerCode");

        String shipmentDetailId =  map.get("shipmentDetailId");

        if(StringUtils.isEmpty(containerCode)) {
            return AjaxResult.error("托盘号不为空");
        }
        if(StringUtils.isEmpty(shipmentDetailId)) {
            return AjaxResult.error("出库单号不能为空");
        }
        AjaxResult ajaxResult = handleMultiProcess("bulkDelivery",new MultiProcessListener() {
            @Override
            public AjaxResult doProcess() {
                AjaxResult ajaxResult = codingService.flatLibraryBinding(containerCode,shipmentDetailId);
                return ajaxResult;
            }
        });
        return ajaxResult;
    }

    /**
     * PDA补充到散片库存功能
     */
    @PostMapping("/loosePieceInventory")
    @ApiOperation("补充到散片库存功能")
    @ResponseBody
    @ApiLogger(apiName = "补充到散片库存功能", from="PDA")
    public AjaxResult loosePieceInventory(@RequestBody Map<String,String> map) {
        //片码
        String chipCodes =  map.get("chipCodes");
        //箱码 非必填
        String boxCode =  map.get("boxCode");
        //库位
        String locationCode =  map.get("locationCode");

        if(StringUtils.isEmpty(chipCodes)) {
            return AjaxResult.error("片码不能为空");
        }
        AjaxResult ajaxResult = handleMultiProcess("bulkDelivery",new MultiProcessListener() {
            @Override
            public AjaxResult doProcess() {
                AjaxResult ajaxResult = codingService.loosePieceInventory(chipCodes,boxCode,locationCode);
                return ajaxResult;
            }
        });
        return ajaxResult;
    }






    /**
     * 散片示订单列表
     */
    @PostMapping("/orderList")
    @ApiOperation("散片示订单列表")
    @ResponseBody
    public TableDataInfo orderList(ShipmentHeader shipmentHeader) {
        PageDomain pageDomain = TableSupport.buildPageRequest();
        Integer pageNum = pageDomain.getPageNum();
        Integer pageSize = pageDomain.getPageSize();


        LambdaQueryWrapper<ShipmentHeader> shipmentHeaderLambdaQueryWrapper = Wrappers.lambdaQuery();
        shipmentHeaderLambdaQueryWrapper.and(q->
                q.eq(ShipmentHeader::getShipmentType, QuantityConstant.SHIPMENT_TYPE_DELIVERY)
                        .or().eq(ShipmentHeader::getShipmentType, QuantityConstant.SHIPMENT_TYPE_OTHER))
                .and(w->w.like(ShipmentHeader::getCode,shipmentHeader.getCode())
                        .or()
                        .like(ShipmentHeader::getReferCode, shipmentHeader.getReferCode()))
                .orderByDesc(ShipmentHeader::getCreated);

        if (com.huaheng.common.utils.StringUtils.isNotNull(pageNum) && com.huaheng.common.utils.StringUtils.isNotNull(pageSize)){

            Page<ShipmentHeader> page = new Page<>(pageNum, pageSize);
            IPage<ShipmentHeader> iPage = shipmentHeaderService.page(page, shipmentHeaderLambdaQueryWrapper);
            List<ShipmentHeader> iPages = iPage.getRecords();
            return getMpDataTable(iPages, iPage.getTotal());
        }else
        {
            List<ShipmentHeader> shipmentHeaders= shipmentHeaderService.list(shipmentHeaderLambdaQueryWrapper);
            return getDataTable(shipmentHeaders);
        }

    }



    @PostMapping("/inventory")
    @ApiOperation("盘点接口")
    @ResponseBody
    @ApiLogger(apiName = "盘点接口", from="盘点接口")
    public AjaxResult inventory(@RequestBody Map<String,String> map) {
        String boxCode =  map.get("boxCode");
        String containerCode =  map.get("containerCode");
        String chipCode =  map.get("chipCode");
        if(StringUtils.isEmpty(boxCode)) {
            return AjaxResult.error("箱码不为空");
        }
        if(StringUtils.isEmpty(containerCode)) {
            return AjaxResult.error("托盘号不为空");
        }
        AjaxResult ajaxResult = handleMultiProcess("inventory",new MultiProcessListener() {
            @Override
            public AjaxResult doProcess() {
                AjaxResult ajaxResult = codingService.inventory(boxCode,containerCode,chipCode);
                return ajaxResult;
            }
        });
        return ajaxResult;
    }

    @PostMapping("/freeFromInventory")
    @ApiOperation("直接回库-免盘点")
    @ResponseBody
    @ApiLogger(apiName = "盘点接口", from="盘点接口")
    public AjaxResult freeFromInventory(@RequestBody Map<String,String> map) {
        String containerCode =  map.get("containerCode");
        if(StringUtils.isEmpty(containerCode)) {
            return AjaxResult.error("托盘号不为空");
        }
        AjaxResult ajaxResult = handleMultiProcess("inventory",new MultiProcessListener() {
            @Override
            public AjaxResult doProcess() {
                AjaxResult ajaxResult = codingService.freeFromInventory(containerCode);
                return ajaxResult;
            }
        });
        return ajaxResult;
    }




    @PostMapping("/goOnline")
    @ApiOperation("人工位上线通知wcs")
    @ResponseBody
    @ApiLogger(apiName = "人工位上线通知wcs", from="人工位上线通知wcs")
    public AjaxResult goOnline(@RequestBody Map<String,String> map) {
        String port =  map.get("port");
        String barcode =  map.get("barcode");
        if(StringUtils.isEmpty(port)) {
            return AjaxResult.error("站台");
        }
        if(StringUtils.isEmpty(barcode)) {
            return AjaxResult.error("托盘号不为空");
        }
        AjaxResult ajaxResult = handleMultiProcess("inventory",new MultiProcessListener() {
            @Override
            public AjaxResult doProcess() {
                AjaxResult ajaxResult = codingService.goOnline(port,barcode);
                return ajaxResult;
            }
        });
        return ajaxResult;
    }






    @PostMapping("/chipCode")
    @ApiOperation("根据箱码查询片码")
    @ResponseBody
    @ApiLogger(apiName = "根据箱码查询片码", from="根据箱码查询片码")
    public AjaxResult chipCode(@RequestBody Map<String,String> map) {
        String boxCode =  map.get("boxCode");
        if(StringUtils.isEmpty(boxCode)) {
            return AjaxResult.error("箱码不为空");
        }
        AjaxResult ajaxResult = handleMultiProcess("inventory",new MultiProcessListener() {
            @Override
            public AjaxResult doProcess() {
                AjaxResult ajaxResult = codingService.chipCode(boxCode);
                return ajaxResult;
            }
        });
        return ajaxResult;
    }


    @PostMapping("/flatLibraryChipCode")
    @ApiOperation("平库库存根据箱码查询片码")
    @ResponseBody
    @ApiLogger(apiName = "平库库存根据箱码查询片码", from="平库库存根据箱码查询片码")
    public AjaxResult flatLibraryChipCode(@RequestBody Map<String,String> map) {
        String boxCode =  map.get("boxCode");
        if(StringUtils.isEmpty(boxCode)) {
            return AjaxResult.error("箱码不为空");
        }
        AjaxResult ajaxResult = handleMultiProcess("inventory",new MultiProcessListener() {
            @Override
            public AjaxResult doProcess() {
                AjaxResult ajaxResult = codingService.flatLibraryChipCode(boxCode);
                return ajaxResult;
            }
        });
        return ajaxResult;
    }


    @PostMapping("/scatteredFilmChip")
    @ApiOperation("散片出库根据箱码查询片码")
    @ResponseBody
    @ApiLogger(apiName = "散片出库根据箱码查询片码", from="散片出库根据箱码查询片码")
    public AjaxResult scatteredFilmChip(@RequestBody Map<String,String> map) {
        String boxCode =  map.get("boxCode");
        if(StringUtils.isEmpty(boxCode)) {
            return AjaxResult.error("箱码不为空");
        }
        AjaxResult ajaxResult = handleMultiProcess("inventory",new MultiProcessListener() {
            @Override
            public AjaxResult doProcess() {
                AjaxResult ajaxResult = codingService.scatteredFilmChip(boxCode);
                return ajaxResult;
            }
        });
        return ajaxResult;
    }



    @PostMapping("/productInformation")
    @ApiOperation("查询产品信息")
    @ResponseBody
    @ApiLogger(apiName = "查询产品信息(打托后)", from="查询产品信息")
    public AjaxResult<List<MaterialDom>>  productInformation(@RequestBody Map<String,String> map) {
        String boxCode =  map.get("boxCode");
        String chipCode =  map.get("chipCode");
        String isDepth =  map.get("isDepth");
        if(StringUtils.isEmpty(boxCode)&&StringUtils.isEmpty(chipCode)) {
            throw new ServiceException("箱码跟片码信息不能都为空");
        }
        return AjaxResult.success(codingService.productInformation(boxCode,chipCode,isDepth));
    }


    @PostMapping("/productionInformation")
    @ApiOperation("生产信息查询")
    @ResponseBody
    @ApiLogger(apiName = "生产信息查询", from="生产信息查询")
    public AjaxResult<ProduceDom>  productionInformation(@RequestBody Map<String,String> map) {
        String boxCode =  map.get("boxCode");
        String chipCode =  map.get("chipCode");
        String isDepth =  map.get("isDepth");
        if(StringUtils.isEmpty(boxCode)&&StringUtils.isEmpty(chipCode)) {
            throw new ServiceException("箱码跟片码信息不能都为空");
        }
        return AjaxResult.success(codingService.productionInformation(boxCode,chipCode,isDepth));
    }


    @PostMapping("/inboundInformation")
    @ApiOperation("入库信息")
    @ResponseBody
    @ApiLogger(apiName = "入库信息", from="入库信息")
    public AjaxResult<List<StorageDom>>  inboundInformation(@RequestBody Map<String,String> map) {
        String boxCode =  map.get("boxCode");
        String chipCode =  map.get("chipCode");
        String isDepth =  map.get("isDepth");
        if(StringUtils.isEmpty(boxCode)&&StringUtils.isEmpty(chipCode)) {
            throw new ServiceException("箱码跟片码信息不能都为空");
        }
        return AjaxResult.success(codingService.inboundInformation(boxCode,chipCode,isDepth));
    }


    @PostMapping("/itemInformation")
    @ApiOperation("物料信息")
    @ResponseBody
    @ApiLogger(apiName = "物料信息", from="物料信息")
    public AjaxResult<List<LogisticsDom>>  itemInformation(@RequestBody Map<String,String> map) {
        String boxCode =  map.get("boxCode");
        String chipCode =  map.get("chipCode");
        String isDepth =  map.get("isDepth");
        if(StringUtils.isEmpty(boxCode)&&StringUtils.isEmpty(chipCode)) {
            throw new ServiceException("箱码跟片码信息不能都为空");
        }
        return AjaxResult.success(codingService.itemInformation(boxCode,chipCode,isDepth));
    }


    @PostMapping("/shipmentCheckNew")
    @ApiOperation("出库确认新")
    @ResponseBody
    @ApiLogger(apiName = "出库确认新", from="出库确认新")
    public AjaxResult shipmentCheckNew(@RequestBody Map<String,String> map) {
        String containerCode =  map.get("containerCode");
        String shipmentCode =  map.get("shipmentCode");
        String operator =  map.get("operator");
        if(StringUtils.isEmpty(containerCode)&&StringUtils.isEmpty(containerCode)) {
            return AjaxResult.error("容器号不能为空");
        }
        AjaxResult ajaxResult = handleMultiProcess("shipmentCheck",new MultiProcessListener() {
            @Override
            public AjaxResult doProcess() {
                AjaxResult ajaxResult = codingService.findShipmentRecordByLs(containerCode,shipmentCode,operator);
                return ajaxResult;
            }
        });
        return ajaxResult;
    }
@PostMapping("/shipmentCheck")
@ApiOperation("出库确认")
@ResponseBody
public AjaxResult shipmentCheck(@RequestBody Map<String,String> map) {
    String containerCode =  map.get("containerCode");
    if(StringUtils.isEmpty(containerCode)&&StringUtils.isEmpty(containerCode)) {
        return AjaxResult.error("容器号不能为空");
    }
    AjaxResult ajaxResult = handleMultiProcess("shipmentCheck",new MultiProcessListener() {
        @Override
        public AjaxResult doProcess() {
            AjaxResult ajaxResult = codingService.findShipmentRecordByLs(containerCode);
            return ajaxResult;
        }
    });
    return ajaxResult;
}
    @PostMapping("/requestEmptyContainer")
    @ApiOperation("申请空托盘组")
    @ResponseBody
    @ApiLogger(apiName = "申请空托盘组", from="申请空托盘组")
    public AjaxResult requestEmptyContainer(@RequestBody EmptyZu emptyZu) {
        String requestInCode = emptyZu.getRequestInCode();
        if (requestInCode == null) {
            return AjaxResult.error("空托盘组信息,申请位置为空");
        }
        if (!requestInCode.equals("P3") && !requestInCode.equals("P6")){
            return AjaxResult.error("目标站台错误");
        }

        AjaxResult ajaxResult = handleMultiProcess("requestEmptyContainer",new MultiProcessListener() {
            @Override
            public AjaxResult doProcess() {
                AjaxResult ajaxResult = codingService.requestEmptyContainer(requestInCode);
                return ajaxResult;
            }
        });
        return ajaxResult;
    }



}