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.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.receiptHeader.domain.ReceiptHeader;
import com.huaheng.pc.receipt.receiptHeader.service.ReceiptHeaderService;
import com.huaheng.pc.shipment.shipmentDetail.domain.ShipmentDetail;
import com.huaheng.pc.shipment.shipmentDetail.service.ShipmentDetailService;
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 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.sql.ResultSet;
import java.sql.SQLException;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.*;


@RestController
@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 InventoryTransactionService inventoryTransactionService;

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

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

    @Resource
    private AddressService addressService;

    private static Logger logger = LoggerFactory.getLogger(ReflectUtils.class);

    @PostMapping("/receipt")
    @ApiLogger(apiName = "添加入库单及其明细", from = "ROBOT")
    @ApiOperation("添加入库单及其明细")
    public AjaxResult receipt(@RequestBody ReceiptDTO receiptDTO) {
        AjaxResult ajaxResult = handleQuest("receipt", new MultiProcessListener() {
            @Override
            public AjaxResult doProcess() {
                AjaxResult ajaxResult = mesService.receipt(receiptDTO);
                return ajaxResult;
            }
        });
        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() {
                AjaxResult ajaxResult = mesService.shipment(receiptDTO);
                return ajaxResult;
            }
        });
        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")
    @ApiOperation("查询库存")
    public AjaxResult searchInventory(@RequestBody Detail detailed) {

        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);
            inventoryVO.setWarehouse("035");
            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("/getMaterial")
    @ApiOperation("获取外部物料信息")
    public List<Material> getMaterial() {
        List<Material> materialList = new ArrayList<>();
        try {
            // String sql = "SELECT * FROM [dbo].[sys_user] WHERE createTime > (select DATEADD(HOUR,-3,getdate())) AND createTime <= (select GETDATE())";
            // String sql = "SELECT * FROM [dbo].[base_material]  WHERE MaterialName = 'SMLS Pipe'";
            // 获取新增一天以内和修改两个小时以内的物料数据
            //String sql = "select a.cInvCode, a.cInvName, b.cidefine6, b.cidefine7, c.cComUnitName from [dbo].[Inventory] a left join [dbo].[Inventory_extradefine] b on a.cInvCode = b.cInvCode LEFT JOIN [dbo].[ComputationUnit] c ON a.cComUnitCode = c.cComunitCode WHERE (datediff(day,a.dSDate,getdate())=0 OR a.dModifyDate >=  DATEADD(HOUR, -4, GETDATE()))  and  a.cDefWareHouse in ('035','003')";

            //DATEDIFF() 函数返回两个日期之间的天数。

            String sql = "SELECT\n" +
                    "\ta.cinvcode,\n" +
                    "\ta.cinvname,\n" +
                    "\ta.cDefWareHouse,\n" +
                    "\ta.cComUnitCode,\n" +
                    "\tb.cComUnitName,\n" +
                    "\tc.cidefine6,\n" +
                    "\tc.cidefine7,\n" +
                    "\ta.dModifyDate,\n" +
                    "\ta.dSDate,\n" +
                    "\ta.cinvstd,\n" +
                    "\ta.Iinvweight,\n" +
                    "\ta.cinvccode,\n" +
                    "\td.cInvCName\n" +
                    "FROM\n" +
                    "\t[dbo].[Inventory] a\n" +
                    "\tLEFT JOIN [dbo].[ComputationUnit] b  ON a.cComUnitCode= b.cComUnitCode\n" +
                    "\tLEFT JOIN [dbo].[Inventory_extradefine] c ON a.cinvcode= c.cinvcode\n" +
                    "\tLEFT JOIN [dbo].[InventoryClass] d on a.cinvccode= d.cinvccode \n" +
                    "WHERE ( datediff( DAY, a.dSDate, getdate( ) ) = 0 OR a.dModifyDate >= DATEADD( HOUR, - 4, GETDATE( ) ) ) \n" +
                    "\tAND a.cDefWareHouse IN ( '035', '003' ,'001')";

            ResultSet resultSet = SqlServer.find(sql);
            if (resultSet == null) {
                return materialList;
            }
            while (resultSet.next()) {
                // 字段要与海王表一致
                String code = resultSet.getString("cInvCode");//物料编码
                String name = resultSet.getString("cInvName");//物料名称
                String unitName = resultSet.getString("cComUnitName");//单位名称
                String physicalDimension = resultSet.getString("cidefine6");//外形尺寸
                String high = resultSet.getString("cidefine7");//托盘类型

                String defWareHouse = resultSet.getString("cDefWareHouse");//u8仓库
                String unitCode = resultSet.getString("cComUnitCode");//单位编码
                //String modifyDate = resultSet.getString("dModifyDate");//修改时间
                //String startDate = resultSet.getString("dSDate");//启用时间
                String spec = resultSet.getString("cinvstd");//规格
                String weight = resultSet.getString("Iinvweight");//重量cinvccode
                String cinvccode = resultSet.getString("cinvccode");//存货类别编码
                String cInvCName = resultSet.getString("cInvCName");//存货类别名称
                int isHigh = "高托".equals(high) ? 1 : 0;

                Material material = new Material();
                material.setCode(code);
                material.setName(name);
                material.setUnit(unitName);
                material.setSpec(spec);
                material.setIsHigh(isHigh);
                material.setWarehouseCode("CS0001");
                material.setCompanyCode("BHF");

                material.setPhysicalDimension(physicalDimension);
                material.setDefWareHouse(defWareHouse);
                material.setUnitCode(unitCode);
                //material.setModifyDate();
                //material.setStartDate();
                material.setWeight(weight);
                material.setCinvccode(cinvccode);
                material.setCInvCName(cInvCName);
                materialList.add(material);
            }
            // materialService.saveBatch(materialList);
        } catch (SQLException throwable) {
            throwable.printStackTrace();
        }
        logger.debug("******************************同步海王物料档案" + materialList.size() + "条数据!!!");
        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) {
        User user = userService.selectUserByEmail(receiptDetail.getLastUpdatedBy());
        ReceiptHeader receiptHeader = receiptHeaderService.getById(receiptDetail.getReceiptId()); //59
        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", user.getLoginName());
        Rd_In_M.put("warehouse", receiptHeader.getWarehouse());

        JSONArray jsonArray = new JSONArray();
        JSONObject Rd_In_S = new JSONObject();
        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", "035");
        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", user.getLoginName());
        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(QuantityConstant.DEFAULT_STOCK);

        List<OtherReceiptDetail> list = new ArrayList<>();
        for (ReceiptDetail receiptDetail : receiptDetails) {
            OtherReceiptDetail detail = new OtherReceiptDetail();
            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(receiptDetail.getWarehouseCode());
            detail.setNotice(receiptDetail.getNoticeNo());
            detail.setISUrgent(receiptDetail.getIsUrgent());
            detail.setReceiptBarcode(receiptDetail.getReceiptBarcode());
            detail.setWarehouse(receiptHeader.getWarehouse());
            detail.setWarehouseName(receiptHeader.getWarehouseName());
            detail.setLastUpdatedBy(receiptDetail.getLastUpdatedBy());
            detail.setLastUpdatedByName(receiptDetail.getLastUpdatedByName());
            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);
                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.hasError()) {
            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());
            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");
            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 JSONObject getRd_Out_M(@RequestBody ShipmentHeader shipmentHeader) {
        User user = userService.selectUserByEmail(shipmentHeader.getLastUpdatedBy());
        JSONObject Rd_Out_M = new JSONObject();
        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());
        Rd_Out_M.put("UserNo", user.getLoginName());
        Rd_Out_M.put("warehouse", "035");
        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);
    }


}