package com.huaheng.api.mes.controller;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.huaheng.api.mes.dto.*;
import com.huaheng.api.mes.dto.otherReceipt.OtherReceiptDetail;
import com.huaheng.api.mes.dto.otherReceipt.OtherReceiptHeader;
import com.huaheng.api.mes.result.ReturnInfo;
import com.huaheng.api.mes.service.IMesService;
import com.huaheng.api.mes.utils.CallaMOM;
import com.huaheng.api.mes.utils.SqlServer;
import com.huaheng.api.mes.vo.InventoryVO;
import com.huaheng.api.mes.vo.InventoryTransactionVO;
import com.huaheng.common.constant.QuantityConstant;
import com.huaheng.common.exception.service.ServiceException;
import com.huaheng.common.utils.StringUtils;
import com.huaheng.common.utils.reflect.ReflectUtils;
import com.huaheng.common.utils.security.ShiroUtils;
import com.huaheng.framework.aspectj.lang.annotation.ApiLogger;
import com.huaheng.framework.web.controller.BaseController;
import com.huaheng.framework.web.domain.AjaxResult;
import com.huaheng.framework.web.domain.RetCode;
import com.huaheng.pc.config.address.service.AddressService;
import com.huaheng.pc.config.material.domain.Material;
import com.huaheng.pc.config.material.service.MaterialService;
import com.huaheng.pc.inventory.inventoryDetail.domain.InventoryDetail;
import com.huaheng.pc.inventory.inventoryDetail.service.InventoryDetailService;
import com.huaheng.pc.inventory.inventoryTransaction.domain.InventoryTransaction;
import com.huaheng.pc.inventory.inventoryTransaction.service.InventoryTransactionService;
import com.huaheng.pc.momLog.service.IMomLogService;
import com.huaheng.pc.receipt.receiptDetail.domain.ReceiptDetail;
import com.huaheng.pc.receipt.receiptDetail.service.ReceiptDetailService;
import com.huaheng.pc.receipt.receiptDetailHistory.domain.ReceiptDetailHistory;
import com.huaheng.pc.receipt.receiptDetailHistory.service.ReceiptDetailHistoryService;
import com.huaheng.pc.receipt.receiptHeader.domain.ReceiptHeader;
import com.huaheng.pc.receipt.receiptHeader.service.ReceiptHeaderService;
import com.huaheng.pc.receipt.receiptHeaderHistory.domain.ReceiptHeaderHistory;
import com.huaheng.pc.receipt.receiptHeaderHistory.service.ReceiptHeaderHistoryService;
import com.huaheng.pc.shipment.shipmentDetail.domain.ShipmentDetail;
import com.huaheng.pc.shipment.shipmentDetail.service.ShipmentDetailService;
import com.huaheng.pc.shipment.shipmentDetailHistory.domain.ShipmentDetailHistory;
import com.huaheng.pc.shipment.shipmentDetailHistory.service.ShipmentDetailHistoryService;
import com.huaheng.pc.shipment.shipmentHeader.domain.ShipmentHeader;
import com.huaheng.pc.shipment.shipmentHeader.service.ShipmentHeaderService;
import com.huaheng.pc.shipment.shipmentHeaderHistory.domain.ShipmentHeaderHistory;
import com.huaheng.pc.shipment.shipmentHeaderHistory.service.ShipmentHeaderHistoryService;
import com.huaheng.pc.system.user.domain.User;
import com.huaheng.pc.system.user.service.IUserService;
import com.huaheng.pc.task.taskDetail.domain.TaskDetail;
import com.huaheng.pc.task.taskDetail.service.TaskDetailService;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeanUtils;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import java.io.UnsupportedEncodingException;
import java.math.BigDecimal;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.stream.Collectors;


@RestController
@Slf4j
@RequestMapping("/API/WMS/v2")
public class MesReceiptController extends BaseController {

    @Resource
    private ReceiptHeaderService receiptHeaderService;

    @Resource
    private ReceiptDetailService receiptDetailService;

    @Resource
    private ShipmentHeaderService shipmentHeaderService;

    @Resource
    private ShipmentDetailService shipmentDetailService;

    @Resource
    private InventoryDetailService inventoryDetailService;

    @Resource
    private TaskDetailService taskDetailService;
    @Resource
    private ShipmentDetailHistoryService shipmentDetailHistoryService;
    @Resource
    private ReceiptDetailHistoryService receiptDetailHistoryService;
    @Resource
    private InventoryTransactionService inventoryTransactionService;

    @Resource
    private ShipmentHeaderHistoryService shipmentHeaderHistoryService;
    @Resource
    private ReceiptHeaderHistoryService receiptHeaderHistoryService;
    @Resource
    private MaterialService materialService;

    @Resource
    private IMomLogService momLogService;
    @Resource
    private IMesService mesService;
    @Resource
    private IUserService userService;

    @Resource
    private AddressService addressService;

    @PostMapping("/receipt")
    @ApiLogger(apiName = "添加入库单及其明细", from = "ROBOT")
    @ApiOperation("添加入库单及其明细")
    public AjaxResult receipt(@RequestBody ReceiptDTO receiptDTO) {
        AjaxResult ajaxResult = handleQuest("receipt", new MultiProcessListener() {
            @Override
            public AjaxResult doProcess() {
                return mesService.receipt(receiptDTO);
            }
        });
        return ajaxResult;
    }


    /**
     * 添加出库单及其明细
     *
     * @param receiptDTO
     * @return
     */
    @PostMapping("/shipment")
    @ApiLogger(apiName = "添加出库单及其明细", from = "ROBOT")
    @ApiOperation("添加出库单及其明细")
    public AjaxResult shipment(@RequestBody ReceiptDTO receiptDTO) {
        AjaxResult ajaxResult = handleQuest("shipment", new MultiProcessListener() {
            @Override
            public AjaxResult doProcess() {
                return mesService.shipment(receiptDTO);
            }
        });
        return ajaxResult;
    }

    private JSONObject getJsonObject(Header header, List<Detail> details) {
        JSONObject data = new JSONObject();
        JSONObject Rd_In_M = new JSONObject();
        Rd_In_M.put("MGPK", header.getId());
        Rd_In_M.put("cCode", header.getReferCode());
        JSONArray Rd_In_S = new JSONArray();
        details.forEach(detail -> {
            JSONObject json = new JSONObject();
            json.put("MGPK", header.getId());
            json.put("SGPK", detail.getId());
            json.put("cInvCode", detail.getMaterialCode());
            Rd_In_S.add(json);
        });
        data.put("Requester", "WMS");
        data.put("Rd_In_M", Rd_In_M);
        data.put("Rd_In_S", Rd_In_S);
        return data;
    }


    /**
     * 入库单参数_判空处理
     *
     * @param ajaxResult
     * @param shipmentHeader
     * @param shipemtnDetails
     */
    //private boolean enterIsNull(AjaxResult ajaxResult, Header shipmentHeader, List<Detail> shipemtnDetails) {
    //
    //    if (isNullData(ajaxResult, shipmentHeader, shipemtnDetails)) {
    //        return true;
    //    }
    //
    //    if (StringUtils.isEmpty(shipmentHeader.getRefeCodeType())) {
    //        ajaxResult.setCode(RetCode.FAIL).setMsg("单据类型不能为空!!!");
    //        return true;
    //    } else if (StringUtils.isEmpty(shipmentHeader.getReferCode())) {
    //        ajaxResult.setCode(RetCode.FAIL).setMsg("单据单号不能为空!!!");
    //        return true;
    //    } else if (shipmentHeader.getTotalQty() == null || shipmentHeader.getTotalQty().intValue() <= 0) {
    //        ajaxResult.setCode(RetCode.FAIL).setMsg("数量不能为空!!!");
    //    }
    //
    //    shipemtnDetails.forEach(shipemtnDetail -> {
    //        if (StringUtils.isEmpty(shipemtnDetail.getMaterialCode())) {
    //            ajaxResult.setCode(RetCode.FAIL).setMsg("物料编码不能为空!!!");
    //        } else if (shipemtnDetail.getTotalQty() == null || shipemtnDetail.getQty().intValue() <= 0) {
    //            ajaxResult.setCode(RetCode.FAIL).setMsg("数量不能为空!!!");
    //        }
    //    });
    //    return StringUtils.isNotEmpty(ajaxResult.getMsg());
    //}

    /**
     * 出库单参数_判空处理
     *
     * @param ajaxResult
     * @param shipmentHeader
     * @param shipemtnDetails
     */
    private boolean outIsNull(AjaxResult ajaxResult, Header shipmentHeader, List<Detail> shipemtnDetails) {
        if (isNullData(ajaxResult, shipmentHeader, shipemtnDetails)) {
            return true;
        }

        if (StringUtils.isEmpty(shipmentHeader.getReferCode())) {
            ajaxResult.setCode(RetCode.FAIL).setMsg("单据单号不能为空!!!");
            return true;
        }

        shipemtnDetails.forEach(shipemtnDetail -> {
            if (StringUtils.isEmpty(shipemtnDetail.getMaterialCode())) {
                ajaxResult.setCode(RetCode.FAIL).setMsg("物料编码不能为空!!!");
            }
        });
        return StringUtils.isNotEmpty(ajaxResult.getMsg());
    }

    /**
     * 判空处理
     */
    private boolean isNullData(AjaxResult ajaxResult, Header shipmentHeader, List<Detail> shipemtnDetails) {
        if (shipmentHeader == null) {
            ajaxResult.setCode(RetCode.FAIL).setMsg("出库单头表不能为空!!!");
            return true;
        } else if (shipemtnDetails == null || shipemtnDetails.size() < 1) {
            ajaxResult.setCode(RetCode.FAIL).setMsg("出库单明细表集不能为空!!!");
            return true;
        }
        return false;
    }

    /**
     * 入库单单据取消
     */
    @PostMapping("/cancelEnterWarehouse")
    @ApiOperation("入库单单据取消")
    @ApiLogger(apiName = "入库单单据取消", from = "ROBOT")
    public AjaxResult cancelEnterWarehouse(@RequestBody ReceiptDTO receiptDTO) {
        AjaxResult ajaxResult = handleQuest("cancelEnterWarehouse", new MultiProcessListener() {
            @Override
            public AjaxResult doProcess() {
                AjaxResult ajaxResult = mesService.cancelEnterWarehouse(receiptDTO);
                return ajaxResult;
            }
        });
        return ajaxResult;
    }


    /**
     * 出库单单据取消
     */
    @PostMapping("/cancelOutWarehouse")
    @ApiOperation("出库单单据取消")
    @ApiLogger(apiName = "出库单单据取消", from = "ROBOT")
    public AjaxResult cancelOutWarehouse(@RequestBody ReceiptDTO receiptDTO) {
        AjaxResult ajaxResult = handleQuest("cancelOutWarehouse", new MultiProcessListener() {
            @Override
            public AjaxResult doProcess() {
                AjaxResult ajaxResult = mesService.cancelOutWarehouse(receiptDTO);
                return ajaxResult;
            }
        });
        return ajaxResult;
    }

    //private AjaxResult isNull(Header header, List<Detail> details) {
    //    AjaxResult ajaxResult = new AjaxResult();
    //    boolean isNull = outIsNull(ajaxResult, header, details);
    //    details.forEach(detail -> {
    //        if (detail.getTotalQty() == null || detail.getTotalQty().intValue() <= 0) {
    //            ajaxResult.setCode(RetCode.FAIL).setMsg("总数量不能为空!!!");
    //        }
    //    });
    //    if (isNull || StringUtils.isNotEmpty(ajaxResult.getMsg())) {
    //        return ajaxResult;
    //    }
    //    return ajaxResult;
    //}

    /**
     * 查询库存
     */
    @PostMapping("/searchInventory")
    @ApiLogger(apiName = "查询库存", from = "ROBOT")
    public AjaxResult searchInventory(@RequestBody Detail detailed) {


        //List<ShipmentHeader> shipmentHeaders = shipmentHeaderService.list(new LambdaQueryWrapper<ShipmentHeader>()
        //        .gt(ShipmentHeader::getFirstStatus, QuantityConstant.SHIPMENT_CONTAINER_BUILD)
        //        .ne(ShipmentHeader::getPushSuccessStatus, 1));
        //
        //List<ShipmentDetail> shipmentDetails = new ArrayList<>();
        //for (ShipmentHeader shipmentHeader : shipmentHeaders) {
        //    List<ShipmentDetail> details = shipmentDetailService.list(new LambdaQueryWrapper<ShipmentDetail>()
        //            .gt(ShipmentDetail::getTaskQty, 0)
        //            .eq(ShipmentDetail::getShipmentId, shipmentHeader.getId()));
        //    shipmentDetails.addAll(details);
        //}

        String materialName = detailed.getMaterialName();
        String materialCode = detailed.getMaterialCode();
        String containerCode = detailed.getContainerCode();

        LambdaQueryWrapper<InventoryDetail> lambdaQueryWrapper = Wrappers.lambdaQuery();
        // 物料编码
        if (StringUtils.isNotEmpty(materialName)) {
            lambdaQueryWrapper.eq(InventoryDetail::getMaterialName, materialName);
        }
        // 物料名称
        if (StringUtils.isNotEmpty(materialCode)) {
            lambdaQueryWrapper.eq(InventoryDetail::getMaterialCode, materialCode);
        }
        // 托盘号
        if (StringUtils.isNotEmpty(containerCode)) {
            lambdaQueryWrapper.eq(InventoryDetail::getContainerCode, containerCode);
        }

        if (StringUtils.isEmpty(materialName) && StringUtils.isEmpty(containerCode) && StringUtils.isEmpty(containerCode)) {
            lambdaQueryWrapper.gt(InventoryDetail::getQty, 0);
        }
        List<InventoryDetail> detailList = inventoryDetailService.list(lambdaQueryWrapper);

        List<InventoryVO> inventoryVOList = new ArrayList<>();
        detailList.forEach(detail -> {
            InventoryVO inventoryVO = new InventoryVO();
            BeanUtils.copyProperties(detail, inventoryVO);
            if (StringUtils.isBlank(detail.getWarehouse())) {
                inventoryVO.setWarehouse("035");
            } else {
                inventoryVO.setWarehouse(detail.getWarehouse());
            }
            inventoryVOList.add(inventoryVO);
        });

        return AjaxResult.success(inventoryVOList);

    }


    /**
     * 查询已出库部分的库存
     * 物料编码、物料名称、已出数量、仓库编码(warehouse)
     */
    @PostMapping("/queryOutboundInventory")
    @ApiLogger(apiName = "查询已出库部分的库存", from = "ROBOT")
    public AjaxResult queryOutboundInventory(@RequestBody Detail detailed) {

        // 查询符合条件的 ShipmentHeader 集合
        List<ShipmentHeader> shipmentHeaders = shipmentHeaderService.list(new LambdaQueryWrapper<ShipmentHeader>()
                .ne(ShipmentHeader::getFirstStatus, QuantityConstant.RECEIPT_HEADER_RETURN)
                .ne(ShipmentHeader::getDeleted, true));
        List<ShipmentDetail> shipmentDetailList = new ArrayList<>();
        // 查询符合条件的 ShipmentDetail 集合
        for (ShipmentHeader shipmentHeader : shipmentHeaders) {
            List<ShipmentDetail> shipmentDetails = shipmentDetailService.list(new LambdaQueryWrapper<ShipmentDetail>()
                    .ne(ShipmentDetail::getTaskQty, 0)
                    .eq(ShipmentDetail::getShipmentId, shipmentHeader.getId()));
            shipmentDetailList.addAll(shipmentDetails);
        }

        //查询符合条件的 库存交易 集合
        List<InventoryTransaction> its = new ArrayList<>();
        for (ShipmentDetail shipmentDetail : shipmentDetailList) {
            List<InventoryTransaction> inventoryTransactions = inventoryTransactionService.list(new LambdaQueryWrapper<InventoryTransaction>()
                    .eq(InventoryTransaction::getTransactionType, 20)
                    .eq(InventoryTransaction::getBillDetailId, shipmentDetail.getId()));
            if (inventoryTransactions.size() > 1) {
                // 如果查出多条数据,将taskQty字段由负数转为正数,并将taskQty的值全部累加放入第一个InventoryTransaction对象中
                InventoryTransaction firstTransaction = inventoryTransactions.get(0);
                BigDecimal totalTaskQty = BigDecimal.ZERO;
                for (int i = 1; i < inventoryTransactions.size(); i++) {
                    InventoryTransaction transaction = inventoryTransactions.get(i);
                    BigDecimal positiveTaskQty = transaction.getTaskQty().abs();
                    totalTaskQty = totalTaskQty.add(positiveTaskQty);
                }
                firstTransaction.setTaskQty(totalTaskQty);
                its.add(firstTransaction);
                //如果只有一个
            } else if (!inventoryTransactions.isEmpty()) {
                InventoryTransaction inventoryTransaction = inventoryTransactions.get(0);
                inventoryTransaction.setTaskQty(inventoryTransaction.getTaskQty().abs());
                its.add(inventoryTransaction);
            }
        }
        List<InventoryVO> inventoryVOList = new ArrayList<>();
        its.forEach(detail -> {
            InventoryVO inventoryVO = new InventoryVO();
            BeanUtils.copyProperties(detail, inventoryVO);
            if (StringUtils.isBlank(detail.getWarehouse())) {
                inventoryVO.setWarehouse("035");
            } else {
                inventoryVO.setWarehouse(detail.getWarehouse());
            }
            inventoryVOList.add(inventoryVO);
        });

        return AjaxResult.success(inventoryVOList);

    }


    /**
     * 获取出入库单明细记录
     *
     * @return AjaxResult
     */
    @PostMapping("/getShipmentDetail")
    @ApiLogger(apiName = "获取出入库单明细记录", from = "ROBOT")
    @ApiOperation("获取出入库单明细记录")
    public AjaxResult getShipmentDetail(@RequestBody GetOrderHistoryDTO getOrderHistoryDTO) {

        if (StringUtils.isEmpty(getOrderHistoryDTO.getEndTime()) || StringUtils.isEmpty(getOrderHistoryDTO.getStartTime())) {
            return AjaxResult.error("开始时间和结束时间不能为空!!!");
        }
        LambdaQueryWrapper<InventoryTransaction> lambdaQueryWrapper = Wrappers.lambdaQuery();
        lambdaQueryWrapper
                .ge(InventoryTransaction::getCreated, getOrderHistoryDTO.getStartTime())
                .le(InventoryTransaction::getCreated, getOrderHistoryDTO.getEndTime());
        List<InventoryTransaction> list = inventoryTransactionService.list(lambdaQueryWrapper);
        List<InventoryTransactionVO> inventoryTransactionVOList = new ArrayList<>();
        list.forEach(inventoryTransaction -> {
            InventoryTransactionVO inventoryTransactionVO = new InventoryTransactionVO();
            BeanUtils.copyProperties(inventoryTransaction, inventoryTransactionVO);
            inventoryTransactionVOList.add(inventoryTransactionVO);
        });
        return AjaxResult.success(inventoryTransactionVOList);
    }

    /**
     * 获取sqlServer数据库中物料信息, 同步到本地数据库中
     */
    @PostMapping("/getAllMaterial")
    @ApiOperation("获取所有外部物料信息")
    public List<Material> getAllMaterial() {
        List<Material> materialList = new ArrayList<>();
        log.error("开始同步物料信息!!!");
        final String SQL_QUERY = "SELECT\n" +
                "\ta.cinvcode AS '存货编码',\n" +
                "\ta.cinvname AS '存货名称',\n" +
                "\ta.cDefWareHouse AS '仓库',\n" +
                "\te.cWhName AS '仓库名称',\n" +
                "\ta.cComUnitCode AS '单位编码',\n" +
                "\tb.cComUnitName AS '单位名称',\n" +
                "\tc.cidefine6 AS '外形尺寸',\n" +
                "\tc.cidefine7 AS '托盘类型',\n" +
                "\ta.dModifyDate AS '修改时间',\n" +
                "\ta.dSDate AS '启用时间',\n" +
                "\ta.cinvstd AS '规格',\n" +
                "\ta.Iinvweight AS '重量',\n" +
                "\tA.CPLANMETHOD AS '属性',\n" +
                "\ta.cinvccode AS '存货类别编码',\n" +
                "\td.cInvCName AS '存货类别名称',\n" +
                "\ta.cSRPolicy AS '供需政策',\n" +
                "\tc.cidefine8 AS '是否批次',\n" +
                "\tc.cidefine9 AS '是否可燃',\n" +
                "\tc.cidefine10 AS '是否平库' \n" +
                "FROM\n" +
                "\tInventory a\n" +
                "left join ComputationUnit b on a.cComUnitCode=b.cComUnitCode\n" +
                "left join Inventory_extradefine c on a.cinvcode=c.cinvcode\n" +
                "left join InventoryClass d on a.cinvccode=d.cinvccode\n" +
                "left join Warehouse e on a.cDefWareHouse = e.cWhCode\n";
        try {
            ResultSet resultSet = SqlServer.find(SQL_QUERY);

            if (resultSet == null) {
                return materialList;
            }
            while (resultSet.next()) {
                // 字段要一致
                Material material = new Material();
                material.setWarehouseCode("CS0001");
                material.setCompanyCode("BHF");

                material.setCode(resultSet.getString("存货编码")); // 物料编码
                material.setName(resultSet.getString("存货名称")); // 物料名称
                material.setDefWareHouse(resultSet.getString("仓库")); // u8仓库
                material.setCWhName(resultSet.getString("仓库名称")); // 单位编码
                material.setUnitCode(resultSet.getString("单位编码"));
                material.setUnit(resultSet.getString("单位名称"));
                material.setPhysicalDimension(resultSet.getString("外形尺寸"));
                material.setIsHigh("高托".equals(resultSet.getString("托盘类型")) ? 1 : 0);
                material.setSpec(resultSet.getString("规格"));
                material.setWeight(resultSet.getString("重量"));
                material.setCinvccode(resultSet.getString("存货类别编码"));
                material.setCInvCName(resultSet.getString("存货类别名称"));
                material.setAttribute(resultSet.getString("属性"));
                material.setPolicy(resultSet.getString("供需政策"));
                material.setIsBatch(resultSet.getString("是否批次"));
                material.setIsFlammable(resultSet.getString("是否可燃"));
                material.setIsFlat(resultSet.getString("是否平库"));
                materialList.add(material);
            }
        } catch (SQLException e) {
            log.error("同步海王物料失败!!!" + e.getMessage());
        }
        return materialList;
    }


    /**
     * 获取sqlServer数据库中物料信息, 同步到本地数据库中
     */
    @PostMapping("/getMaterial")
    @ApiOperation("获取外部物料信息")
    public List<Material> getMaterial() {
        List<Material> materialList = new ArrayList<>();
        log.error("开始同步物料信息!!!");
        // 获取新增一天以内和修改四个小时以内的物料数据
        //DATEDIFF() 函数返回两个日期之间的天数。
        //想还原sql改动,可以用cahtgpt

        final String SQL_QUERY = "SELECT\n" +
                "\ta.cinvcode AS '存货编码',\n" +
                "\ta.cinvname AS '存货名称',\n" +
                "\ta.cDefWareHouse AS '仓库',\n" +
                "\te.cWhName AS '仓库名称',\n" +
                "\ta.cComUnitCode AS '单位编码',\n" +
                "\tb.cComUnitName AS '单位名称',\n" +
                "\tc.cidefine6 AS '外形尺寸',\n" +
                "\tc.cidefine7 AS '托盘类型',\n" +
                "\ta.dModifyDate AS '修改时间',\n" +
                "\ta.dSDate AS '启用时间',\n" +
                "\ta.cinvstd AS '规格',\n" +
                "\ta.Iinvweight AS '重量',\n" +
                "\tA.CPLANMETHOD AS '属性',\n" +
                "\ta.cinvccode AS '存货类别编码',\n" +
                "\td.cInvCName AS '存货类别名称',\n" +
                "\ta.cSRPolicy AS '供需政策',\n" +
                "\tc.cidefine8 AS '是否批次',\n" +
                "\tc.cidefine9 AS '是否可燃',\n" +
                "\tc.cidefine10 AS '是否平库' \n" +
                "FROM\n" +
                "\tInventory a\n" +
                "\tLEFT JOIN ComputationUnit b ON a.cComUnitCode = b.cComUnitCode\n" +
                "\tLEFT JOIN Inventory_extradefine c ON a.cinvcode = c.cinvcode\n" +
                "\tLEFT JOIN InventoryClass d ON a.cinvccode = d.cinvccode\n" +
                "\tLEFT JOIN Warehouse e ON a.cDefWareHouse = e.cWhCode \n" +
                "WHERE\n" +
                "\t(\n" +
                "\t\tdatediff(\n" +
                "\t\t\tDAY,\n" +
                "\t\t\ta.dSDate,\n" +
                "\t\tgetdate ()) = 0 \n" +
                "\t\tOR a.dModifyDate >= DATEADD (\n" +
                "\t\t\tHOUR,\n" +
                "\t\t\t- 4,\n" +
                "\t\tGETDATE ()) \n" +
                "\t)";


        //"\tLEFT JOIN ComputationUnit b ON a.cComUnitCode= b.cComUnitCode\n" +
        //"\tLEFT JOIN Inventory_extradefine c ON a.cinvcode= c.cinvcode\n" +
        //"\tLEFT JOIN InventoryClass d ON a.cinvccode= d.cinvccode\n" +
        //"\tLEFT JOIN Warehouse e ON a.cDefWareHouse = e.cWhCode \n" +
        //"WHERE\n" +
        //"\t(\n" +
        //"\t\tdatediff( DAY, a.dSDate, getdate( ) ) = 0 \n" +
        //"\t\tOR a.dModifyDate >= DATEADD( HOUR, - 4, GETDATE( ) ) \n" +
        //"\t) \n" +
        //"\tAND a.cDefWareHouse IN ( '035', '001', '003' )";

        try {
            ResultSet resultSet = SqlServer.find(SQL_QUERY);

            if (resultSet == null) {
                return materialList;
            }
            while (resultSet.next()) {
                // 字段要一致
                Material material = new Material();
                material.setWarehouseCode("CS0001");
                material.setCompanyCode("BHF");

                material.setCode(resultSet.getString("存货编码")); // 物料编码
                material.setName(resultSet.getString("存货名称")); // 物料名称
                material.setDefWareHouse(resultSet.getString("仓库")); // u8仓库
                material.setCWhName(resultSet.getString("仓库名称")); // 单位编码
                material.setUnitCode(resultSet.getString("单位编码"));
                material.setUnit(resultSet.getString("单位名称"));
                material.setPhysicalDimension(resultSet.getString("外形尺寸"));
                material.setIsHigh("高托".equals(resultSet.getString("托盘类型")) ? 1 : 0);
                material.setSpec(resultSet.getString("规格"));
                material.setWeight(resultSet.getString("重量"));
                material.setCinvccode(resultSet.getString("存货类别编码"));
                material.setCInvCName(resultSet.getString("存货类别名称"));
                material.setAttribute(resultSet.getString("属性"));
                material.setPolicy(resultSet.getString("供需政策"));
                material.setIsBatch(resultSet.getString("是否批次"));
                material.setIsFlammable(resultSet.getString("是否可燃"));
                material.setIsFlat(resultSet.getString("是否平库"));
                materialList.add(material);
            }
        } catch (SQLException e) {
            log.error("同步海王物料失败!!!" + e.getMessage());
        }
        return materialList;
    }

    /**
     * 当前时间向推几小时
     */
    public String dateRoll(int ihour) {
        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        // 获取当前时间
        LocalDateTime date = LocalDateTime.now();
        // 获取当前时间的前几小时时间
        LocalDateTime localDateTime = date.minusHours(ihour);

        return dateTimeFormatter.format(localDateTime);
    }

    /**
     * 查询站台任务明细列表
     */
    @ApiLogger(apiName = "查询站台任务明细列表", from = "ROBOT")
    @PostMapping("/kanbanInfo")
    @CrossOrigin
    public AjaxResult kanbanInfo(@RequestBody TaskDetail taskDetail) {
        String fromLocation = taskDetail.getFromLocation();
        if (StringUtils.isEmpty(fromLocation)) {
            return AjaxResult.error("站台不能为空!!!");
        }
        LambdaQueryWrapper<TaskDetail> wrapper = Wrappers.lambdaQuery();
        wrapper.eq(TaskDetail::getFromLocation, fromLocation)
                .lt(TaskDetail::getStatus, "100");
        List<TaskDetail> taskDetailList = taskDetailService.list(wrapper);
        return AjaxResult.success(taskDetailList);
    }

    /**
     * post调用E_Rd_In(MOM)入库成功接口
     */
    //@ApiLogger(apiName = "post调用E_Rd_In(MOM)入库接口", from="ROBOT")
    @PostMapping("/postE_Rd_In")
    public ReturnInfo postE_Rd_In(@RequestBody ReceiptDetail receiptDetail) {
        if (StringUtils.isBlank(receiptDetail.getLastUpdatedBy())) {
            receiptDetail.setLastUpdatedBy("");
        }
        User user = userService.selectUserByEmail(receiptDetail.getLastUpdatedBy());
        String loginName = "";
        if (user == null) {
            loginName = "";
        } else {
            loginName = user.getLoginName();
        }
        ReceiptHeader receiptHeader = receiptHeaderService.getById(receiptDetail.getReceiptId());
        JSONObject Rd_In_M = new JSONObject();
        Rd_In_M.put("mno", receiptHeader.getCode());
        Rd_In_M.put("MGPK", receiptHeader.getMOMID());
        Rd_In_M.put("cBusType", receiptHeader.getReceiptType());
        Rd_In_M.put("TAID", receiptHeader.getTAID());
        Rd_In_M.put("FAID", receiptHeader.getFAID());
        Rd_In_M.put("UserNo", loginName);
        Rd_In_M.put("warehouse", receiptHeader.getWarehouse());

        JSONArray jsonArray = new JSONArray();
        JSONObject Rd_In_S = new JSONObject();
        List<TaskDetail> taskDetails = taskDetailService.list(new LambdaQueryWrapper<TaskDetail>()
                .eq(TaskDetail::getInternalTaskType, 100)
                .eq(TaskDetail::getBillDetailId, receiptDetail.getId()));
        String str = computeWarehouseType(taskDetails);
        Rd_In_S.put("cidefine10", str);
        Rd_In_S.put("MGPK", receiptHeader.getMOMID());
        Rd_In_S.put("SGPK", receiptDetail.getMOMID());
        Rd_In_S.put("SNNO", receiptDetail.getSNNO());
        Rd_In_S.put("cInvCode", receiptDetail.getMaterialCode());
        Rd_In_S.put("Iquantity", receiptDetail.getTaskQty());
        Rd_In_S.put("iFQuantity", receiptDetail.getQty());
        //Rd_In_S.put("cwhcode", "");
        Rd_In_S.put("MOCode", receiptDetail.getNoticeNo());
        Rd_In_S.put("ISUrgent", receiptDetail.getIsUrgent());
        Rd_In_S.put("receiptBarcode", receiptDetail.getReceiptBarcode());
        Rd_In_S.put("warehouse", receiptHeader.getWarehouse());
        Rd_In_S.put("warehouseName", receiptHeader.getWarehouseName());
        Rd_In_S.put("creatorCode", loginName);
        Rd_In_S.put("creatorName", receiptDetail.getLastUpdatedBy());
        Rd_In_S.put("productionWorker", receiptHeader.getProductionWorker());
        Rd_In_S.put("productionWorkerName", receiptHeader.getProductionWorkerName());
        Rd_In_S.put("ifrom", receiptDetail.getIfrom());
        Rd_In_S.put("LMPKID", receiptDetail.getLMPKID());
        Rd_In_S.put("LSPKID", receiptDetail.getLSPKID());
        jsonArray.add(Rd_In_S);
        JSONObject data = new JSONObject();
        data.put("Rd_In_M", Rd_In_M);
        data.put("Rd_In_S", jsonArray);

        String action = "E_Rd_In";
        JSONObject json = new JSONObject();
        json.put("data", data);
        return postMOM(action, json, "入库回传");
    }


    /**
     * post调用E_Rd_In(MOM)其他入库成功接口(盘点入库回传)
     */
    //@ApiLogger(apiName = "post调用E_Rd_In(MOM)其他入库接口", from="ROBOT")
    @PostMapping("/postOther_E_Rd_In")
    public ReturnInfo postOther_E_Rd_In(@RequestBody List<ReceiptDetail> receiptDetails, ReceiptHeader receiptHeader) {
        OtherReceiptDomain domain = new OtherReceiptDomain();

        OtherReceiptHeader receiptHeader1 = new OtherReceiptHeader();
        receiptHeader1.setCode(receiptHeader.getCode());
        receiptHeader1.setMomId(receiptHeader.getMOMID());
        receiptHeader1.setReceiptType(receiptHeader.getReceiptType());
        receiptHeader1.setTaId(receiptHeader.getTAID());
        receiptHeader1.setFaId(receiptHeader.getFAID());
        receiptHeader1.setLastUpdatedBy(receiptHeader.getLastUpdatedBy());
        receiptHeader1.setWarehouse(receiptHeader.getWarehouse());
        receiptHeader1.setDepCode(QuantityConstant.DEFAULT_DEPT);
        receiptHeader1.setStock(receiptHeader.getWarehouse());

        List<OtherReceiptDetail> list = new ArrayList<>();
        for (ReceiptDetail receiptDetail : receiptDetails) {
            OtherReceiptDetail detail = new OtherReceiptDetail();
            List<TaskDetail> taskDetails = taskDetailService.list(new LambdaQueryWrapper<TaskDetail>()
                    .eq(TaskDetail::getInternalTaskType, 100)
                    .eq(TaskDetail::getBillDetailId, receiptDetail.getId()));
            String str = computeWarehouseType(taskDetails);
            detail.setIsFlat(str);
            detail.setMomIdByHeader(receiptHeader.getMOMID());
            detail.setMomId(receiptDetail.getMOMID());
            detail.setSnNo(receiptDetail.getSNNO());
            detail.setMaterialCode(receiptDetail.getMaterialCode());
            detail.setTaskQty(receiptDetail.getTaskQty());
            detail.setQty(receiptDetail.getQty());
            detail.setWarehouseCode(receiptHeader.getWarehouse());
            detail.setNotice(receiptDetail.getNoticeNo());
            detail.setISUrgent(receiptDetail.getIsUrgent());
            detail.setReceiptBarcode(receiptDetail.getReceiptBarcode());
            detail.setWarehouse(receiptHeader.getWarehouse());
            detail.setWarehouseName(receiptHeader.getWarehouseName());
            String lastUpdatedBy = receiptDetail.getLastUpdatedBy();
            if (StringUtils.isEmpty(lastUpdatedBy)) {
                detail.setLastUpdatedBy("");
                detail.setLastUpdatedByName("");
            } else {
                User user = userService.selectUserByEmail(lastUpdatedBy);
                String loginName;
                if (user == null) {
                    loginName = "";
                } else {
                    loginName = user.getLoginName();
                }
                detail.setLastUpdatedBy(loginName);
                detail.setLastUpdatedByName(lastUpdatedBy);
            }

            detail.setProductionWorker(receiptHeader.getProductionWorker());
            detail.setProductionWorkerName(receiptHeader.getProductionWorkerName());
            list.add(detail);
        }
        domain.setReceiptHeader(receiptHeader1);
        domain.setReceiptDetails(list);
        //返回实体
        ReturnDomain data = new ReturnDomain();
        data.setData(domain);
        String str = JSONObject.toJSONString(data);

        JSONObject jsonObject = JSONObject.parseObject(str);
        return postMOM("E_Rd_In", jsonObject, "其他入库回传");
    }

    /**
     * post调用E_Rd_In(MOM)出库成功接口
     */
    //@ApiLogger(apiName = "post调用E_Rd_Out(MOM)出库接口", from="ROBOT")
    @PostMapping("/postE_Rd_Out")
    public Boolean postE_Rd_Out(@RequestBody ShipmentHeader shipmentHeader) {
        // ShipmentHeader shipmentHeader = shipmentHeaderService.getById(shipmentHeaderID.getId());
        //StringBuffer keyField = new StringBuffer();
        JSONArray dataArray = new JSONArray();
        // 如果订单为合并类型
        if ("merge".equals(shipmentHeader.getShipmentType())) {
            // 查询所有子表
            List<ShipmentDetail> shipmentDetailList = shipmentDetailService.list(new LambdaQueryWrapper<ShipmentDetail>().eq(ShipmentDetail::getShipmentId, shipmentHeader.getId()));
            // 查询所有合并前的头表
            StringBuilder ids = new StringBuilder();
            for (ShipmentDetail shipmentDetail : shipmentDetailList) {
                ids.append(",").append(shipmentDetail.getRecordCode());
            }
            String codes = ids.substring(1, ids.length());
            String[] headerIdArr = codes.split(",");

            List<ShipmentHeader> shipmentHeaderList = new ArrayList<>();
            List<ShipmentHeaderHistory> list2 = shipmentHeaderHistoryService.list(new LambdaQueryWrapper<ShipmentHeaderHistory>().in(ShipmentHeaderHistory::getCode, headerIdArr));
            for (ShipmentHeaderHistory shipmentHeaderHistory : list2) {
                ShipmentHeader shipmentHeader1 = new ShipmentHeader();
                BeanUtils.copyProperties(shipmentHeaderHistory, shipmentHeader1);
                shipmentHeaderList.add(shipmentHeader1);
            }

            // 根据合并前的头表id分组
            Map<String, List<ShipmentDetail>> map = new HashMap<>();
            for (ShipmentDetail detail : shipmentDetailList) {
                String key = detail.getRecordCode();
                if (key != null) {
                    if (map.containsKey(key)) {
                        map.get(key).add(detail);
                    } else {
                        List<ShipmentDetail> list = new ArrayList<>();
                        list.add(detail);
                        map.put(key, list);
                    }
                }
            }

            for (String key : map.keySet()) {
                JSONObject data = new JSONObject();
                // 合并前的头表
                ShipmentHeader header = new ShipmentHeader();
                // 合并前头表对应的子表
                List<ShipmentDetail> detailList = new ArrayList<>();
                for (ShipmentHeader SH : shipmentHeaderList) {
                    if (key.equals(SH.getCode())) {
                        header = SH;
                        detailList = map.get(key);
                        break;
                    }
                }
                // 查询出库单据表头
                JSONObject Rd_Out_M = getRd_Out_M(header, shipmentHeader.getCreatedBy());
                JSONArray jsonArray = getRd_Out_S(header, detailList);
                data.put("Rd_Out_M", Rd_Out_M);
                data.put("Rd_Out_S", jsonArray);
                dataArray.add(data);
            }
        } else {
            // 查询出库单据表头
            JSONObject Rd_Out_M = getRd_Out_M(shipmentHeader, "");
            // 查询出库单据明细
            List<ShipmentDetail> shipmentDetailList = shipmentDetailService.list(new LambdaQueryWrapper<ShipmentDetail>()
                    .eq(ShipmentDetail::getShipmentId, shipmentHeader.getId()));
            JSONArray jsonArray = getRd_Out_S(shipmentHeader, shipmentDetailList);
            JSONObject data = new JSONObject();
            data.put("Rd_Out_M", Rd_Out_M);
            data.put("Rd_Out_S", jsonArray);
            dataArray.add(data);
        }

        String action = "E_Rd_Out";
        JSONObject json = new JSONObject();
        json.put("data", dataArray);
        ReturnInfo returnInfo = postMOM(action, json, "出库回传");
        if (returnInfo == null) {
            shipmentHeader.setErrorMsg("出库回传:接口地址错误或返回为空");
            shipmentHeader.setPushSuccessStatus(2);
            shipmentHeaderService.updateById(shipmentHeader);
            return false;
        }
        shipmentHeader.setPushErrorCount(shipmentHeader.getPushErrorCount() + 1);
        if (returnInfo.noError()) {
            shipmentHeader.setPushSuccessStatus(1);
            shipmentHeader.setFirstStatus(QuantityConstant.SHIPMENT_HEADER_RETURN);
            shipmentHeader.setLastStatus(QuantityConstant.SHIPMENT_HEADER_RETURN);
        } else {
            shipmentHeader.setPushSuccessStatus(2);
            shipmentHeader.setErrorMsg(returnInfo.getMsg());
        }
        shipmentHeaderService.updateById(shipmentHeader);
        return true;
    }

    public JSONArray getRd_Out_S(ShipmentHeader shipmentHeader, List<ShipmentDetail> shipmentDetailList) {
        JSONArray jsonArray = new JSONArray();
        shipmentDetailList.forEach(shipmentDetail -> {
            User user = userService.selectUserByEmail(shipmentDetail.getLastUpdatedBy());
            if (user == null) {
                user = userService.selectUserByEmail(shipmentHeader.getLastUpdatedBy());
            }
            JSONObject Rd_Out_S = new JSONObject();
            Rd_Out_S.put("MGPK", shipmentHeader.getMOMID());
            Rd_Out_S.put("SGPK", shipmentDetail.getMOMID());
            Rd_Out_S.put("SNNO", shipmentDetail.getSNNO());
            Rd_Out_S.put("cInvCode", shipmentDetail.getMaterialCode());
            // 实际入库数量
            Rd_Out_S.put("Iquantity", shipmentDetail.getTaskQty());
            // MOM传入的入库数量
            Rd_Out_S.put("iFQuantity", shipmentDetail.getQty());
            //Rd_Out_S.put("cwhcode", "035");
            List<TaskDetail> taskDetails = taskDetailService.list(new LambdaQueryWrapper<TaskDetail>()
                    .eq(TaskDetail::getInternalTaskType, 200)
                    .eq(TaskDetail::getBillDetailId, shipmentDetail.getId()));
            String str = computeWarehouseType(taskDetails);
            Rd_Out_S.put("cidefine10", str);
            Rd_Out_S.put("MOCode", shipmentDetail.getNoticeNo());
            Rd_Out_S.put("ISUrgent", shipmentDetail.getIsUrgent());
            Rd_Out_S.put("updatedByNo", user.getLoginName());
            Rd_Out_S.put("updatedBy", shipmentDetail.getLastUpdatedBy());
            Rd_Out_S.put("warehouse", shipmentHeader.getWarehouse());
            Rd_Out_S.put("warehouseName", shipmentHeader.getWarehouseName());
            Rd_Out_S.put("creatorCode", shipmentHeader.getCreatorCode());
            Rd_Out_S.put("creatorName", shipmentHeader.getCreatorName());
//            Rd_Out_S.put("requestedStartDate", shipmentHeader.getRequestedStartDate());
            Rd_Out_S.put("ifrom", shipmentDetail.getIfrom());
            Rd_Out_S.put("LMPKID", shipmentDetail.getLMPKID());
            Rd_Out_S.put("LSPKID", shipmentDetail.getLSPKID());
            jsonArray.add(Rd_Out_S);
        });
        return jsonArray;
    }


    public String computeWarehouseType(List<TaskDetail> taskDetails) {
        String str;
        if (taskDetails.isEmpty()) {
            return "错误:未查询到任务!";
        }
        int flatCount = 0;
        int uprightCount = 0;
        BigDecimal flatQty = BigDecimal.ZERO;
        BigDecimal uprightQty = BigDecimal.ZERO;

        for (TaskDetail taskDetail : taskDetails) {
            if (taskDetail.getFlat() != null && taskDetail.getFlat() == 1) {
                flatCount++;
                flatQty = flatQty.add(taskDetail.getQty());

            } else {
                uprightCount++;
                uprightQty = uprightQty.add(taskDetail.getQty());
            }
        }
        if (flatCount > 0 && uprightCount == 0) {
            str = "平库";
        } else if (uprightCount > 0 && flatCount == 0) {
            str = "立库";
        } else if (flatCount > 0 && uprightCount > 0) {
            // 移除.0或.00后缀
            String flatQtyStr = flatQty.stripTrailingZeros().toPlainString();
            String uprightQtyStr = uprightQty.stripTrailingZeros().toPlainString();
            str = "平库" + flatQtyStr + "/" + "立库" + uprightQtyStr;
        } else {
            str = "未知错误";
        }
        return str;
    }

    public JSONObject getRd_Out_M(@RequestBody ShipmentHeader shipmentHeader, String name) {
        User user = userService.selectUserByEmail(shipmentHeader.getLastUpdatedBy());
        JSONObject Rd_Out_M = new JSONObject();
        Rd_Out_M.put("ISMOM", shipmentHeader.getISMOM());
        Rd_Out_M.put("mno", shipmentHeader.getCode());
        Rd_Out_M.put("MGPK", shipmentHeader.getMOMID());
        Rd_Out_M.put("cBusType", shipmentHeader.getShipmentType());
        Rd_Out_M.put("TAID", shipmentHeader.getTAID());
        Rd_Out_M.put("FAID", shipmentHeader.getFAID());
        if (user == null) {
            String UserNo = userService.selectUserByEmail(name).getLoginName();
            Rd_Out_M.put("UserNo", UserNo);
        } else {
            Rd_Out_M.put("UserNo", user.getLoginName());
        }
        Rd_Out_M.put("warehouse", shipmentHeader.getWarehouse());//仓库编码
        Rd_Out_M.put("cDepCode", "01030101");//部门编码
        //Rd_Out_M.put("cWhCode", shipmentHeader.getWarehouse());//仓库编码
        return Rd_Out_M;
    }

    /**
     * utf-8 转 GB2312
     */
    public String getGB(String action) {
        byte[] Rd_Out; //中间用ISO-8859-1过渡
        String data = null;
        try {
            Rd_Out = action.getBytes("8859_1");
            data = new String(Rd_Out, "GB2312"); //转换成GB2312字符
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        return data;
    }


    /**
     * @param action  MOM行为
     * @param JObject 行为参数
     * @return
     */
    public ReturnInfo postMOM(String action, JSONObject JObject, String apiName) {
        String url = addressService.selectAddress(QuantityConstant.MOM);
        return CallaMOM.getMsg(action, JObject, apiName, url);
    }


    /**
     * 蓝牙打印入库物料明细
     */
    //@RequiresPermissions("receipt:receiptDetail:printList")
    //@Log(title = "入库-入库单明细管理", operating = "查看入库单明细", action = BusinessType.GRANT)
    @PostMapping("/receipt/printList")
    //@ApiLogger(apiName = "蓝牙打印入库物料明细", from = "PDA")
    @ResponseBody
    public AjaxResult receiptPrintList(@RequestBody ReceiptPrint receiptPrint) {

        if (receiptPrint == null) {
            return AjaxResult.error("参数为空");
        }
        String code = receiptPrint.getCode();
        String sn = receiptPrint.getSn();
        if (StringUtils.isEmpty(code) && StringUtils.isEmpty(sn)) {
            return AjaxResult.error("条码和入库单号不能同时为空");
        }
        if (StringUtils.isNotEmpty(code) && StringUtils.isNotEmpty(sn)) {
            return AjaxResult.error("条码和入库单号不能同时有值" + ",条码:" + sn + ",入库单号:" + code);
        }


        if (StringUtils.isNotEmpty(code)) {
            List<ReceiptDetail> receiptDetails = receiptDetailService.list(new LambdaQueryWrapper<ReceiptDetail>().eq(ReceiptDetail::getReceiptCode, code));
            if (!receiptDetails.isEmpty()) {
                for (ReceiptDetail receiptDetail : receiptDetails) {
                    ReceiptHeader receiptHeader = receiptHeaderService.getById(receiptDetail.getReceiptId());
                    receiptDetail.setWarehouse(receiptHeader.getWarehouse());
                    receiptDetail.setWarehouseName(receiptHeader.getWarehouseName());
                }
                return AjaxResult.success(receiptDetails);
            }
        }


        if (StringUtils.isNotEmpty(sn)) {
            ReceiptDetail snReceiptDetail = receiptDetailService.getOne(new LambdaQueryWrapper<ReceiptDetail>().eq(ReceiptDetail::getSNNO, sn));
            if (snReceiptDetail != null) {
                List<ReceiptDetail> receiptDetails = receiptDetailService.list(new LambdaQueryWrapper<ReceiptDetail>().eq(ReceiptDetail::getReceiptCode, snReceiptDetail.getReceiptCode()));
                if (!receiptDetails.isEmpty()) {
                    for (ReceiptDetail receiptDetail : receiptDetails) {
                        ReceiptHeader receiptHeader = receiptHeaderService.getById(receiptDetail.getReceiptId());
                        receiptDetail.setWarehouse(receiptHeader.getWarehouse());
                        receiptDetail.setWarehouseName(receiptHeader.getWarehouseName());
                    }
                    return AjaxResult.success(receiptDetails);
                }
            }
        }


        if (StringUtils.isNotEmpty(code)) {
            List<ReceiptDetailHistory> receiptDetails = receiptDetailHistoryService.list(new LambdaQueryWrapper<ReceiptDetailHistory>().eq(ReceiptDetailHistory::getReceiptCode, code));
            if (!receiptDetails.isEmpty()) {
                for (ReceiptDetailHistory receiptDetail : receiptDetails) {
                    ReceiptHeaderHistory receiptHeader = receiptHeaderHistoryService.getById(receiptDetail.getReceiptId());
                    receiptDetail.setWarehouse(receiptHeader.getWarehouse());
                    receiptDetail.setWarehouseName(receiptHeader.getWarehouseName());
                }
                return AjaxResult.success(receiptDetails);
            }
        }


        if (StringUtils.isNotEmpty(sn)) {
            ReceiptDetailHistory snReceiptDetail = receiptDetailHistoryService.getOne(new LambdaQueryWrapper<ReceiptDetailHistory>().eq(ReceiptDetailHistory::getSNNO, sn));
            if (snReceiptDetail != null) {
                List<ReceiptDetailHistory> receiptDetails = receiptDetailHistoryService.list(new LambdaQueryWrapper<ReceiptDetailHistory>().eq(ReceiptDetailHistory::getReceiptCode, snReceiptDetail.getReceiptCode()));
                if (!receiptDetails.isEmpty()) {
                    for (ReceiptDetailHistory receiptDetail : receiptDetails) {
                        ReceiptHeader receiptHeader = receiptHeaderService.getById(receiptDetail.getReceiptId());
                        receiptDetail.setWarehouse(receiptHeader.getWarehouse());
                        receiptDetail.setWarehouseName(receiptHeader.getWarehouseName());
                    }
                    return AjaxResult.success(receiptDetails);
                }
            }
        }

        return AjaxResult.error("没有查询到数据");
    }


    /**
     * 蓝牙打印出库物料明细
     */
    @PostMapping("/shipment/printList")
    @ResponseBody
    public AjaxResult shipmentPrintList(String code) {
        if (StringUtils.isEmpty(code)) {
            return AjaxResult.error("code为空");
        }
        List<ShipmentDetail> list = shipmentDetailService.list(new LambdaQueryWrapper<ShipmentDetail>().eq(ShipmentDetail::getShipmentCode, code));
        if (!list.isEmpty()) {
            for (ShipmentDetail shipmentDetail : list) {
                ShipmentHeader shipmentHeader = shipmentHeaderService.getById(shipmentDetail.getShipmentId());
                shipmentDetail.setWarehouse(shipmentHeader.getWarehouse());
                shipmentDetail.setWarehouseName(shipmentHeader.getWarehouseName());
            }
            return AjaxResult.success(list);
        }

        List<ShipmentDetailHistory> list2 = shipmentDetailHistoryService.list(new LambdaQueryWrapper<ShipmentDetailHistory>().eq(ShipmentDetailHistory::getShipmentCode, code));
        if (!list2.isEmpty()) {
            for (ShipmentDetailHistory shipmentDetail : list2) {
                ShipmentHeaderHistory shipmentHeader = shipmentHeaderHistoryService.getById(shipmentDetail.getShipmentId());
                shipmentDetail.setWarehouse(shipmentHeader.getWarehouse());
                shipmentDetail.setWarehouseName(shipmentHeader.getWarehouseName());
            }
            return AjaxResult.success(list);
        }
        return AjaxResult.error("没有查询到数据");
    }

}