package com.sunda.spmsoversea.service.impl;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.sunda.spmscommon.ResponseResult;
import com.sunda.spmscommon.entity.ZSapOrgClient;
import com.sunda.spmscommon.feign.IFeignServiceCommon;
import com.sunda.spmscommon.mapper.ZSapOrgClientMapper;
import com.sunda.spmsoversea.entity.*;
import com.sunda.spmsoversea.enums.OverseaDnEnum;
import com.sunda.spmsoversea.service.*;
import feign.FeignException;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.transaction.interceptor.TransactionAspectSupport;

import java.text.SimpleDateFormat;
import java.util.*;
import java.util.stream.Collectors;

import static com.sunda.spmsoversea.constant.OverseaLogConstant.SAP;
import static com.sunda.spmsoversea.constant.SapConstant.*;
import static com.sunda.spmsoversea.enums.OverseaDeliveryNoteEnum.OVERSEA_DN_WAITING;
import static com.sunda.spmsoversea.enums.OverseaDnEnum.DN_DELETE;
import static com.sunda.spmsoversea.enums.OverseaDnEnum.DN_UPDATE;
import static com.sunda.spmsoversea.enums.OverseaDnEnum.DN_WAITING;
import static com.sunda.spmsoversea.enums.OverseaPackageListEnum.OVERSEA_PL_WAITING;

/**
 * @program: spms
 * @description:
 * @author: Wayne Wu
 * @create: 2021-10-22 16:31
 **/
@Service
@Slf4j
public class DataFromSapServiceImpl implements IDataFromSapService {

    /** 海外收货交货单，一般海运收货 */
    @Autowired
    IOverseaDeliveryNoteService iOverseaDeliveryNoteService;
    @Autowired
    IOverseaDeliveryNoteDtlService iOverseaDeliveryNoteDtlService;
    @Autowired
    IOverseaPackageListService iOverseaPackageListService;
    @Autowired
    IOverseaPackageListDtlService iOverseaPackageListDtlService;
    @Autowired
    IOverseaPackageListBoxService iOverseaPackageListBoxService;
    @Autowired
    IOverseaOperateLogService iOverseaOperateLogService;
    @Autowired
    IFeignServiceCommon iFeignServiceCommon;
    @Autowired
    IFormatDataToSapService iFormatDataToSapService;

    /** 海外收货交货单，空运人带/转储/本地采购收货 */
    @Autowired
    IOverseaDnService iOverseaDnService;
    @Autowired
    IOverseaDnDtlService iOverseaDnDtlService;
    @Autowired
    IOverseaPurchaseOrderService iOverseaPurchaseOrderService;
    @Autowired
    IOverseaPurchaseOrderDtlService iOverseaPurchaseOrderDtlService;

    @Autowired
    ZSapOrgClientMapper zSapOrgClientMapper;

    @Value("${zxd.sap.client}")
    private String zxdSapClient;

    private static final SimpleDateFormat SDF = new SimpleDateFormat("yyyyMMdd");
    
    /** 海外收货交货单，一般海运收货 */
    @Override
    public synchronized ResponseResult updateDeliveryNoteRest(String sapPackageList, String deliveryDate, String userId,String werks) {
        try {
            if (StringUtils.isEmpty(sapPackageList) && StringUtils.isEmpty(deliveryDate)){
                return ResponseResult.error("请求参数不能为空");
            }
            JSONObject dataToSap = formatData(sapPackageList, deliveryDate,werks);
            JSONObject message = JSONObject.parseObject(iFeignServiceCommon.sendRestToSapCommon(dataToSap));
            log.info("\n=====dataToSap======\n" + dataToSap + "\n=====sapReturnedMessage======\n" + message);
            JSONObject returnData = message.getJSONObject("RESPONSE").getJSONObject("RETURN_DATA");
            if (SAP_SUCCESS.equals(returnData.getJSONObject("ES_RETURN").getString("TYPE"))){
                /** IT_LIPS —— 交货单明细表 */
                JSONArray ET_DN = returnData.getJSONArray("ET_DN");
                if (ET_DN != null){
                    int arraySize = ET_DN.size();
                    if (arraySize > 0){
                        Map<String,JSONObject> headMap = new HashMap();
                        Map<String,JSONObject> noteMap = new HashMap();
                        /** ET_REL —— 装箱单关系表 */
                        JSONArray ET_REL = returnData.getJSONArray("ET_REL");
                        if (ET_REL != null){
                            int zxdSize = ET_REL.size();
                            if (zxdSize > 0){
                                /** 装箱单信息表 */
                                for (int i = 0; i < zxdSize; i ++){
                                    JSONObject doc = ET_REL.getJSONObject(i);
                                    String XDNUM = doc.getString("XDNUM");//装箱单号
                                    String ZDECABNO = doc.getString("ZDECABNO");//柜号
                                    String VBELN = doc.getString("VBELN");//交货单号
                                    String POSNR = doc.getString("POSNR");//交货单行号
                                    String EBELN = doc.getString("EBELN");//采购订单号
                                    String EBELP = doc.getString("EBELP");//采购订单行号
                                    String MANDT1 = doc.getString("MANDT1");//DN客户端
                                    String MANDT2 = doc.getString("MANDT2");//PO客户端
                                    JSONObject deliveryNoteInfo = new JSONObject();
                                    deliveryNoteInfo.put("XDNUM", XDNUM);
                                    deliveryNoteInfo.put("ZDECABNO", ZDECABNO);
                                    deliveryNoteInfo.put("MANDT1", MANDT1);
                                    deliveryNoteInfo.put("MANDT2", MANDT2);
                                    deliveryNoteInfo.put("EBELN", EBELN);
                                    deliveryNoteInfo.put("EBELP", EBELP);
                                    headMap.put(VBELN, deliveryNoteInfo);
                                    noteMap.put(VBELN+"_"+POSNR, deliveryNoteInfo);
                                    OverseaPackageList overseaPackageList = new OverseaPackageList();
                                    overseaPackageList.setSapPackageList(doc.getString("XDNUM"));//装箱单号
                                    //overseaPackageList.setMerchandiser(doc.getString("MERCH"));//跟单员
                                    //overseaPackageList.setCabinetModel(doc.getString("MAGRV"));//柜型
                                    //overseaPackageList.setFromPort(doc.getString("SPORT"));//起运港
                                    //overseaPackageList.setToPort(doc.getString("EPORT"));//目的港
                                    overseaPackageList.setDataStatus(DATA_STATUS_0);

                                    QueryWrapper<OverseaPackageList> queryWrapper =
                                            new QueryWrapper<OverseaPackageList>().eq("SAP_PACKAGE_LIST", XDNUM);
                                    OverseaPackageList overseaPackageList1 = iOverseaPackageListService.getOne(queryWrapper);
                                    if (overseaPackageList1 != null){
                                        if (DATA_STATUS_0.equals(overseaPackageList1.getDataStatus())){
                                            iOverseaPackageListService.update(overseaPackageList, queryWrapper);
                                        } else {
                                            log.info("=======装箱单" + XDNUM + "已经在收货中更新失败========");
                                        }
                                    } else {
                                        overseaPackageList.setUuidPackageList(getUuid());

                                        iOverseaPackageListService.save(overseaPackageList);
                                        iOverseaOperateLogService.addOverseaOperateLog(userId, XDNUM, OVERSEA_PL_WAITING.getDescZh(), OVERSEA_PL_WAITING.getDescEn(), SAP, OVERSEA_PL_WAITING.getDescRu());
                                    }
                                }



                                //装箱单明细和交货单明细关系表
                                /** 根据SAP返回装箱单明细和交货单明细关系表信息，获取第一行明细里的 装箱单号，根据 装箱单号 先删除该装箱单所有明细行数据，再新建明细数据； */
                                Set<String> packageListSet = new HashSet<>();
                                for (int i = 0; i < zxdSize; i ++){
//                                    String XDNUM = ET_REL.getJSONObject(i).getString("XDNUM");
                                    String VBELN = ET_REL.getJSONObject(i).getString("VBELN");
                                    if (StringUtils.isNotEmpty(VBELN)){
                                        packageListSet.add(VBELN);
                                    }
                                }
                                QueryWrapper<OverseaPackageListDtl> packageListDtlQueryWrapper =
                                        new QueryWrapper<OverseaPackageListDtl>().eq("SAP_PACKAGE_LIST", sapPackageList).in("SAP_DELIVERY_NOTE", packageListSet).eq("DATA_STATUS", "0");
                                iOverseaPackageListDtlService.remove(packageListDtlQueryWrapper);

                                for (int i = 0; i < zxdSize; i ++){
                                    JSONObject doc = ET_REL.getJSONObject(i);
                                    String XDNUM = doc.getString("XDNUM");
                                    String sapPackageListItem = String.valueOf(doc.getInteger("POSNR"));
                                    String sapDeliveryNoteItem = String.valueOf(doc.getInteger("POSNR"));//交货单行号
                                    String boxNoteItem = String.valueOf(doc.getInteger("SERIAL"));
                                    String boxNote = doc.getString("BOX_CODE");

                                    OverseaPackageListDtl overseaPackageListDtl = new OverseaPackageListDtl();
                                    overseaPackageListDtl.setSapPackageList(XDNUM);
                                    overseaPackageListDtl.setSapPackageListItem(sapPackageListItem);//装箱单行号
                                    overseaPackageListDtl.setSapDeliveryNote(doc.getString("VBELN"));//交货单号
                                    overseaPackageListDtl.setSapDeliveryNoteItem(sapDeliveryNoteItem); // 交货单行号
                                    overseaPackageListDtl.setPurchaseNo(doc.getString("EBELN"));//公司间采购订单号
                                    overseaPackageListDtl.setBoxNoteItem(boxNoteItem);// 箱码序号
                                    overseaPackageListDtl.setPurchaseNoItem(String.valueOf(doc.getInteger("EBELP")));//公司间采购订单行项目
                                    overseaPackageListDtl.setDataStatus(DATA_STATUS_0);
                                    overseaPackageListDtl.setBoxNote(boxNote); // 箱码

                                    QueryWrapper<OverseaPackageListDtl> queryWrapper = new QueryWrapper<OverseaPackageListDtl>()
                                            .eq("SAP_PACKAGE_LIST", XDNUM).eq("SAP_PACKAGE_LIST_ITEM", sapPackageListItem).eq("SAP_DELIVERY_NOTE", doc.getString("VBELN"))
                                            .eq("SAP_DELIVERY_NOTE_ITEM", sapDeliveryNoteItem).eq("BOX_NOTE", boxNote).eq("BOX_NOTE_ITEM", boxNoteItem);
                                    OverseaPackageListDtl overseaPackageListDtl1 = iOverseaPackageListDtlService.getOne(queryWrapper);
                                    if (overseaPackageListDtl1 != null){
                                        if (DATA_STATUS_0.equals(overseaPackageListDtl1.getDataStatus())){
                                            iOverseaPackageListDtlService.update(overseaPackageListDtl, queryWrapper);
                                        } else {
                                            log.info("=======装箱单" + XDNUM + " 行号" + sapPackageListItem + "已经在收货中更新失败========");
                                        }
                                    } else {
                                        iOverseaPackageListDtlService.save(overseaPackageListDtl);
                                    }
                                }



                                //装箱单明细箱码明细关系表
                                /** 根据SAP返回 装箱单明细箱码明细关系表 信息，获取第一行明细里的 装箱单号，根据 装箱单号 先删除该装箱单所有明细行数据，再新建明细数据； */
                                Set<String> packageListBoxNote = new HashSet<>();
                                for (int i = 0; i < zxdSize; i ++){
//                                    String XDNUM = ET_REL.getJSONObject(i).getString("XDNUM");
                                	String VBELN = ET_REL.getJSONObject(i).getString("VBELN");
                                    if (StringUtils.isNotEmpty(VBELN)){
                                        packageListBoxNote.add(VBELN);
                                    }
                                }
                                QueryWrapper<OverseaPackageListBox> packageListBoxQueryWrapper =
                                        new QueryWrapper<OverseaPackageListBox>().eq("SAP_PACKAGE_LIST", sapPackageList) .in("SAP_DELIVERY_NOTE", packageListBoxNote).eq("DATA_STATUS", "0");
                                iOverseaPackageListBoxService.remove(packageListBoxQueryWrapper);

                                for (int i = 0; i < zxdSize; i ++){
                                    JSONObject doc = ET_REL.getJSONObject(i);

                                    String XDNUM = doc.getString("XDNUM");
                                    String sapPackageListItem = String.valueOf(doc.getInteger("POSNR"));
                                    String boxNote = doc.getString("BOX_CODE");
                                    String sapDeliveryNote = doc.getString("VBELN");
                                    String boxNoteItem = String.valueOf(doc.getInteger("SERIAL"));

                                    OverseaPackageListBox overseaPackageListBox = new OverseaPackageListBox();
                                    overseaPackageListBox.setSapPackageList(XDNUM);
                                    overseaPackageListBox.setSapPackageListItem(sapPackageListItem);//装箱单行号
                                    overseaPackageListBox.setBoxNote(boxNote);//箱码
                                    overseaPackageListBox.setBoxNoteItem(boxNoteItem);//BOX_NOTE_ITEM
                                    overseaPackageListBox.setMaterialNo(String.valueOf(Long.parseLong(doc.getString("MATNR"))));//
                                    overseaPackageListBox.setReceivableQtyBasicUnit(doc.getDoubleValue("GNCKSL"));//基本单位发货数量
                                    overseaPackageListBox.setBasicUnit(doc.getString("MEINS"));//基本单位
                                    overseaPackageListBox.setBoxStatus("0");
                                    overseaPackageListBox.setDataStatus(DATA_STATUS_0);
                                    overseaPackageListBox.setDemandNo(doc.getString("DEMAND_NO"));//需求来源号
                                    overseaPackageListBox.setDemandItem(String.valueOf(doc.get("DEMAND_POSNR")));//需求来源行号
                                    overseaPackageListBox.setDemander(doc.getString("DEMANDER"));//需求申请人
                                    overseaPackageListBox.setSapDeliveryNote(sapDeliveryNote);

                                    QueryWrapper<OverseaPackageListBox> queryWrapper = new QueryWrapper<OverseaPackageListBox>()
                                            .eq("BOX_NOTE", boxNote).eq("BOX_NOTE_ITEM", boxNoteItem).eq("SAP_PACKAGE_LIST", XDNUM)
                                            .eq("SAP_DELIVERY_NOTE", sapDeliveryNote);
                                    OverseaPackageListBox overseaPackageListBox1 = iOverseaPackageListBoxService.getOne(queryWrapper);
                                    if (overseaPackageListBox1 != null){
                                        if (DATA_STATUS_0.equals(overseaPackageListBox1.getDataStatus())){
                                            iOverseaPackageListBoxService.update(overseaPackageListBox, queryWrapper);
                                        } else {
                                            log.info("=======装箱单" + XDNUM + " 行号" + sapPackageListItem + "，箱码" + boxNote + " 箱码行号" + boxNoteItem + "已经在收货中更新失败========");
                                        }
                                    } else {
                                        iOverseaPackageListBoxService.save(overseaPackageListBox);
                                    }
                                }
                            }

//                            装箱单号		    XDNUM
//                            装箱单行号		ZPOSNR
//                            柜号		        ZDECABNO
//                            Client标识		MANDT
//                            交货单号		    VBELN
//                            交货单行号		POSNR
//                            Client标识		MANDT
//                            采购订单号		EBELN
//                            采购订单行号		EBELP
//                            箱码		        PACKAGE_CODE
//                            序号		        SERIAL
//                            物料		        MATNR
//                            需求来源号		DEMAND_NO
//                            需求来源行号		DEMAND_POSNR
//                            需求人		    DEMANDER
//                            出库数量		    GNCKSL
//                            单位		        MEINS
//                            业务标识返回		BUS_SIGN
//                            Client标识		MANDT

                        }


                        /** 根据SAP返回交货单明细信息，获取第一行明细里的 交货单号，根据 交货单号 先删除该交货单所有明细行数据，再新建明细数据； */
                        Set<String> dnSet = new HashSet<>();
                        for (int i = 0; i < arraySize; i ++){
                            String dn = ET_DN.getJSONObject(i).getString("VBELN");
                            if (StringUtils.isNotEmpty(dn)){
                                dnSet.add(dn);
                            }
                        }
                        QueryWrapper<OverseaDeliveryNoteDtl> deliveryNoteDtlQueryWrapper =
                                new QueryWrapper<OverseaDeliveryNoteDtl>().in("SAP_DELIVERY_NOTE", dnSet).eq("WERKS_RECEIVE", werks).eq("DATA_STATUS", "0");
                        iOverseaDeliveryNoteDtlService.remove(deliveryNoteDtlQueryWrapper);

                        for (int i = 0; i < arraySize; i ++){
                            JSONObject doc = ET_DN.getJSONObject(i);
                            String sapDeliveryNote = doc.getString("VBELN");
                            String sapDeliveryNoteItem = String.valueOf(doc.getInteger("POSNR"));//交货单行号
                            String WERKS_V = doc.getString("WERKS_V");//发货工厂
                            String WERKS = doc.getString("WERKS");//收货工厂
                            String MANDT = doc.getString("MANDT");//收货工厂

                            if(headMap.get(sapDeliveryNote)!=null){//存在装箱单与交货单的关系
                                JSONObject deliveryNoteInfo = headMap.get(sapDeliveryNote);
                                deliveryNoteInfo.put("WERKS_V", WERKS_V);
                                deliveryNoteInfo.put("WERKS", WERKS);
                                deliveryNoteInfo.put("VBELN", sapDeliveryNote);
                                deliveryNoteInfo.put("MANDT", MANDT);
                                headMap.put(sapDeliveryNote, deliveryNoteInfo);
                            }

                            JSONObject dninfo = noteMap.get(doc.getString("VBELN")+"_"+doc.getString("POSNR"));
                            OverseaDeliveryNoteDtl overseaDeliveryNoteDtl = new OverseaDeliveryNoteDtl();
                            overseaDeliveryNoteDtl.setSapDeliveryNote(sapDeliveryNote);
                            overseaDeliveryNoteDtl.setSapDeliveryNoteItem(sapDeliveryNoteItem);
                            overseaDeliveryNoteDtl.setMaterialNo(String.valueOf(Long.parseLong(doc.getString("MATNR"))));//物料编码
                            //overseaDeliveryNoteDtl.setSapRemark(doc.getString("ARKTX"));//SAP交货单行备注
                            overseaDeliveryNoteDtl.setWerksDelivery(doc.getString("WERKS_V"));//发货工厂
                           // overseaDeliveryNoteDtl.setWhsLocationCodeDelivery(doc.getString("LGORT"));//发货库存地点
                            overseaDeliveryNoteDtl.setReceivableQtyUnitSales(doc.getDoubleValue("LFIMG"));//销售单位发出的数量
                            overseaDeliveryNoteDtl.setBasicUnit(doc.getString("MEINS"));//基本单位
                            //overseaDeliveryNoteDtl.setMovementType(doc.getString("BWART"));//移动类型
                            overseaDeliveryNoteDtl.setUnitSales(doc.getString("VRKME"));//销售单位
                            if(dninfo!=null) {//存在采购订单与交货单的关系
                                //String purchaseNo = noteMap.get(sapDeliveryNote+"_"+sapDeliveryNoteItem).toJSONString().split("_")[0];
                                //String purchaseNoItem = noteMap.get(sapDeliveryNote+"_"+sapDeliveryNoteItem).toJSONString().split("_")[1];
                                String purchaseNo = dninfo.getString("EBELN");
                                String purchaseNoItem = String.valueOf(dninfo.getInteger("EBELP"));
                                overseaDeliveryNoteDtl.setPurchaseNo(purchaseNo);//公司间采购订单号
                                overseaDeliveryNoteDtl.setPurchaseNoItem(purchaseNoItem);//公司间采购订单行项目
                            }
                            overseaDeliveryNoteDtl.setReceivableQtyBasicUnit(doc.getDoubleValue("ALMNG"));//基本单位发货数量
                            overseaDeliveryNoteDtl.setWerksReceive(doc.getString("WERKS"));//收货工厂
                            //overseaDeliveryNoteDtl.setColorNo(doc.getString("KANNR"));//色号批次
                            overseaDeliveryNoteDtl.setDataStatus(DATA_STATUS_0);
                            overseaDeliveryNoteDtl.setMandtDn(dninfo.getString("MANDT1"));// DN客户端
                            overseaDeliveryNoteDtl.setMandtPo(dninfo.getString("MANDT2"));// PO客户端

//                            交货单号		VBELN
//                            交货单行号	POSNR
//                            收货工厂		WERKS
//                            收货仓库		LGORT
//                            物料号		MATNR
//                            数量		    LFIMG
//                            基本单位		MEINS
//                            件数		    ALMNG
//                            销售单位		VRKME
//                            发货工厂		WERKS_V



                            QueryWrapper<OverseaDeliveryNoteDtl> queryWrapper = new QueryWrapper<OverseaDeliveryNoteDtl>()
                                    .eq("SAP_DELIVERY_NOTE", sapDeliveryNote).eq("SAP_DELIVERY_NOTE_ITEM", sapDeliveryNoteItem).eq("WERKS_RECEIVE", doc.getString("WERKS"));
                            OverseaDeliveryNoteDtl overseaDeliveryNoteDtl1 = iOverseaDeliveryNoteDtlService.getOne(queryWrapper);
                            if (overseaDeliveryNoteDtl1 != null){
                                if (DATA_STATUS_0.equals(overseaDeliveryNoteDtl1.getDataStatus())){
                                    iOverseaDeliveryNoteDtlService.update(overseaDeliveryNoteDtl, queryWrapper);
                                } else {
                                    log.info("=======交货单" + sapDeliveryNote + " 行号" + sapDeliveryNoteItem + "已经在收货中更新失败========");
                                }
                            } else {
                                iOverseaDeliveryNoteDtlService.save(overseaDeliveryNoteDtl);
                            }
                        }


                        //交货单表
                        //遍历map(JDK8写法)
                        headMap.forEach((key,value)->{
//                            System.out.println(key);
//                            System.out.println(value);
                            JSONObject doc = value;
                            //JSONObject doc = new JSONObject();
                            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
                            String sapDeliveryNote = key;

                            OverseaDeliveryNote overseaDeliveryNote = new OverseaDeliveryNote();
                            overseaDeliveryNote.setSapDeliveryNote(sapDeliveryNote);

                            overseaDeliveryNote.setSapPackageList(doc.getString("XDNUM"));//装箱单号
                            overseaDeliveryNote.setCabinetNumber(doc.getString("ZDECABNO"));//货柜号
                            //overseaDeliveryNote.setDeliveryType(doc.getString("LFART"));//交货类型
                            overseaDeliveryNote.setWerksReceive(doc.getString("WERKS"));//收货工厂
                            overseaDeliveryNote.setWerksDelivery(doc.getString("WERKS_V"));//发货工厂
                            overseaDeliveryNote.setMandt(doc.getString("MANDT"));//客户端
                            //overseaDeliveryNote.setSapRemark(doc.getString("ZTEXT"));//SAP交货单抬头文本

                            overseaDeliveryNote.setSpmsStatus(OVERSEA_DN_WAITING.getCode());
                            overseaDeliveryNote.setCreateDate(sdf.format(new Date()));
                            overseaDeliveryNote.setDataStatus(DATA_STATUS_0);

                            QueryWrapper<OverseaDeliveryNote> queryWrapper =
                                    new QueryWrapper<OverseaDeliveryNote>().eq("SAP_PACKAGE_LIST", doc.getString("XDNUM")).eq("SAP_DELIVERY_NOTE", sapDeliveryNote).eq("WERKS_RECEIVE", doc.getString("WERKS"));
                            OverseaDeliveryNote overseaDeliveryNote1 = iOverseaDeliveryNoteService.getOne(queryWrapper);
                            if (overseaDeliveryNote1 != null){
                                if (DATA_STATUS_0.equals(overseaDeliveryNote1.getDataStatus())){
                                    iOverseaDeliveryNoteService.update(overseaDeliveryNote, queryWrapper);
                                } else {
                                    log.info("=======交货单" + sapDeliveryNote + "已经在收货中更新失败========");
                                }
                            } else {
                                overseaDeliveryNote.setUuidDeliveryNote(getUuid());
                                iOverseaDeliveryNoteService.save(overseaDeliveryNote);
                                iOverseaOperateLogService.addOverseaOperateLog(userId, sapDeliveryNote, OVERSEA_DN_WAITING.getDescZh(), OVERSEA_DN_WAITING.getDescEn(), SAP, OVERSEA_DN_WAITING.getDescRu());
                            }
                        });


                    }
                }

//                /** IT_LIKP —— 交货单表 */
//                JSONArray IT_LIKP = returnData.getJSONArray("IT_LIKP");
//                if (IT_LIKP != null){
//                    insertOverseaDeliveryNote(IT_LIKP, userId);
//                }
//
//                /** IT_LIPS —— 交货单明细表 */
//                JSONArray IT_LIPS = returnData.getJSONArray("IT_LIPS");
//                if (IT_LIPS != null){
//                    insertOverseaDeliveryNoteDtl(IT_LIPS);
//                }
//
//                /** IT_ZXDTKO —— 装箱单信息表 */
//                JSONArray IT_ZXDTKO = returnData.getJSONArray("IT_ZXDTKO");
//                if (IT_ZXDTKO != null){
//                    insertOverseaPackageList(IT_ZXDTKO, userId);
//                }
//
//                /** IT_ZXDTPO —— 装箱单明细和交货单明细关系表 */
//                JSONArray IT_ZXDTPO = returnData.getJSONArray("IT_ZXDTPO");
//                if (IT_ZXDTPO != null){
//                    insertOverseaPackageListDtl(IT_ZXDTPO);
//                }
//
//                /** IT_DNZXD —— 装箱单明细箱码明细关系表 */
//                JSONArray IT_DNZXD = returnData.getJSONArray("IT_DNZXD");
//                if (IT_DNZXD != null){
//                    insertOverseaPackageListBox(IT_DNZXD);
//                }
//
//
//                //SAP已删除、冲销的DN
//                JSONArray IT_DETL = returnData.getJSONArray("IT_DETL");
//                if(IT_DETL!=null && IT_DETL.size()>0){
//                    insertOverseaDetl(IT_DETL);
//                }

                return ResponseResult.success()
                        .add("dataToSap", dataToSap)
                        .add("sapReturnedMessage", message);
                        //.add("overseaDeliveryNote", iOverseaDeliveryNoteService.getOverseaDnHead(sapDeliveryNote))
                        //.add("overseaDeliveryNoteItem", iOverseaDeliveryNoteService.getOverseaDeliveryNoteItem(sapDeliveryNote));
            } else {
                return ResponseResult.error().add("dataToSap", dataToSap).add("sapReturnedMessage", message);
            }
        }catch (FeignException feignException) {
            feignException.printStackTrace();
            return ResponseResult.error("请求SAP失败 FeignException").add("error", feignException.getMessage());
        } catch (Exception e){
            e.printStackTrace();
            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
            return ResponseResult.error().add("error", e.getMessage());
        }

    }

    JSONObject formatData(String sapPackageList, String deliveryDate,String werks){
        Map<String, Object> map = new HashMap<>();
        map.put("DATES_F", StringUtils.isEmpty(deliveryDate) ? "" : deliveryDate.replaceAll("-", ""));
        map.put("VBELN", "");
        map.put("XDNUM", StringUtils.isEmpty(sapPackageList) ? "" : sapPackageList);
        //map.put("I_TRAID", "");
        //map.put("I_SYNC_DATE", "5");
        map.put("TYPE_D", "04");
        map.put("WERKS", werks);
        map.put("SYSTEM_IN", "SPMS");
        map.put("ZBS", "");

        // 根据工厂查询对应的SAP Clinet
        List<ZSapOrgClient> selectList = zSapOrgClientMapper.selectList(new QueryWrapper<ZSapOrgClient>().eq("WERKS", werks));
        if (CollectionUtils.isNotEmpty(selectList)) {
            map.put("MANDT", selectList.get(0).getZmandt());
        } else {
            // throw new Exception("工厂："+werks+"未找到对应的SAP Clinet");
        }

        //map.put("MANDT", zxdSapClient.split("-")[1]);
       // map.put("DATES_F", "20200101");//采购订单创建日期开始
       // map.put("DATES_T", "20200101");//采购订单创建日期结束
        return iFormatDataToSapService.formatDataToSap(map, null, ZZXD_IF_SPMS_03, HWCSH);
    }

    /** IT_LIKP —— 交货单表 */
    void insertOverseaDeliveryNote(JSONArray IT_LIKP, String userId){
        int arraySize = IT_LIKP.size();
        if (arraySize > 0){
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
            for (int i = 0; i < arraySize; i ++){
                JSONObject doc = IT_LIKP.getJSONObject(i);
                String sapDeliveryNote = doc.getString("VBELN");

                OverseaDeliveryNote overseaDeliveryNote = new OverseaDeliveryNote();
                overseaDeliveryNote.setSapDeliveryNote(sapDeliveryNote);
                overseaDeliveryNote.setSapPackageList(doc.getString("BOLNR"));
                overseaDeliveryNote.setCabinetNumber(doc.getString("TRAID"));
                overseaDeliveryNote.setDeliveryType(doc.getString("LFART"));
                overseaDeliveryNote.setWerksReceive(doc.getString("WERKS"));
                overseaDeliveryNote.setWerksDelivery(doc.getString("FHWRK"));
                overseaDeliveryNote.setSapRemark(doc.getString("ZTEXT"));

                overseaDeliveryNote.setSpmsStatus(OVERSEA_DN_WAITING.getCode());
                overseaDeliveryNote.setCreateDate(sdf.format(new Date()));
                overseaDeliveryNote.setDataStatus(DATA_STATUS_0);
                
                QueryWrapper<OverseaDeliveryNote> queryWrapper =
                        new QueryWrapper<OverseaDeliveryNote>().eq("SAP_DELIVERY_NOTE", sapDeliveryNote);
                OverseaDeliveryNote overseaDeliveryNote1 = iOverseaDeliveryNoteService.getOne(queryWrapper);
                if (overseaDeliveryNote1 != null){
                    if (DATA_STATUS_0.equals(overseaDeliveryNote1.getDataStatus())){
                        iOverseaDeliveryNoteService.update(overseaDeliveryNote, queryWrapper);
                    } else {
                        log.info("=======交货单" + sapDeliveryNote + "已经在收货中更新失败========");
                    }
                } else {
                    overseaDeliveryNote.setUuidDeliveryNote(getUuid());
                    iOverseaDeliveryNoteService.save(overseaDeliveryNote);
                    iOverseaOperateLogService.addOverseaOperateLog(userId, sapDeliveryNote, OVERSEA_DN_WAITING.getDescZh(), OVERSEA_DN_WAITING.getDescEn(), SAP, OVERSEA_DN_WAITING.getDescRu());
                }
            }
        }
    }

    /** IT_LIPS —— 交货单明细表 */
    void insertOverseaDeliveryNoteDtl(JSONArray IT_LIPS){
        int arraySize = IT_LIPS.size();
        if (arraySize > 0){
            /** 根据SAP返回交货单明细信息，获取第一行明细里的 交货单号，根据 交货单号 先删除该交货单所有明细行数据，再新建明细数据； */
            Set<String> dnSet = new HashSet<>();
            for (int i = 0; i < arraySize; i ++){
                String dn = IT_LIPS.getJSONObject(i).getString("VBELN");
                if (StringUtils.isNotEmpty(dn)){
                    dnSet.add(dn);
                }
            }
            QueryWrapper<OverseaDeliveryNoteDtl> deliveryNoteDtlQueryWrapper =
                    new QueryWrapper<OverseaDeliveryNoteDtl>().in("SAP_DELIVERY_NOTE", dnSet).eq("DATA_STATUS", "0");
            iOverseaDeliveryNoteDtlService.remove(deliveryNoteDtlQueryWrapper);

            for (int i = 0; i < arraySize; i ++){
                JSONObject doc = IT_LIPS.getJSONObject(i);
                String sapDeliveryNote = doc.getString("VBELN");
                String sapDeliveryNoteItem = String.valueOf(doc.getInteger("POSNR"));

                OverseaDeliveryNoteDtl overseaDeliveryNoteDtl = new OverseaDeliveryNoteDtl();
                overseaDeliveryNoteDtl.setSapDeliveryNote(sapDeliveryNote);
                overseaDeliveryNoteDtl.setSapDeliveryNoteItem(sapDeliveryNoteItem);
                overseaDeliveryNoteDtl.setMaterialNo(String.valueOf(Long.parseLong(doc.getString("MATNR"))));
                overseaDeliveryNoteDtl.setSapRemark(doc.getString("ARKTX"));
                overseaDeliveryNoteDtl.setWerksDelivery(doc.getString("WERKS"));
                overseaDeliveryNoteDtl.setWhsLocationCodeDelivery(doc.getString("LGORT"));
                overseaDeliveryNoteDtl.setReceivableQtyUnitSales(doc.getDoubleValue("LFIMG"));
                overseaDeliveryNoteDtl.setBasicUnit(doc.getString("MEINS"));
                overseaDeliveryNoteDtl.setMovementType(doc.getString("BWART"));
                overseaDeliveryNoteDtl.setUnitSales(doc.getString("VRKME"));
                overseaDeliveryNoteDtl.setPurchaseNo(doc.getString("VGBEL"));
                overseaDeliveryNoteDtl.setPurchaseNoItem(String.valueOf(doc.getInteger("VGPOS")));
                overseaDeliveryNoteDtl.setReceivableQtyBasicUnit(doc.getDoubleValue("LGMNG"));
                overseaDeliveryNoteDtl.setWerksReceive(doc.getString("SHWRK"));
                overseaDeliveryNoteDtl.setColorNo(doc.getString("KANNR"));
                overseaDeliveryNoteDtl.setDataStatus(DATA_STATUS_0);

                QueryWrapper<OverseaDeliveryNoteDtl> queryWrapper = new QueryWrapper<OverseaDeliveryNoteDtl>()
                        .eq("SAP_DELIVERY_NOTE", sapDeliveryNote).eq("SAP_DELIVERY_NOTE_ITEM", sapDeliveryNoteItem);
                OverseaDeliveryNoteDtl overseaDeliveryNoteDtl1 = iOverseaDeliveryNoteDtlService.getOne(queryWrapper);
                if (overseaDeliveryNoteDtl1 != null){
                    if (DATA_STATUS_0.equals(overseaDeliveryNoteDtl1.getDataStatus())){
                        iOverseaDeliveryNoteDtlService.update(overseaDeliveryNoteDtl, queryWrapper);
                    } else {
                        log.info("=======交货单" + sapDeliveryNote + " 行号" + sapDeliveryNoteItem + "已经在收货中更新失败========");
                    }
                } else {
                    iOverseaDeliveryNoteDtlService.save(overseaDeliveryNoteDtl);
                }
            }
        }
    }

    /** IT_ZXDTKO —— 装箱单信息表 */
    void insertOverseaPackageList(JSONArray IT_ZXDTKO, String userId){
        int arraySize = IT_ZXDTKO.size();
        if (arraySize > 0){
            for (int i = 0; i < arraySize; i ++){
                JSONObject doc = IT_ZXDTKO.getJSONObject(i);
                String sapPackageList = doc.getString("XDNUM");

                OverseaPackageList overseaPackageList = new OverseaPackageList();
                overseaPackageList.setSapPackageList(doc.getString("XDNUM"));
                overseaPackageList.setMerchandiser(doc.getString("MERCH"));
                overseaPackageList.setCabinetModel(doc.getString("MAGRV"));
                overseaPackageList.setFromPort(doc.getString("SPORT"));
                overseaPackageList.setToPort(doc.getString("EPORT"));
                overseaPackageList.setDataStatus(DATA_STATUS_0);

                QueryWrapper<OverseaPackageList> queryWrapper =
                        new QueryWrapper<OverseaPackageList>().eq("SAP_PACKAGE_LIST", sapPackageList);
                OverseaPackageList overseaPackageList1 = iOverseaPackageListService.getOne(queryWrapper);
                if (overseaPackageList1 != null){
                    if (DATA_STATUS_0.equals(overseaPackageList1.getDataStatus())){
                        iOverseaPackageListService.update(overseaPackageList, queryWrapper);
                    } else {
                        log.info("=======装箱单" + sapPackageList + "已经在收货中更新失败========");
                    }
                } else {
                    overseaPackageList.setUuidPackageList(getUuid());

                    iOverseaPackageListService.save(overseaPackageList);
                    iOverseaOperateLogService.addOverseaOperateLog(userId, sapPackageList, OVERSEA_PL_WAITING.getDescZh(), OVERSEA_PL_WAITING.getDescEn(), SAP, OVERSEA_PL_WAITING.getDescRu());
                }
            }
        }
    }

    /** IT_ZXDTPO —— 装箱单明细和交货单明细关系表 */
    void insertOverseaPackageListDtl(JSONArray IT_ZXDTPO){
        int arraySize = IT_ZXDTPO.size();
        if (arraySize > 0){

            /** 根据SAP返回装箱单明细和交货单明细关系表信息，获取第一行明细里的 装箱单号，根据 装箱单号 先删除该装箱单所有明细行数据，再新建明细数据； */
            Set<String> packageListSet = new HashSet<>();
            for (int i = 0; i < arraySize; i ++){
                String sapPackageList = IT_ZXDTPO.getJSONObject(i).getString("XDNUM");
                if (StringUtils.isNotEmpty(sapPackageList)){
                    packageListSet.add(sapPackageList);
                }
            }
            QueryWrapper<OverseaPackageListDtl> packageListDtlQueryWrapper =
                    new QueryWrapper<OverseaPackageListDtl>().in("SAP_PACKAGE_LIST", packageListSet).eq("DATA_STATUS", "0");
            iOverseaPackageListDtlService.remove(packageListDtlQueryWrapper);

            for (int i = 0; i < arraySize; i ++){
                JSONObject doc = IT_ZXDTPO.getJSONObject(i);
                String sapPackageList = doc.getString("XDNUM");
                String sapPackageListItem = String.valueOf(doc.getInteger("POSNR"));

                OverseaPackageListDtl overseaPackageListDtl = new OverseaPackageListDtl();
                overseaPackageListDtl.setSapPackageList(sapPackageList);
                overseaPackageListDtl.setSapPackageListItem(sapPackageListItem);
                overseaPackageListDtl.setSapDeliveryNote(doc.getString("VBELN_OT"));
                overseaPackageListDtl.setPurchaseNo(doc.getString("ZPONO_CC"));
                overseaPackageListDtl.setPurchaseNoItem(String.valueOf(doc.getInteger("ZPOITEM_CC")));
                overseaPackageListDtl.setDataStatus(DATA_STATUS_0);

                QueryWrapper<OverseaPackageListDtl> queryWrapper = new QueryWrapper<OverseaPackageListDtl>()
                        .eq("SAP_PACKAGE_LIST", sapPackageList).eq("SAP_PACKAGE_LIST_ITEM", sapPackageListItem);
                OverseaPackageListDtl overseaPackageListDtl1 = iOverseaPackageListDtlService.getOne(queryWrapper);
                if (overseaPackageListDtl1 != null){
                    if (DATA_STATUS_0.equals(overseaPackageListDtl1.getDataStatus())){
                        iOverseaPackageListDtlService.update(overseaPackageListDtl, queryWrapper);
                    } else {
                        log.info("=======装箱单" + sapPackageList + " 行号" + sapPackageListItem + "已经在收货中更新失败========");
                    }
                } else {
                    iOverseaPackageListDtlService.save(overseaPackageListDtl);
                }
            }
        }
    }

    /** IT_DNZXD —— 装箱单明细箱码明细关系表 */
    void insertOverseaPackageListBox(JSONArray IT_DNZXD){
        int arraySize = IT_DNZXD.size();
        if (arraySize > 0){

            /** 根据SAP返回 装箱单明细箱码明细关系表 信息，获取第一行明细里的 装箱单号，根据 装箱单号 先删除该装箱单所有明细行数据，再新建明细数据； */
            Set<String> packageListSet = new HashSet<>();
            for (int i = 0; i < arraySize; i ++){
                String sapPackageList = IT_DNZXD.getJSONObject(i).getString("XDNUM");
                if (StringUtils.isNotEmpty(sapPackageList)){
                    packageListSet.add(sapPackageList);
                }
            }
            QueryWrapper<OverseaPackageListBox> packageListBoxQueryWrapper =
                    new QueryWrapper<OverseaPackageListBox>().in("SAP_PACKAGE_LIST", packageListSet).eq("DATA_STATUS", "0");
            iOverseaPackageListBoxService.remove(packageListBoxQueryWrapper);

            for (int i = 0; i < arraySize; i ++){
                JSONObject doc = IT_DNZXD.getJSONObject(i);

                String sapPackageList = doc.getString("XDNUM");
                String sapPackageListItem = String.valueOf(doc.getInteger("ZPOSNR"));
                String boxNote = doc.getString("PACKAGE_CODE");
                String boxNoteItem = String.valueOf(doc.getInteger("SERIAL"));

                OverseaPackageListBox overseaPackageListBox = new OverseaPackageListBox();
                overseaPackageListBox.setSapPackageList(sapPackageList);
                overseaPackageListBox.setSapPackageListItem(sapPackageListItem);
                overseaPackageListBox.setBoxNote(boxNote);
                overseaPackageListBox.setBoxNoteItem(boxNoteItem);
                overseaPackageListBox.setMaterialNo(String.valueOf(Long.parseLong(doc.getString("MATNR"))));
                overseaPackageListBox.setReceivableQtyBasicUnit(doc.getDoubleValue("GNCKSL"));
                overseaPackageListBox.setBasicUnit(doc.getString("MEINS"));
                overseaPackageListBox.setBoxStatus("0");
                overseaPackageListBox.setDataStatus(DATA_STATUS_0);
                overseaPackageListBox.setDemandNo(doc.getString("DEMAND_NO"));
                overseaPackageListBox.setDemandItem(String.valueOf(doc.getInteger("DEMAND_POSNR")));
                overseaPackageListBox.setDemander(doc.getString("DEMANDER"));

                QueryWrapper<OverseaPackageListBox> queryWrapper = new QueryWrapper<OverseaPackageListBox>()
                        .eq("BOX_NOTE", boxNote).eq("BOX_NOTE_ITEM", boxNoteItem);
                OverseaPackageListBox overseaPackageListBox1 = iOverseaPackageListBoxService.getOne(queryWrapper);
                if (overseaPackageListBox1 != null){
                    if (DATA_STATUS_0.equals(overseaPackageListBox1.getDataStatus())){
                        iOverseaPackageListBoxService.update(overseaPackageListBox, queryWrapper);
                    } else {
                        log.info("=======装箱单" + sapPackageList + " 行号" + sapPackageListItem + "，箱码" + boxNote + " 箱码行号" + boxNoteItem + "已经在收货中更新失败========");
                    }
                } else {
                    iOverseaPackageListBoxService.save(overseaPackageListBox);
                }
            }
        }
    }


    void insertOverseaDetl(JSONArray IT_DETL){
        if (IT_DETL != null && IT_DETL.size() > 0){
            for(int i = 0; i < IT_DETL.size(); i++) {
                log.info("=======" + IT_DETL.size() + "    " + i + "   海外仓SAP已删除交货单信息  " + IT_DETL.get(i).toString());
                /** i = 0 时存的是表头信息 */
                if (i > 0) {
                    //JSONArray json = JSONArray.parseArray(IT_DETL.get(i).toString());
                    //String man = json.getString(0);//SAP端口号 MAM
                    //String sapDeliveryNote = json.getString(1);//DN交货单号、VBELN
                    String sapDeliveryNote = IT_DETL.getJSONObject(i).getString("VBELN");
                    //String werk = json.getString(2);//WERK  工厂，可能为空
                    //String zdate = json.getString(3);//ZDATE删除DN的日期
                    //String zname = json.getString(4);//ZNAME操作人

                    //删除交货单表头
                    QueryWrapper<OverseaDeliveryNote> wrapperDn = new QueryWrapper<OverseaDeliveryNote>().eq("SAP_DELIVERY_NOTE", sapDeliveryNote);
                    OverseaDeliveryNote deliveryNote = iOverseaDeliveryNoteService.getOne(wrapperDn);
                    if (deliveryNote != null){
//                        if(StringUtils.isNotEmpty(deliveryNote.getSapPackageList())){
//                            //删除装箱单信息表
//                            QueryWrapper<OverseaPackageList> wrapperPl = new QueryWrapper<OverseaPackageList>().eq("SAP_PACKAGE_LIST", deliveryNote.getSapPackageList());
//                            iOverseaPackageListService.remove(wrapperPl);
//
//                            //删除装箱单明细箱码明细关系表
//                            QueryWrapper<OverseaPackageListBox> wrapperPlBox = new QueryWrapper<OverseaPackageListBox>().eq("SAP_PACKAGE_LIST", deliveryNote.getSapPackageList());
//                            iOverseaPackageListBoxService.remove(wrapperPlBox);
//                        }
                        iOverseaDeliveryNoteService.remove(wrapperDn);
                    }

                    //删除交货单交货单明细表
                    QueryWrapper<OverseaDeliveryNoteDtl> wrapperDnDtl = new QueryWrapper<OverseaDeliveryNoteDtl>().eq("SAP_DELIVERY_NOTE", sapDeliveryNote);
                    iOverseaDeliveryNoteDtlService.remove(wrapperDnDtl);


                    //删除装箱单明细和交货单明细关系表
                    QueryWrapper<OverseaPackageListDtl> wrapperPlDtl = new QueryWrapper<OverseaPackageListDtl>().eq("SAP_DELIVERY_NOTE", sapDeliveryNote);
                    iOverseaPackageListDtlService.remove(wrapperPlDtl);


                }
            }
        }
    }

    String getUuid(){
        return UUID.randomUUID().toString().replaceAll("-","").toLowerCase();
    }


    /** 海外收货交货单，空运人带/转储/本地采购收货 */
    @Override
    public synchronized ResponseResult updateOverseaDnRest(String sapDeliveryNote, String businessType, String purchaseOrder,
                                              String deliveryDateS, String deliveryDateE, String werks, String userId) {
        try {
            if (StringUtils.isEmpty(businessType)){
                return ResponseResult.error("请求参数业务标识不能为空");
            }
            JSONObject dataToSap = formatDataGetDn(sapDeliveryNote, businessType, purchaseOrder, deliveryDateS, deliveryDateE, werks);
            // 根据工厂查询对应的SAP Clinet
            List<ZSapOrgClient> selectList = zSapOrgClientMapper.selectList(new QueryWrapper<ZSapOrgClient>().eq("WERKS", werks));
            if (CollectionUtils.isNotEmpty(selectList)) {
                String Operation = dataToSap.getJSONObject("REQUEST").getJSONObject("REQUEST_DATA").getString("Operation");
                if (!"ZZXD_IF_SPMS_03".equals(Operation)) {
                	JSONObject obj = dataToSap.getJSONObject("REQUEST").getJSONObject("ESB_ATTRS");
                    obj.put("Target_ID", "SAP-"+selectList.get(0).getZmandt());
                }
            } else {
                throw new Exception("工厂："+werks+"未找到对应的SAP Clinet");
            }

            JSONObject message = JSONObject.parseObject(iFeignServiceCommon.sendRestToSapCommon(dataToSap));
            log.info("\n=====dataToSap======\n" + dataToSap + "\n=====sapReturnedMessage======\n" + message);
            JSONObject returnData = message.getJSONObject("RESPONSE").getJSONObject("RETURN_DATA");
            if("02".equals(businessType)){//海外当地采购依旧使用旧接口
                if (SAP_SUCCESS.equals(returnData.getString("O_TYPE"))){
                    String sapBusinessType = returnData.getString("O_FLAG");
                    // 根据交货单查询SPMS是否存在关闭的单据，如果有直接打开，状态变为待到货
                    OverseaDn overseaDn = iOverseaDnService.getDn(sapDeliveryNote);
                    if (overseaDn != null && OverseaDnEnum.DN_DELETE.getCode().equals(overseaDn.getSpmsStatus())) {
                        overseaDn.setSpmsStatus(DN_WAITING.getCode());
                        overseaDn.setDataStatus(DATA_STATUS_0);
                        iOverseaDnService.updateById(overseaDn);
                        iOverseaOperateLogService.addOverseaOperateLog(userId, sapDeliveryNote, DN_WAITING.getDescZh(), DN_WAITING.getDescEn(), "", DN_WAITING.getDescRu());
                        return ResponseResult.success()
                                .add("dataToSap", dataToSap)
                                .add("sapReturnedMessage", message);
                    }
                    /** IT_LIKP —— 交货单表 ——— 空运人带/转储/本地采购收货 */
                    JSONArray IT_LIKP = returnData.getJSONArray("IT_LIKP");
                    if (IT_LIKP != null){
                        insertOverseaDn(IT_LIKP, sapBusinessType,userId);
                    }

                    /** IT_LIPS —— 交货单明细表 ——— 空运人带/转储/本地采购收货 */
                    JSONArray IT_LIPS = returnData.getJSONArray("IT_LIPS");
                    if (IT_LIPS != null){
                        insertOverseaDnDtl(IT_LIPS);
                    }

                    /** IT_EKKO —— 采购订单表表头 ——— 空运人带/转储/本地采购收货 */
                    JSONArray IT_EKKO = returnData.getJSONArray("IT_EKKO");
                    if (IT_EKKO != null){
                        insertOverseaPurchaseOrder(IT_EKKO, sapBusinessType);
                    }

                    /** IT_EKPO —— 采购订单表明细 ——— 空运人带/转储/本地采购收货 */
                    JSONArray IT_EKPO = returnData.getJSONArray("IT_EKPO");
                    if (IT_EKPO != null){
                        insertOverseaPurchaseOrderDtl(IT_EKPO);
                    }

                    return ResponseResult.success()
                            .add("dataToSap", dataToSap)
                            .add("sapReturnedMessage", message);
                } else {
                    return ResponseResult.error().add("dataToSap", dataToSap).add("sapReturnedMessage", message);
                }
            }else{
                if (SAP_SUCCESS.equals(returnData.getJSONObject("ES_RETURN").getString("TYPE"))){
                    //String sapBusinessType = returnData.getString("O_FLAG");
                    // 根据交货单查询SPMS是否存在关闭的单据，如果有直接打开，状态变为待到货
                    OverseaDn overseaDn = iOverseaDnService.getDn(sapDeliveryNote);
                    if (overseaDn != null && OverseaDnEnum.DN_DELETE.getCode().equals(overseaDn.getSpmsStatus())) {
                        overseaDn.setSpmsStatus(DN_WAITING.getCode());
                        overseaDn.setDataStatus(DATA_STATUS_0);
                        iOverseaDnService.updateById(overseaDn);
                        iOverseaOperateLogService.addOverseaOperateLog(userId, sapDeliveryNote, DN_WAITING.getDescZh(), DN_WAITING.getDescEn(), "", DN_WAITING.getDescRu());
                        return ResponseResult.success()
                                .add("dataToSap", dataToSap)
                                .add("sapReturnedMessage", message);
                    }

                    /** ET_PO —— 采购订单表表头 */
                    JSONArray ET_PO_HEAD = returnData.getJSONArray("ET_PO_HEAD");
                    int poHeadmSize = ET_PO_HEAD.size();
                    if (poHeadmSize > 0) {
                        for (int i = 0; i < poHeadmSize; i++) {
                            JSONObject ES_PO_HEAD = ET_PO_HEAD.getJSONObject(i);
                            if(ES_PO_HEAD!=null){
                                String sapPurchaseOrder = ES_PO_HEAD.getString("EBELN");
                                OverseaPurchaseOrder overseaPurchaseOrder = new OverseaPurchaseOrder();
                                overseaPurchaseOrder.setSapPurchaseOrder(sapPurchaseOrder);//采购凭证号PO
                                overseaPurchaseOrder.setBusinessType(businessType);
                                overseaPurchaseOrder.setVoucherType(ES_PO_HEAD.getString("BSART"));//凭证类型
//                    overseaPurchaseOrder.setSapCreateDate(doc.getString("AEDAT"));//SAP凭证日期
//                    overseaPurchaseOrder.setPurchaseGroup(doc.getString("EKGRP"));//采购组
//                    overseaPurchaseOrder.setPurchaseOrg(doc.getString("EKORG"));//采购组织
//                    overseaPurchaseOrder.setSupplierCode(doc.getString("LIFNR"));//供应商编号
//                     overseaPurchaseOrder.setCreateUser(doc.getString("ERNAM"));//建单人
                                overseaPurchaseOrder.setSupplierDesc("");//
                                overseaPurchaseOrder.setDataStatus(DATA_STATUS_0);

                                QueryWrapper<OverseaPurchaseOrder> queryWrapper = new QueryWrapper<OverseaPurchaseOrder>().eq("SAP_PURCHASE_ORDER", sapPurchaseOrder);
                                OverseaPurchaseOrder purchaseOrderInfo = iOverseaPurchaseOrderService.getOne(queryWrapper);

                                if (purchaseOrderInfo != null){
                                    if (DATA_STATUS_0.equals(purchaseOrderInfo.getDataStatus())){
                                        iOverseaPurchaseOrderService.update(overseaPurchaseOrder, queryWrapper);
                                    } else {
                                        log.info("=======空运人带/转储/本地采购 采购订单" + sapPurchaseOrder + "已经在收货中更新失败========");
                                    }
                                } else {
                                    overseaPurchaseOrder.setUuidPurchaseOrder(getUuid());
                                    iOverseaPurchaseOrderService.save(overseaPurchaseOrder);
                                }
                            }
                        }
                    }


                    /** ET_PO_ITEM —— 采购订单表明细 */
                    JSONArray ET_PO_ITEM = returnData.getJSONArray("ET_PO_ITEM");
                    int poItemSize = ET_PO_ITEM.size();
                    if (poItemSize > 0) {
                        /** 采购订单表明细信息，在更新之前先将PO明细行里数据状态字段值为0的行全都删除，再依据SAP返回信息建立新的采购订单单明细行 */
                        Set<String> poSet = new HashSet<>();
                        for (int i = 0; i < poItemSize; i++) {
                            String dn = ET_PO_ITEM.getJSONObject(i).getString("EBELN");
                            if (StringUtils.isNotEmpty(dn)){
                                poSet.add(dn);
                            }
                        }
                        QueryWrapper<OverseaPurchaseOrderDtl> purchaseOrderDtlQueryWrapper =
                                new QueryWrapper<OverseaPurchaseOrderDtl>().in("SAP_PURCHASE_ORDER", poSet).eq("DATA_STATUS", "0");
                        iOverseaPurchaseOrderDtlService.remove(purchaseOrderDtlQueryWrapper);

                        for (int i = 0; i < poItemSize; i ++){
                            JSONObject doc = ET_PO_ITEM.getJSONObject(i);
                            String sapPurchaseOrder = doc.getString("EBELN");
                            String sapPurchaseOrderItem = String.valueOf(doc.getInteger("EBELP"));

                            OverseaPurchaseOrderDtl overseaPurchaseOrderDtl = new OverseaPurchaseOrderDtl();
                            overseaPurchaseOrderDtl.setSapPurchaseOrder(sapPurchaseOrder);
                            overseaPurchaseOrderDtl.setSapPurchaseOrderItem(sapPurchaseOrderItem);
                            overseaPurchaseOrderDtl.setWhsLocationCodeReceive(doc.getString("LGORT"));//收货/转入仓库地址
                            overseaPurchaseOrderDtl.setMaterialNo(StringUtils.isEmpty(doc.getString("MATNR")) ?
                                    "" : String.valueOf(Long.parseLong(doc.getString("MATNR"))));
                            overseaPurchaseOrderDtl.setBasicUnit(doc.getString("MEINS"));//基本单位
                            overseaPurchaseOrderDtl.setReceivableQtyBasicUnit(doc.getDoubleValue("MENGE"));//应收基本单位数量
                            //overseaPurchaseOrderDtl.setReturnMark(doc.getString("RETPO"));//退货标识
                            //overseaPurchaseOrderDtl.setMaterialZhDesc(doc.getString("TXZ01"));//物料描述
                            overseaPurchaseOrderDtl.setWerksReceive(doc.getString("WERKS"));//转入工厂
                            overseaPurchaseOrderDtl.setDataStatus(DATA_STATUS_0);

                            QueryWrapper<OverseaPurchaseOrderDtl> queryWrapper = new QueryWrapper<OverseaPurchaseOrderDtl>()
                                    .eq("SAP_PURCHASE_ORDER", sapPurchaseOrder).eq("SAP_PURCHASE_ORDER_ITEM", sapPurchaseOrderItem);
                            OverseaPurchaseOrderDtl purchaseOrderDtl = iOverseaPurchaseOrderDtlService.getOne(queryWrapper);

                            if (purchaseOrderDtl != null){
                                if (DATA_STATUS_0.equals(purchaseOrderDtl.getDataStatus())){
                                    iOverseaPurchaseOrderDtlService.update(overseaPurchaseOrderDtl, queryWrapper);
                                } else {
                                    log.info("=======空运人带/转储/本地采购 采购订单" + sapPurchaseOrder + " 行号" + sapPurchaseOrderItem + "已经在收货中更新失败========");
                                }
                            } else {
                                iOverseaPurchaseOrderDtlService.save(overseaPurchaseOrderDtl);
                            }

                        }
                    }


                    Map<String,JSONObject> headMap = new HashMap();
                    Map<String,JSONObject> itemMap = new HashMap();

                    /** ET_REL —— 装箱单关系表 */
                    JSONArray ET_REL = returnData.getJSONArray("ET_REL");
                    if (ET_REL != null) {
                        int zxdSize = ET_REL.size();
                        if (zxdSize > 0) {
                            /** 装箱单信息表 */
                            for (int i = 0; i < zxdSize; i++) {
                                JSONObject doc = ET_REL.getJSONObject(i);
                                String XDNUM = doc.getString("XDNUM");//装箱单号
                                String ZDECABNO = doc.getString("ZDECABNO");//柜号
                                String VBELN = doc.getString("VBELN");//交货单号 04接口入库时需要传输给SAP的DN号码（STO，外向DN；PO，内向DN）
                                if("03".equals(businessType)){//海外转储的交货单用ZSHD代替
                                    VBELN = StringUtils.isNotEmpty(doc.getString("ZSHD")) ? doc.getString("ZSHD") : doc.getString("VBELN");//实际交货单号 01接口中反馈给SPMS的外向DN号码
                                }
                                String VBELN1 = doc.getString("VBELN");//交货单号
                                String POSNR = doc.getString("POSNR");//交货单行号
                                String EBELN = doc.getString("EBELN");//采购订单号
                                String EBELP = doc.getString("EBELP");//采购订单行号
                                String PACKAGE_CODE = doc.getString("PACKAGE_CODE");//箱码
                                String SERIAL = doc.getString("SERIAL");//箱码行号
                                String DEMAND_NO = doc.getString("DEMAND_NO");//需求来源号
                                String DEMAND_POSNR = doc.getString("DEMAND_POSNR");//需求来源行号
                                String DEMANDER = doc.getString("DEMANDER");//需求人
                                String MANDT2 = doc.getString("MANDT2");//PO客户端
                                String MANDT1 = doc.getString("MANDT1");//DN客户端


                                JSONObject deliveryNoteInfo = new JSONObject();
                                deliveryNoteInfo.put("EBELN", EBELN);
                                deliveryNoteInfo.put("EBELP", EBELP);
                                deliveryNoteInfo.put("PACKAGE_CODE", PACKAGE_CODE);
                                deliveryNoteInfo.put("SERIAL", SERIAL);
                                deliveryNoteInfo.put("DEMAND_NO", DEMAND_NO);
                                deliveryNoteInfo.put("DEMAND_POSNR", DEMAND_POSNR);
                                deliveryNoteInfo.put("DEMANDER", DEMANDER);
                                deliveryNoteInfo.put("MANDT1", MANDT1);
                                deliveryNoteInfo.put("MANDT2", MANDT2);
                                deliveryNoteInfo.put("VBELN1", VBELN1);

                                itemMap.put(VBELN+"_"+POSNR, deliveryNoteInfo);
                            }
                        }
                    }
                    /** ET_DN —— 交货单明细表 */
                    JSONArray ET_DN = returnData.getJSONArray("ET_DN");
                    int dnItemSize = ET_DN.size();
                    if (dnItemSize > 0) {
                        /** 交货单明细信息，在更新之前先将DN明细行里数据状态字段值为0的行全都删除，再依据SAP返回信息建立新的交货单明细行 */
                        Set<String> dnSet = new HashSet<>();
                        for (int i = 0; i < dnItemSize; i++) {
                            String dn = ET_DN.getJSONObject(i).getString("VBELN");
                            if("03".equals(businessType)){//海外转储的交货单用ZSHD代替
                                dn =  StringUtils.isNotEmpty(ET_DN.getJSONObject(i).getString("ZSHD")) ? ET_DN.getJSONObject(i).getString("ZSHD") : ET_DN.getJSONObject(i).getString("VBELN");//实际交货单号 01接口中反馈给SPMS的外向DN号码
                            }
                            if (StringUtils.isNotEmpty(dn)){
                                dnSet.add(dn);
                            }
                        }
                        QueryWrapper<OverseaDnDtl> overseaDnDtlQueryWrapper =
                                new QueryWrapper<OverseaDnDtl>().in("SAP_DELIVERY_NOTE", dnSet).eq("DATA_STATUS", "0");
                        iOverseaDnDtlService.remove(overseaDnDtlQueryWrapper);

                        for (int i = 0; i < dnItemSize; i++) {
                            JSONObject deliveryNoteMap = new JSONObject();
                            JSONObject doc = ET_DN.getJSONObject(i);
                            deliveryNoteMap.put("VBELN1", doc.getString("VBELN"));
                            String sapDeliveryNoteItem = String.valueOf(doc.getInteger("POSNR"));
                            if("03".equals(businessType)){//海外转储的交货单用ZSHD代替
                                doc.put("VBELN", StringUtils.isNotEmpty(doc.getString("ZSHD")) ? doc.getString("ZSHD") : doc.getString("VBELN"));
                                deliveryNoteMap.put("VBELN", StringUtils.isNotEmpty(doc.getString("ZSHD")) ? doc.getString("ZSHD") : doc.getString("VBELN"));
                            }else{
                                deliveryNoteMap.put("VBELN", doc.getString("VBELN"));
                            }

                            deliveryNoteMap.put("WERKS", doc.getString("WERKS"));
                            deliveryNoteMap.put("LGORT", doc.getString("LGORT"));
                            deliveryNoteMap.put("MANDT", doc.getString("MANDT"));
                            headMap.put(doc.getString("VBELN"), deliveryNoteMap);

                            OverseaDnDtl overseaDnDtl = new OverseaDnDtl();
                            overseaDnDtl.setSapDeliveryNote(doc.getString("VBELN"));
                            overseaDnDtl.setSapDeliveryNoteItem(sapDeliveryNoteItem);
                            overseaDnDtl.setWerksReceive(doc.getString("WERKS"));//收货工厂
                            overseaDnDtl.setWerksDelivery(doc.getString("WERKS_V"));//发货工厂
                            overseaDnDtl.setMaterialNo(StringUtils.isEmpty(doc.getString("MATNR")) ?
                                    "" : String.valueOf(Long.parseLong(doc.getString("MATNR"))));//物料编号
                            overseaDnDtl.setUnitSales(doc.getString("VRKME"));//销售单位
                            overseaDnDtl.setReceivableQtyUnitSales(doc.getDoubleValue("ALMNG"));//应收销售单位数量
                            overseaDnDtl.setBasicUnit(doc.getString("MEINS"));//基本单位
                            overseaDnDtl.setReceivableQtyBasicUnit(doc.getDoubleValue("LFIMG"));//应收基本单位数量
                            //overseaDnDtl.setDomesticActualQty(doc.getDoubleValue("GNCKSL"));//国内实际发货基本单位数量
                            overseaDnDtl.setDataStatus(DATA_STATUS_0);

                            JSONObject deliveryNoteInfo = itemMap.get(doc.getString("VBELN")+"_"+doc.getString("POSNR"));
                            overseaDnDtl.setSapPurchaseOrder(deliveryNoteInfo.getString("EBELN"));//参考采购凭证号PO
                            overseaDnDtl.setSapPurchaseOrderItem(String.valueOf(deliveryNoteInfo.getInteger("EBELP")));//参考采购凭证号PO行号
                            //overseaDnDtl.setWhsLocationCodeDelivery(deliveryNoteInfo.getString("LGORT"));//发货仓库地址
                            overseaDnDtl.setBoxNote(deliveryNoteInfo.getString("PACKAGE_CODE"));//箱码
                            overseaDnDtl.setBoxNoteItem(String.valueOf(deliveryNoteInfo.getInteger("SERIAL")));//箱码行号
                            overseaDnDtl.setDemandNo(deliveryNoteInfo.getString("DEMAND_NO"));//SPMS需求来源号
                            overseaDnDtl.setDemandItem(String.valueOf(deliveryNoteInfo.getInteger("DEMAND_POSNR")));//SPMS需求来源行号
                            overseaDnDtl.setDemander(deliveryNoteInfo.getString("DEMANDER"));//需求申请人
                            overseaDnDtl.setMandtDn(deliveryNoteInfo.getString("MANDT1"));// DN客户端
                            overseaDnDtl.setMandtPo(deliveryNoteInfo.getString("MANDT2"));// PO客户端

//                            交货单号		VBELN
//                            交货单行号	POSNR
//                            收货工厂		WERKS
//                            收货仓库		LGORT
//                            物料号		MATNR
//                            数量		    LFIMG
//                            基本单位		MEINS
//                            件数		    ALMNG
//                            销售单位		VRKME
//                            发货工厂		WERKS_V
                            QueryWrapper<OverseaDnDtl> queryWrapper = new QueryWrapper<OverseaDnDtl>()
                                    .eq("SAP_DELIVERY_NOTE", doc.getString("VBELN")).eq("SAP_DELIVERY_NOTE_ITEM", sapDeliveryNoteItem);
                            OverseaDnDtl dnDtl = iOverseaDnDtlService.getOne(queryWrapper);
                            if (dnDtl != null){
                                if (DATA_STATUS_0.equals(dnDtl.getDataStatus())){
                                    iOverseaDnDtlService.update(overseaDnDtl, queryWrapper);
                                } else {
                                    log.info("=======空运人带/转储/本地采购 交货单" + doc.getString("VBELN") + " 行号" + sapDeliveryNoteItem + "已经在收货中更新失败========");
                                }
                            } else {
                                iOverseaDnDtlService.save(overseaDnDtl);
                            }
                        }

                        //交货单表
                        //遍历map(JDK8写法)
                        headMap.forEach((key,value)->{
                            JSONObject doc = value;
                            String sapDeliveryNoteNew = doc.getString("VBELN");
                            OverseaDn overseaDnNew = new OverseaDn();
                            overseaDnNew.setSapDeliveryNote(sapDeliveryNoteNew);
                            overseaDnNew.setWerksReceive(doc.getString("WERKS"));//收货工厂
                            overseaDnNew.setWhsLocationCodeReceive(doc.getString("LGORT"));//收货仓库
                            if("03".equals(businessType)){//海外转储的交货单用ZSHD代替
                                String sapDeliveryNoteRela = doc.getString("VBELN1");
                                overseaDnNew.setSapDeliveryNoteRela(sapDeliveryNoteRela);
                            }
//                            overseaDnNew.setSapCreateDate(doc.getString("ERDAT"));//DN创建日期
//                            overseaDnNew.setDeliveryDate(doc.getString("LFDAT"));//SAP DN交货日期
                            overseaDnNew.setBusinessType(businessType);
                            overseaDnNew.setMandt(doc.getString("MANDT"));

                            overseaDnNew.setSpmsStatus(DN_WAITING.getCode());
                            overseaDnNew.setDataStatus(DATA_STATUS_0);

                            QueryWrapper<OverseaDn> queryWrapper = new QueryWrapper<OverseaDn>().eq("SAP_DELIVERY_NOTE", sapDeliveryNoteNew);
                            OverseaDn dn = iOverseaDnService.getOne(queryWrapper);
                            if (dn != null){
                                if (DATA_STATUS_0.equals(dn.getDataStatus())){
                                    iOverseaDnService.update(overseaDnNew, queryWrapper);
                                    iOverseaOperateLogService.addOverseaOperateLog(userId, sapDeliveryNoteNew, DN_UPDATE.getDescZh(), DN_UPDATE.getDescEn(), SAP, DN_UPDATE.getDescRu());
                                } else {
                                    log.info("=======空运人带/转储/本地采购 交货单" + sapDeliveryNoteNew + "已经在收货中更新失败========");
                                }
                            } else {
                                overseaDnNew.setUuidDeliveryNote(getUuid());
                                iOverseaDnService.save(overseaDnNew);
                                iOverseaOperateLogService.addOverseaOperateLog(userId, sapDeliveryNoteNew, DN_WAITING.getDescZh(), DN_WAITING.getDescEn(), SAP, DN_WAITING.getDescRu());
                            }
                        });

                    }

//                    /** IT_LIKP —— 交货单表 ——— 空运人带/转储/本地采购收货 */
//                    JSONArray IT_LIKP = returnData.getJSONArray("IT_LIKP");
//                    if (IT_LIKP != null){
//                        insertOverseaDn(IT_LIKP, businessType,userId);
//                    }
//
//
//                    /** IT_LIPS —— 交货单明细表 ——— 空运人带/转储/本地采购收货 */
//                    JSONArray IT_LIPS = returnData.getJSONArray("IT_LIPS");
//                    if (IT_LIPS != null){
//                        insertOverseaDnDtl(IT_LIPS);
//                    }
//
//                    /** IT_EKKO —— 采购订单表表头 ——— 空运人带/转储/本地采购收货 */
//                    JSONArray IT_EKKO = returnData.getJSONArray("IT_EKKO");
//                    if (IT_EKKO != null){
//                        insertOverseaPurchaseOrder(IT_EKKO, businessType);
//                    }
//
//                    /** IT_EKPO —— 采购订单表明细 ——— 空运人带/转储/本地采购收货 */
//                    JSONArray IT_EKPO = returnData.getJSONArray("IT_EKPO");
//                    if (IT_EKPO != null){
//                        insertOverseaPurchaseOrderDtl(IT_EKPO);
//                    }

                    return ResponseResult.success()
                            .add("dataToSap", dataToSap)
                            .add("sapReturnedMessage", message);
                } else {
                    return ResponseResult.error().add("dataToSap", dataToSap).add("sapReturnedMessage", message);
                }
            }

        } catch (FeignException feignException) {
            feignException.printStackTrace();
            return ResponseResult.error("请求SAP失败 FeignException").add("error", feignException.getMessage());
        } catch (Exception e){
            e.printStackTrace();
            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
            return ResponseResult.error().add("error", e.getMessage());
        }
    }

    JSONObject formatDataGetDn(String sapDeliveryNote, String businessType, String purchaseOrder,
                               String deliveryDateS, String deliveryDateE, String werks){
        Map<String, Object> map = new HashMap<>();
        String operation = "ZZXD_IF_SPMS_03";//海外转储：03，空运人带：01从新的装箱单接口获取
        if("02".equals(businessType)){
            map.put("I_DATEE", StringUtils.isEmpty(deliveryDateE) ? "" : deliveryDateE.replaceAll("-", ""));
            map.put("I_DATES", StringUtils.isEmpty(deliveryDateS) ? "" : deliveryDateS.replaceAll("-", ""));
            map.put("I_EBELN", StringUtils.isEmpty(purchaseOrder) ? "" : purchaseOrder);
            map.put("I_FLAG", businessType);
            map.put("I_VBELN", StringUtils.isEmpty(sapDeliveryNote) ? "" : sapDeliveryNote);
            map.put("I_WERKS", StringUtils.isEmpty(werks) ? "" : werks);
            operation = "Z_SPMS_GETHWDN";//海外当地采购依旧使用旧接口
        }else{
            map.put("DATES_F", StringUtils.isEmpty(deliveryDateS) ? "" : deliveryDateS.replaceAll("-", ""));
            map.put("DATES_T", StringUtils.isEmpty(deliveryDateE) ? "" : deliveryDateE.replaceAll("-", ""));
            map.put("VBELN", StringUtils.isEmpty(sapDeliveryNote) ? "" : sapDeliveryNote);
            map.put("EBELN", StringUtils.isEmpty(purchaseOrder) ? "" : purchaseOrder);
           // map.put("XDNUM", StringUtils.isEmpty(sapPackageList) ? "" : sapPackageList);
            map.put("TYPE_D", businessType);
            map.put("SYSTEM_IN", "SPMS");
            map.put("ZBS", "");
            map.put("WERKS", StringUtils.isEmpty(werks) ? "" : werks);

            // 根据工厂查询对应的SAP Clinet
            List<ZSapOrgClient> selectList = zSapOrgClientMapper.selectList(new QueryWrapper<ZSapOrgClient>().eq("WERKS", werks));
            if (CollectionUtils.isNotEmpty(selectList)) {
                map.put("MANDT", selectList.get(0).getZmandt());
            } else {
               // throw new Exception("工厂："+werks+"未找到对应的SAP Clinet");
            }
        }
        return iFormatDataToSapService.formatDataToSap(map, null, operation, GETHWDN);
    }

    /** IT_LIKP —— 交货单表 ——— 空运人带/转储/本地采购收货 */
    synchronized void insertOverseaDn(JSONArray IT_LIKP, String sapBusinessType, String userId){
        int arraySize = IT_LIKP.size();
        if (arraySize > 0){
            for (int i = 0; i < arraySize; i ++){
                JSONObject doc = IT_LIKP.getJSONObject(i);
                String sapDeliveryNote = doc.getString("VBELN");

                OverseaDn overseaDn = new OverseaDn();
                overseaDn.setSapDeliveryNote(sapDeliveryNote);
                overseaDn.setWerksReceive(doc.getString("WERKS"));
                String erdat = doc.getString("ERDAT");
                overseaDn.setSapCreateDate(erdat);
//                if (StringUtils.isNotEmpty(erdat)) {
//                	Date date = new Date(Long.valueOf(erdat));
//                	overseaDn.setSapCreateDate(SDF.format(date));
//                }
                String lfdat = doc.getString("LFDAT");
                overseaDn.setDeliveryDate(lfdat);
//                if (StringUtils.isNotEmpty(lfdat)) {
//                	Date date = new Date(Long.valueOf(lfdat));
//                	overseaDn.setDeliveryDate(SDF.format(date));
//                }
                overseaDn.setBusinessType(sapBusinessType);
                overseaDn.setMandt(doc.getString("MANDT"));

                overseaDn.setSpmsStatus(DN_WAITING.getCode());
                overseaDn.setDataStatus(DATA_STATUS_0);

                QueryWrapper<OverseaDn> queryWrapper = new QueryWrapper<OverseaDn>().eq("SAP_DELIVERY_NOTE", sapDeliveryNote);
                OverseaDn dn = iOverseaDnService.getOne(queryWrapper);
                if (dn != null){
                    if (DATA_STATUS_0.equals(dn.getDataStatus())){
                        iOverseaDnService.update(overseaDn, queryWrapper);
                        iOverseaOperateLogService.addOverseaOperateLog(userId, sapDeliveryNote, DN_UPDATE.getDescZh(), DN_UPDATE.getDescEn(), SAP, DN_UPDATE.getDescRu());
                    } else {
                        log.info("=======空运人带/转储/本地采购 交货单" + sapDeliveryNote + "已经在收货中更新失败========");
                    }
                } else {
                    overseaDn.setUuidDeliveryNote(getUuid());
                    iOverseaDnService.save(overseaDn);
                    iOverseaOperateLogService.addOverseaOperateLog(userId, sapDeliveryNote, DN_WAITING.getDescZh(), DN_WAITING.getDescEn(), SAP, DN_WAITING.getDescRu());
                }

            }
        }
    }

    /** IT_LIPS —— 交货单明细表 ——— 空运人带/转储/本地采购收货 */
    synchronized void insertOverseaDnDtl(JSONArray IT_LIPS){
        int arraySize = IT_LIPS.size();
        if (arraySize > 0) {

            /** 交货单明细信息，在更新之前先将DN明细行里数据状态字段值为0的行全都删除，再依据SAP返回信息建立新的交货单明细行 */
            Set<String> dnSet = new HashSet<>();
            for (int i = 0; i < arraySize; i++) {
                String dn = IT_LIPS.getJSONObject(i).getString("VBELN");
                if (StringUtils.isNotEmpty(dn)){
                    dnSet.add(dn);
                }
            }
            QueryWrapper<OverseaDnDtl> overseaDnDtlQueryWrapper =
                    new QueryWrapper<OverseaDnDtl>().in("SAP_DELIVERY_NOTE", dnSet).eq("DATA_STATUS", "0");
            iOverseaDnDtlService.remove(overseaDnDtlQueryWrapper);

            for (int i = 0; i < arraySize; i++) {
                JSONObject doc = IT_LIPS.getJSONObject(i);

                String sapDeliveryNote = doc.getString("VBELN");
                String sapDeliveryNoteItem = String.valueOf(doc.getInteger("POSNR"));

                OverseaDnDtl overseaDnDtl = new OverseaDnDtl();
                overseaDnDtl.setSapDeliveryNote(sapDeliveryNote);
                overseaDnDtl.setSapDeliveryNoteItem(sapDeliveryNoteItem);
                overseaDnDtl.setWerksReceive(doc.getString("WERKS"));
                overseaDnDtl.setSapPurchaseOrder(doc.getString("VGBEL"));
                overseaDnDtl.setSapPurchaseOrderItem(String.valueOf(doc.getInteger("VGPOS")));
                overseaDnDtl.setWerksDelivery(doc.getString("WERKS_FH"));
                overseaDnDtl.setWhsLocationCodeDelivery(doc.getString("LGORT"));
                overseaDnDtl.setMaterialNo(StringUtils.isEmpty(doc.getString("MATNR")) ?
                        "" : String.valueOf(Long.parseLong(doc.getString("MATNR"))));
                overseaDnDtl.setUnitSales(doc.getString("VRKME"));
                overseaDnDtl.setReceivableQtyUnitSales(doc.getDoubleValue("LFIMG"));
                overseaDnDtl.setBasicUnit(doc.getString("MEINS"));
                overseaDnDtl.setReceivableQtyBasicUnit(doc.getDoubleValue("LGMNG"));
                overseaDnDtl.setBoxNote(doc.getString("PACKAGE_CODE"));
                overseaDnDtl.setBoxNoteItem(String.valueOf(doc.getInteger("SERIAL")));
                overseaDnDtl.setDomesticActualQty(doc.getDoubleValue("GNCKSL"));
                overseaDnDtl.setDemandNo(doc.getString("DEMAND_NO"));
                overseaDnDtl.setDemandItem(String.valueOf(doc.getInteger("DEMAND_POSNR")));
                overseaDnDtl.setDemander(doc.getString("DEMANDER"));
                overseaDnDtl.setDataStatus(DATA_STATUS_0);

                QueryWrapper<OverseaDnDtl> queryWrapper = new QueryWrapper<OverseaDnDtl>()
                        .eq("SAP_DELIVERY_NOTE", sapDeliveryNote).eq("SAP_DELIVERY_NOTE_ITEM", sapDeliveryNoteItem);
                OverseaDnDtl dnDtl = iOverseaDnDtlService.getOne(queryWrapper);

                if (dnDtl != null){
                    if (DATA_STATUS_0.equals(dnDtl.getDataStatus())){
                        iOverseaDnDtlService.update(overseaDnDtl, queryWrapper);
                    } else {
                        log.info("=======空运人带/转储/本地采购 交货单" + sapDeliveryNote + " 行号" + sapDeliveryNoteItem + "已经在收货中更新失败========");
                    }
                } else {
                    iOverseaDnDtlService.save(overseaDnDtl);
                }

            }
        }
    }

    /** IT_EKKO —— 采购订单表表头 ——— 空运人带/转储/本地采购收货 */
    synchronized void insertOverseaPurchaseOrder(JSONArray IT_EKKO, String sapBusinessType){
        int arraySize = IT_EKKO.size();
        if (arraySize > 0) {
            for (int i = 0; i < arraySize; i ++) {
                JSONObject doc = IT_EKKO.getJSONObject(i);
                String sapPurchaseOrder = doc.getString("EBELN");

                OverseaPurchaseOrder overseaPurchaseOrder = new OverseaPurchaseOrder();
                overseaPurchaseOrder.setSapPurchaseOrder(sapPurchaseOrder);
                overseaPurchaseOrder.setBusinessType(sapBusinessType);
                overseaPurchaseOrder.setSapCreateDate(doc.getString("AEDAT"));
                overseaPurchaseOrder.setVoucherType(doc.getString("BSART"));
                overseaPurchaseOrder.setPurchaseGroup(doc.getString("EKGRP"));
                overseaPurchaseOrder.setPurchaseOrg(doc.getString("EKORG"));
                overseaPurchaseOrder.setSupplierCode(doc.getString("LIFNR"));
                overseaPurchaseOrder.setSupplierDesc("");
                overseaPurchaseOrder.setCreateUser(doc.getString("ERNAM"));
                overseaPurchaseOrder.setDataStatus(DATA_STATUS_0);

                QueryWrapper<OverseaPurchaseOrder> queryWrapper = new QueryWrapper<OverseaPurchaseOrder>().eq("SAP_PURCHASE_ORDER", sapPurchaseOrder);
                OverseaPurchaseOrder purchaseOrder = iOverseaPurchaseOrderService.getOne(queryWrapper);

                if (purchaseOrder != null){
                    if (DATA_STATUS_0.equals(purchaseOrder.getDataStatus())){
                        iOverseaPurchaseOrderService.update(overseaPurchaseOrder, queryWrapper);
                    } else {
                        log.info("=======空运人带/转储/本地采购 采购订单" + sapPurchaseOrder + "已经在收货中更新失败========");
                    }
                } else {
                    overseaPurchaseOrder.setUuidPurchaseOrder(getUuid());
                    iOverseaPurchaseOrderService.save(overseaPurchaseOrder);
                }
            }
        }
    }

    /** IT_EKPO —— 采购订单表明细 ——— 空运人带/转储/本地采购收货 */
    synchronized void insertOverseaPurchaseOrderDtl(JSONArray IT_EKPO){
        int arraySize = IT_EKPO.size();
        if (arraySize > 0) {

            /** 采购订单表明细信息，在更新之前先将PO明细行里数据状态字段值为0的行全都删除，再依据SAP返回信息建立新的采购订单单明细行 */
            Set<String> poSet = new HashSet<>();
            for (int i = 0; i < arraySize; i++) {
                String dn = IT_EKPO.getJSONObject(i).getString("EBELN");
                if (StringUtils.isNotEmpty(dn)){
                    poSet.add(dn);
                }
            }
            QueryWrapper<OverseaPurchaseOrderDtl> purchaseOrderDtlQueryWrapper =
                    new QueryWrapper<OverseaPurchaseOrderDtl>().in("SAP_PURCHASE_ORDER", poSet).eq("DATA_STATUS", "0");
            iOverseaPurchaseOrderDtlService.remove(purchaseOrderDtlQueryWrapper);

            for (int i = 0; i < arraySize; i ++){
                JSONObject doc = IT_EKPO.getJSONObject(i);
                String sapPurchaseOrder = doc.getString("EBELN");
                String sapPurchaseOrderItem = String.valueOf(doc.getInteger("EBELP"));

                OverseaPurchaseOrderDtl overseaPurchaseOrderDtl = new OverseaPurchaseOrderDtl();
                overseaPurchaseOrderDtl.setSapPurchaseOrder(sapPurchaseOrder);
                overseaPurchaseOrderDtl.setSapPurchaseOrderItem(sapPurchaseOrderItem);
                overseaPurchaseOrderDtl.setWhsLocationCodeReceive(doc.getString("LGORT"));
                overseaPurchaseOrderDtl.setMaterialNo(StringUtils.isEmpty(doc.getString("MATNR")) ?
                        "" : String.valueOf(Long.parseLong(doc.getString("MATNR"))));
                overseaPurchaseOrderDtl.setMaterialZhDesc(doc.getString("TXZ01"));
                overseaPurchaseOrderDtl.setBasicUnit(doc.getString("MEINS"));
                overseaPurchaseOrderDtl.setReceivableQtyBasicUnit(doc.getDoubleValue("MENGE"));
                overseaPurchaseOrderDtl.setReturnMark(doc.getString("RETPO"));
                overseaPurchaseOrderDtl.setWerksReceive(doc.getString("WERKS"));
                overseaPurchaseOrderDtl.setDataStatus(DATA_STATUS_0);

                QueryWrapper<OverseaPurchaseOrderDtl> queryWrapper = new QueryWrapper<OverseaPurchaseOrderDtl>()
                        .eq("SAP_PURCHASE_ORDER", sapPurchaseOrder).eq("SAP_PURCHASE_ORDER_ITEM", sapPurchaseOrderItem);
                OverseaPurchaseOrderDtl purchaseOrderDtl = iOverseaPurchaseOrderDtlService.getOne(queryWrapper);

                if (purchaseOrderDtl != null){
                    if (DATA_STATUS_0.equals(purchaseOrderDtl.getDataStatus())){
                        iOverseaPurchaseOrderDtlService.update(overseaPurchaseOrderDtl, queryWrapper);
                    } else {
                        log.info("=======空运人带/转储/本地采购 采购订单" + sapPurchaseOrder + " 行号" + sapPurchaseOrderItem + "已经在收货中更新失败========");
                    }
                } else {
                    iOverseaPurchaseOrderDtlService.save(overseaPurchaseOrderDtl);
                }

            }
        }
    }
}











