package com.sunda.spmswms.service.impl;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
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.spmscommon.service.ISysLogMqService;
import com.sunda.spmswms.entity.SapBoxNote;
import com.sunda.spmswms.entity.SapBoxNoteDtl;
import com.sunda.spmswms.entity.SapDeliveryNote;
import com.sunda.spmswms.entity.SapDeliveryNoteBatchReceipt;
import com.sunda.spmswms.entity.SapDeliveryNoteBatchReceiptDtl;
import com.sunda.spmswms.entity.SapDeliveryNoteDtl;
import com.sunda.spmswms.entity.SapPackageNote;
import com.sunda.spmswms.entity.ShelfOnTask;
import com.sunda.spmswms.entity.ShelfOnTaskDtl;
import com.sunda.spmswms.entity.Werks;
import com.sunda.spmswms.entity.WhsInventoryInfo;
import com.sunda.spmswms.entity.WhsStorage;
import com.sunda.spmswms.entity.WhsStorageInventory;
import com.sunda.spmswms.enums.WmsBatchReceiptEnum;
import com.sunda.spmswms.mapper.SapDeliveryNoteBatchReceiptMapper;
import com.sunda.spmswms.mapper.WhsInventoryInfoMapper;
import com.sunda.spmswms.service.ISapBoxNoteDtlService;
import com.sunda.spmswms.service.ISapBoxNoteService;
import com.sunda.spmswms.service.ISapDeliveryNoteBatchReceiptDtlService;
import com.sunda.spmswms.service.ISapDeliveryNoteBatchReceiptService;
import com.sunda.spmswms.service.ISapDeliveryNoteDtlService;
import com.sunda.spmswms.service.ISapDeliveryNoteLogService;
import com.sunda.spmswms.service.ISapDeliveryNoteService;
import com.sunda.spmswms.service.ISapPackageNoteService;
import com.sunda.spmswms.service.IShelfOnTaskDtlService;
import com.sunda.spmswms.service.IShelfOnTaskService;
import com.sunda.spmswms.service.IWerksService;
import com.sunda.spmswms.service.IWhsInventoryInfoService;
import com.sunda.spmswms.service.IWhsOperateLogService;
import com.sunda.spmswms.service.IWhsStorageInventoryService;
import com.sunda.spmswms.service.IWhsStorageService;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.google.common.collect.Lists;

import static com.sunda.spmscommon.Constans.TRADE_GOODS_INTO_STORAGE;
import static com.sunda.spmscommon.Constans.CLOSE_SHELF_ON_TASK;
import static com.sunda.spmscommon.Constans.CLOSE_DEDUCT_SHELF_TASK;
import static com.sunda.spmscommon.Constans.GOODS_OUT_STORAGE;
import static com.sunda.spmscommon.Constans.SPARE_PARTS_INTO_WHS;
import static com.sunda.spmscommon.Constans.SPARE_PARTS_OUT_STORAGE;
import static com.sunda.spmscommon.Constans.SPARE_PARTS_OUT_WHS;

import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import java.util.stream.Collectors;

import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.time.DateFormatUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;

/**
 * <p>
 * 国内仓收货入库分批收货表 服务实现类
 * </p>
 *
 * @author Wayne
 * @since 2023-06-16
 */
@Service
@Slf4j
public class SapDeliveryNoteBatchReceiptServiceImpl extends ServiceImpl<SapDeliveryNoteBatchReceiptMapper, SapDeliveryNoteBatchReceipt> implements ISapDeliveryNoteBatchReceiptService {
	
	@Autowired
	ISapDeliveryNoteBatchReceiptDtlService iSapDeliveryNoteBatchReceiptDtlService;
	
	@Autowired
	ISapDeliveryNoteLogService iSapDeliveryNoteLogService;
	
	@Autowired
	ISapDeliveryNoteDtlService iSapDeliveryNoteDtlService;
	
	@Autowired
	ISapDeliveryNoteService iSapDeliveryNoteService;

	@Autowired
	ISapPackageNoteService iSapPackageNoteService;
	
	@Autowired
	ISapBoxNoteService iSapBoxNoteService;
	
	@Autowired
	ISapBoxNoteDtlService iSapBoxNoteDtlService;
	
	@Autowired
	IShelfOnTaskService iShelfOnTaskService;
	
	@Autowired
	IShelfOnTaskDtlService iShelfOnTaskDtlService;
	
	@Autowired
    ISapDeliveryNoteLogService logService;
	
	@Autowired
	IWhsInventoryInfoService iWhsInventoryInfoService;
	
	@Autowired
	IWhsStorageService iWhsStorageService;
	
	@Autowired
	WhsInventoryInfoMapper whsInventoryInfoMapper;
	
	@Autowired
	IWerksService iWerksService;
	
	@Autowired
	IFeignServiceCommon iFeignServiceCommon;
	
	@Autowired
	ISysLogMqService iSysLogMqService;
	
	@Autowired
	IWhsStorageInventoryService iWhsStorageInventoryService;
	
	@Autowired
	IWhsOperateLogService iWhsOperateLogService;
	
	@Autowired
	ZSapOrgClientMapper zSapOrgClientMapper;

	@Autowired
	private ThreadPoolTaskExecutor taskExcuteor;

	@Value("${zxd.sap.client}")
    private String zxdSapClient;

	@Override
	public List<Map<String, Object>> getSapDeliveryNoteBatchReceiptList(String deliveryNoteSap) {
		List<Map<String, Object>> list = this.baseMapper.selectBatchReceiptHeadList(deliveryNoteSap);
		return list;
	}

	@Override
	public Page<Map<String, Object>> selectBatchReceiptHeadPage(int pageNo, int pageSize, String deliveryNoteSap, String werks, String whsLocationCode, String spmsStatus, String werksList) {
		pageNo = pageNo <= 0 ? 1 : pageNo;
		pageSize = pageSize <= 0 ? 20 : pageSize;
		deliveryNoteSap = com.baomidou.mybatisplus.core.toolkit.StringUtils.isNotEmpty(deliveryNoteSap) ? deliveryNoteSap : null;
		werks = com.baomidou.mybatisplus.core.toolkit.StringUtils.isNotEmpty(werks) ? werks : null;
		whsLocationCode = com.baomidou.mybatisplus.core.toolkit.StringUtils.isNotEmpty(whsLocationCode) ? whsLocationCode : null;
		spmsStatus = com.baomidou.mybatisplus.core.toolkit.StringUtils.isNotEmpty(spmsStatus) ? spmsStatus : null;
		List<String> werksLists = com.baomidou.mybatisplus.core.toolkit.StringUtils.isNotEmpty(werksList) ? (List) JSON.parseArray(werksList) : null;
		Page<Map<String, Object>> pages = new Page<>(pageNo, pageSize);
		List<Map<String, Object>> pageMaData = this.baseMapper.selectBatchReceiptHeadPage(pages, deliveryNoteSap, werks, whsLocationCode, spmsStatus, werksLists);
		pages.setRecords(pageMaData);
		return pages;
	}


	@Override
	public ResponseResult selectBatchReceipt(String uuid) {
		// 查询分批收货头信息
		Map<String, Object> head = this.baseMapper.selectBatchReceiptHead(uuid);
		// 查询分批收货行信息
		List<Map<String, Object>> list = this.baseMapper.selectBatchReceiptDtl(head.get("spmsId").toString());
		return ResponseResult.success().add("head", head).add("itemList", list);
	}

	@Override
	@Transactional(rollbackFor = Exception.class)
	public ResponseResult saveSapDeliveryNoteBatchReceipt(JSONObject obj, String userId) throws Exception {
		JSONObject headObj = obj.containsKey("batchReceiptHead") ? obj.getJSONObject("batchReceiptHead") : null;
        JSONArray itemsObj = obj.containsKey("batchReceiptDtl") ? obj.getJSONArray("batchReceiptDtl") : null;
        if (headObj == null || itemsObj == null) {
        	return ResponseResult.error("Error, batchReceiptHead or batchReceiptDtl missed from the parameters, please double check");
        }
        SapDeliveryNoteBatchReceipt head = headObj.toJavaObject(SapDeliveryNoteBatchReceipt.class);
        // 判断头部必填信息
        if (StringUtils.isBlank(head.getWerks())) {
			return ResponseResult.error("工厂代码不能为空");
		}
		if (StringUtils.isBlank(head.getLocationCode())) {
			return ResponseResult.error("仓库代码不能为空");
		}
		if (StringUtils.isBlank(head.getDeliveryNoteSap())) {
			return ResponseResult.error("关联的SAP交货单号不能为空");
		}
		// 贸易货需要验证物料是否为备件类型，是不能收货
		for (int i = 0; i < itemsObj.size(); i++) {
    		SapDeliveryNoteBatchReceiptDtl item = itemsObj.getObject(i, SapDeliveryNoteBatchReceiptDtl.class);
			if (StringUtils.isNotBlank(item.getMaterialNo()) && StringUtils.isBlank(item.getDeliveryNoteSapItem())) {
				return ResponseResult.error("行项目中关联的交货单行号不能为空");
			}
			if (StringUtils.isBlank(item.getMaterialNo()) && StringUtils.isBlank(item.getBoxNote())) {
				return ResponseResult.error("行项目中关联的箱码不能为空");
			}
			if (StringUtils.isNotBlank(item.getMaterialNo())) {
				Map<String, Object> map = this.baseMapper.getMaterialSapInfo(item.getMaterialNo());
				if (map != null && map.get("spmsMark") != null && "X".equals(map.get("spmsMark").toString())){
					return ResponseResult.error().add("error", "贸易货交货单" + head.getDeliveryNoteSap() + "中存在备件物料" + map.get("materialNo").toString() + "，请检查数据是否正确");
				}
			}
		}
		// 保存头部信息
		if (StringUtils.isBlank(head.getUuid())) {
        	// 新建
        	String uuid = UUID.randomUUID().toString().replaceAll("-", "").toLowerCase();
        	head.setUuid(uuid);
        	head.setSpmsStatus(WmsBatchReceiptEnum.SAVE.getCode());
        	head.setCreateUserid(userId);
        	head.setCreateTime(new Date());
        	this.baseMapper.insert(head);
        } else {
        	head.setUpdateTime(new Date());
        	head.setUpdateUserid(userId);
        	this.baseMapper.updateById(head);
        }
		SapDeliveryNoteBatchReceipt selectHead = this.baseMapper.selectById(head.getUuid());
		List<SapDeliveryNoteBatchReceiptDtl> itemList = new ArrayList<SapDeliveryNoteBatchReceiptDtl>();
    	int itemNum = 10;
    	for (int i = 0; i < itemsObj.size(); i++) {
    		SapDeliveryNoteBatchReceiptDtl item = itemsObj.getObject(i, SapDeliveryNoteBatchReceiptDtl.class);
			String itemUuid = UUID.randomUUID().toString().replaceAll("-", "").toLowerCase();
			item.setUuid(itemUuid);
			item.setSpmsId(selectHead.getSpmsId());
			item.setDeliveryNoteSap(selectHead.getDeliveryNoteSap());
			item.setItem(itemNum+"");
			itemList.add(item);
			itemNum += 10;
		}
    	// 先删除
    	QueryWrapper<SapDeliveryNoteBatchReceiptDtl> dtlQuery = new QueryWrapper<SapDeliveryNoteBatchReceiptDtl>().eq("SPMS_ID", selectHead.getSpmsId());
    	iSapDeliveryNoteBatchReceiptDtlService.remove(dtlQuery);
    	// 再保存
    	iSapDeliveryNoteBatchReceiptDtlService.saveBatch(itemList);

    	iSapDeliveryNoteLogService.insertSapRequestRecord(selectHead.getSpmsId(), userId, WmsBatchReceiptEnum.SAVE.getDescZh(), null, JSON.toJSONString(obj));
		return ResponseResult.success().add("batchReceiptHead", selectHead).add("batchReceiptDtl", itemList);
	}

	@Override
	@Transactional(rollbackFor = Exception.class)
	public ResponseResult submitWmsBatchReceipt(JSONObject obj, String userId) throws Exception {
		JSONObject headObj = obj.containsKey("batchReceiptHead") ? obj.getJSONObject("batchReceiptHead") : null;
        JSONArray itemsObj = obj.containsKey("batchReceiptDtl") ? obj.getJSONArray("batchReceiptDtl") : null;
        if (headObj == null || itemsObj == null) {
        	return ResponseResult.error("Error, batchReceiptHead or batchReceiptDtl missed from the parameters, please double check");
        }
        SapDeliveryNoteBatchReceipt head = headObj.toJavaObject(SapDeliveryNoteBatchReceipt.class);
        // 判断头部必填信息
        if (StringUtils.isBlank(head.getWerks())) {
			return ResponseResult.error("工厂代码不能为空");
		}
		if (StringUtils.isBlank(head.getLocationCode())) {
			return ResponseResult.error("仓库代码不能为空");
		}
		if (StringUtils.isBlank(head.getDeliveryNoteSap())) {
			return ResponseResult.error("关联的SAP交货单号不能为空");
		}
		// 贸易货需要验证物料是否为备件类型，是不能收货
		for (int i = 0; i < itemsObj.size(); i++) {
    		SapDeliveryNoteBatchReceiptDtl item = itemsObj.getObject(i, SapDeliveryNoteBatchReceiptDtl.class);
    		if (StringUtils.isNotBlank(item.getMaterialNo()) && StringUtils.isBlank(item.getDeliveryNoteSapItem())) {
				return ResponseResult.error("行项目中关联的交货单行号不能为空");
			}
			if (StringUtils.isBlank(item.getMaterialNo()) && StringUtils.isBlank(item.getBoxNote())) {
				return ResponseResult.error("行项目中关联的箱码不能为空");
			}
			if ((StringUtils.isNotBlank(item.getMaterialNo()) && (StringUtils.isBlank(item.getTempStorage()) || JSONArray.parseArray(item.getTempStorage(), Map.class).size() == 0)) ||
					(StringUtils.isNotBlank(item.getBoxNote()) && StringUtils.isBlank(item.getStorageUuid()))) {
				return ResponseResult.error("行项目中储位信息不能为空");
			}
			if (item.getReceivedQty() == null || (StringUtils.isNotBlank(item.getMaterialNo()) && item.getReceivedQty() == 0)) {
				return ResponseResult.error("行项目中实收数量不能为空");
			}
			if (StringUtils.isNotBlank(item.getMaterialNo())) {
				Map<String, Object> map = this.baseMapper.getMaterialSapInfo(item.getMaterialNo());
				if (map != null && map.get("spmsMark") != null && "X".equals(map.get("spmsMark").toString())){
					return ResponseResult.error().add("error", "贸易货交货单" + head.getDeliveryNoteSap() + "中存在备件物料" + map.get("materialNo").toString() + "，请检查数据是否正确");
				}
			}
		}
		// 保存头部信息
		head.setSpmsStatus(WmsBatchReceiptEnum.SUBMITTED.getCode());
		if (StringUtils.isBlank(head.getUuid())) {
        	// 新建
        	String uuid = UUID.randomUUID().toString().replaceAll("-", "").toLowerCase();
        	head.setUuid(uuid);
        	head.setCreateUserid(userId);
        	head.setCreateTime(new Date());
        	this.baseMapper.insert(head);
        } else {
        	SapDeliveryNoteBatchReceipt selectHead = this.baseMapper.selectById(head.getUuid());
        	if (WmsBatchReceiptEnum.SUBMITTED.getCode().equals(selectHead.getSpmsStatus()) || WmsBatchReceiptEnum.SUBMITTED_SAP.getCode().equals(selectHead.getSpmsStatus()) || 
        			WmsBatchReceiptEnum.SUBMIT_SAP_ERROR.getCode().equals(selectHead.getSpmsStatus())) {
        		return ResponseResult.error("单据状态已更新，请重新刷新后再试");
        	}
        	head.setUpdateTime(new Date());
        	head.setUpdateUserid(userId);
        	this.baseMapper.updateById(head);
        }
		SapDeliveryNoteBatchReceipt selectHead = this.baseMapper.selectById(head.getUuid());
		List<SapDeliveryNoteBatchReceiptDtl> itemList = new ArrayList<SapDeliveryNoteBatchReceiptDtl>();
    	int itemNum = 10;
    	for (int i = 0; i < itemsObj.size(); i++) {
    		SapDeliveryNoteBatchReceiptDtl item = itemsObj.getObject(i, SapDeliveryNoteBatchReceiptDtl.class);
			String itemUuid = UUID.randomUUID().toString().replaceAll("-", "").toLowerCase();
			item.setUuid(itemUuid);
			item.setSpmsId(selectHead.getSpmsId());
			item.setDeliveryNoteSap(selectHead.getDeliveryNoteSap());
			item.setItem(itemNum+"");
			itemList.add(item);
			itemNum += 10;
		}
    	// 先删除
    	QueryWrapper<SapDeliveryNoteBatchReceiptDtl> dtlQuery = new QueryWrapper<SapDeliveryNoteBatchReceiptDtl>().eq("SPMS_ID", selectHead.getSpmsId());
    	iSapDeliveryNoteBatchReceiptDtlService.remove(dtlQuery);
    	// 再保存
    	iSapDeliveryNoteBatchReceiptDtlService.saveBatch(itemList);
    	// 保存日志
    	iSapDeliveryNoteLogService.insertSapRequestRecord(selectHead.getSpmsId(), userId, WmsBatchReceiptEnum.SUBMITTED.getDescZh(), null, JSON.toJSONString(obj));
		// 在提交的时候将实收数量回写到交货单行项目中
    	// 查询分批收货行项目
    	QueryWrapper<SapDeliveryNoteBatchReceiptDtl> eq = new QueryWrapper<SapDeliveryNoteBatchReceiptDtl>().eq("SPMS_ID", selectHead.getSpmsId());
    	List<SapDeliveryNoteBatchReceiptDtl> list = iSapDeliveryNoteBatchReceiptDtlService.list(eq);
    	// 判断关联的收货入库行项目是否已完成收货，如果是此单就不能再提交
    	for (SapDeliveryNoteBatchReceiptDtl dtl : list) {
    		if (StringUtils.isNotBlank(dtl.getDeliveryNoteSap()) && StringUtils.isNotBlank(dtl.getDeliveryNoteSapItem())) {
    			// 贸易货
    			QueryWrapper<SapDeliveryNoteDtl> noteQuery = new QueryWrapper<SapDeliveryNoteDtl>().eq("DELIVERY_NOTE_SAP", dtl.getDeliveryNoteSap()).eq("DELIVERY_NOTE_SAP_ITEM", dtl.getDeliveryNoteSapItem());
    			SapDeliveryNoteDtl note = iSapDeliveryNoteDtlService.getOne(noteQuery);
    			if (note == null || "1".equals(note.getReceivedStatus())) {
    				return ResponseResult.error("分批收货行号："+dtl.getItem()+"，关联的交货单："+dtl.getDeliveryNoteSap()+"，交货单行号："+dtl.getDeliveryNoteSapItem()+"，已收货完成，不能再进行分批收货！");
    			}
    		} else if (StringUtils.isNotBlank(dtl.getBoxNote())) {
    			// 备件货
    			QueryWrapper<SapBoxNote> noteQuery = new QueryWrapper<SapBoxNote>().eq("BOX_NOTE", dtl.getBoxNote());
    			SapBoxNote box = iSapBoxNoteService.getOne(noteQuery);
    			if (box == null || "1".equals(box.getReceivedStatus())) {
    				return ResponseResult.error("分批收货行号："+dtl.getItem()+"，关联的箱码："+dtl.getBoxNote()+"，已收货完成，不能再进行分批收货！");
    			}
    		}
    	}
    	String pdaSn = "WebClient";
    	// 将分批收货的实收数量回写到交货单行项目中的实收数量字段上
    	this.updateDeliveryItemQuantity(selectHead, list, userId, pdaSn);
    	return ResponseResult.success().add("batchReceiptHead", selectHead).add("batchReceiptDtl", itemList);
	}

	@Override
	@Transactional(rollbackFor = Exception.class)
	public synchronized ResponseResult submitToSap(JSONObject obj, String userId) throws Exception {
		String nowDate = DateFormatUtils.format(new Date(), "yyyy-MM-dd HH:mm:ss");
		log.info("国内仓收货入库提交SAP开始："+nowDate+"---"+obj.toJSONString());
//		String pdaSn = "WebClient";
		JSONObject headObj = obj.containsKey("batchReceiptHead") ? obj.getJSONObject("batchReceiptHead") : null;
        if (headObj == null) {
        	return ResponseResult.error("Error, batchReceiptHead missed from the parameters, please double check");
        }
        SapDeliveryNoteBatchReceipt head = headObj.toJavaObject(SapDeliveryNoteBatchReceipt.class);
        if (StringUtils.isBlank(head.getPostingDate())) {
			return ResponseResult.error("过账日期不能为空");
		}
        SapDeliveryNoteBatchReceipt selectHead = this.baseMapper.selectById(head.getUuid());
    	if (selectHead == null) {
    		return ResponseResult.error("分批收货任务不存在，请检查数据！");
    	}
		String nowDate1 = DateFormatUtils.format(new Date(), "yyyy-MM-dd HH:mm:ss");
		log.info("国内仓收货入库提交SAP开始："+nowDate1+"---"+selectHead.getDeliveryNoteSap());
    	if (!WmsBatchReceiptEnum.SUBMITTED.getCode().equals(selectHead.getSpmsStatus()) && !WmsBatchReceiptEnum.SUBMIT_SAP_ERROR.getCode().equals(selectHead.getSpmsStatus())) {
    		return ResponseResult.error("单据当前状态禁止此操作");
    	}
    	// 查询分批收货行项目
    	QueryWrapper<SapDeliveryNoteBatchReceiptDtl> dtlQuery = new QueryWrapper<SapDeliveryNoteBatchReceiptDtl>().eq("SPMS_ID", selectHead.getSpmsId());
    	List<SapDeliveryNoteBatchReceiptDtl> list = iSapDeliveryNoteBatchReceiptDtlService.list(dtlQuery);
    	selectHead.setSpmsStatus(WmsBatchReceiptEnum.SUBMITTED_SAP.getCode());
        selectHead.setUpdateTime(new Date());
        selectHead.setUpdateUserid(userId);
        this.baseMapper.updateById(selectHead);
        // 根据交货单号查询全部的分批收货单据
        QueryWrapper<SapDeliveryNoteBatchReceipt> eq = new QueryWrapper<SapDeliveryNoteBatchReceipt>().eq("DELIVERY_NOTE_SAP", selectHead.getDeliveryNoteSap()).ne("SPMS_STATUS", "0");
        List<SapDeliveryNoteBatchReceipt> selectAllList = this.baseMapper.selectList(eq);
        List<SapDeliveryNoteBatchReceipt> toSAPSuccessList = selectAllList.stream().filter(o -> "3".equals(o.getSpmsStatus())).collect(Collectors.toList());
        QueryWrapper<SapDeliveryNote> noteEq = new QueryWrapper<SapDeliveryNote>().eq("DELIVERY_NOTE_SAP", selectHead.getDeliveryNoteSap());
        SapDeliveryNote noteHead = iSapDeliveryNoteService.getOne(noteEq);
        if (StringUtils.isNotBlank(list.get(0).getMaterialNo())) {
        	// 贸易货
        	// 查询交货单行项目
        	QueryWrapper<SapDeliveryNoteDtl> deliEq = new QueryWrapper<SapDeliveryNoteDtl>().eq("DELIVERY_NOTE_SAP", selectHead.getDeliveryNoteSap());
        	List<SapDeliveryNoteDtl> noteList = iSapDeliveryNoteDtlService.list(deliEq);
        	List<SapDeliveryNoteDtl> receivedList = noteList.stream().filter(o -> "1".equals(o.getReceivedStatus())).collect(Collectors.toList());
        	if (selectAllList.size() > toSAPSuccessList.size()) {
        		// 部分提交SAP
        		noteHead.setSpmsStatus("10");
        	} else if (selectAllList.size() == toSAPSuccessList.size() && noteList.size() > receivedList.size()) {
        		// 部分提交SAP
        		noteHead.setSpmsStatus("10");
        	} else if (selectAllList.size() == toSAPSuccessList.size() && noteList.size() == receivedList.size()) {
        		// 收货完成
        		noteHead.setSpmsStatus("8");
        	}
        } else {
        	// 备件货
        	// 查询箱码信息
        	QueryWrapper<SapBoxNote> boxEq = new QueryWrapper<SapBoxNote>().eq("PACKAGE_NOTE", noteHead.getPackageNote());
        	List<SapBoxNote> boxList = iSapBoxNoteService.list(boxEq);
        	List<SapBoxNote> receivedList = boxList.stream().filter(o -> "1".equals(o.getReceivedStatus())).collect(Collectors.toList());
        	if (selectAllList.size() > toSAPSuccessList.size()) {
        		// 部分提交SAP
        		noteHead.setSpmsStatus("10");
        	} else if (selectAllList.size() == toSAPSuccessList.size() && boxList.size() > receivedList.size()) {
        		// 部分提交SAP
        		noteHead.setSpmsStatus("10");
        	} else if (selectAllList.size() == toSAPSuccessList.size() && boxList.size() == receivedList.size()) {
        		// 收货完成
        		noteHead.setSpmsStatus("8");
        	}
        }
        // 更新交货单状态
        iSapDeliveryNoteService.update(noteHead, noteEq);
    	// 增加库存数量
    	this.addWhsInventory(selectHead, list, userId);
		String nowDate2 = DateFormatUtils.format(new Date(), "yyyy-MM-dd HH:mm:ss");
		log.info("国内仓收货入库提交SAP开始推送接口："+nowDate2+"---"+selectHead.getDeliveryNoteSap());
    	// 调用接口同步SAP
        this.sendSapData(selectHead, head, list, userId);
        // 备件货需要将箱码信息同步SAP
//        if (StringUtils.isBlank(list.get(0).getMaterialNo()) && StringUtils.isNotBlank(list.get(0).getBoxNote())) {
//        	try {
//        		ResponseResult packageDataToSAP = this.boxNoteSendSap(selectHead, list, noteHead);
//        		if (packageDataToSAP.getCode() != 200) {
//        			log.error("国内仓收货入库箱码信息同步SAP失败："+packageDataToSAP.getMsg());
//        		}
//        	} catch (Exception e) {
//        		log.error("国内仓收货入库箱码信息同步SAP失败："+e.getMessage());
//        	}
//        }
		String endDate = DateFormatUtils.format(new Date(), "yyyy-MM-dd HH:mm:ss");
		log.info("国内仓收货入库提交SAP开始结束："+endDate+"---"+selectHead.getDeliveryNoteSap());
    	return ResponseResult.success("分批收货提交SAP成功").add("batchReceiptHead", selectHead).add("batchReceiptDtl", this.baseMapper.selectBatchReceiptDtl(selectHead.getSpmsId()));
	}

	private ResponseResult boxNoteSendSap(SapDeliveryNoteBatchReceipt selectHead, List<SapDeliveryNoteBatchReceiptDtl> list, SapDeliveryNote noteHead) {
		QueryWrapper<SapPackageNote> qw = new QueryWrapper<SapPackageNote>().eq("PACKAGE_NOTE", noteHead.getPackageNote());
		SapPackageNote sapPackageNote = iSapPackageNoteService.getOne(qw);
		// 设置IT_HEAD数据
		Map<String, Object> itHead = new HashMap<>();
		this.setItHeadData(sapPackageNote, itHead);
		// 设置IT_XHEAD数据
		JSONArray array = new JSONArray();
		this.setItXheadData(list, array, selectHead);
		// 设置IT_ITEM数据
		List<Map<String, Object>> itItem = new ArrayList<>();
		this.setItItemData(selectHead, list, itItem);
		// 调用接口同步SAP
		JSONObject doc = new JSONObject();
        JSONObject REQUEST = new JSONObject();
        JSONObject ESB_ATTRS = new JSONObject();
        JSONObject REQUEST_DATA = new JSONObject();
        ESB_ATTRS.put("App_ID", "SPMS");
        ESB_ATTRS.put("Application_ID", "00020000000002");
        ESB_ATTRS.put("Transaction_ID", UUID.randomUUID().toString());
        JSONObject tables = new JSONObject();
        List<Map<String, Object>> it_head = new ArrayList<>();
        it_head.add(itHead);
        tables.put("IT_HEAD", it_head);
        tables.put("IT_XHEAD", array);
        tables.put("IT_ITME", itItem);
        List<ZSapOrgClient> clinetList = zSapOrgClientMapper.selectList(new QueryWrapper<ZSapOrgClient>().eq("WERKS", selectHead.getWerks()));
        if (!CollectionUtils.isEmpty(clinetList)) {
        	ESB_ATTRS.put("Target_ID", "SAP-"+clinetList.get(0).getZmandt());
        } else {
        	return ResponseResult.error("工厂："+selectHead.getWerks()+"未找到对应的SAP Clinet");
        }
        REQUEST_DATA.put("tables", tables);
        REQUEST_DATA.put("Operation", "Z_SPMS_SETBOXCODE");
        REQUEST_DATA.put("Type", "SETBOXCODE");
        REQUEST.put("ESB_ATTRS", ESB_ATTRS);
        REQUEST.put("REQUEST_DATA", REQUEST_DATA);
        doc.put("REQUEST", REQUEST);
        JSONObject message = JSONObject.parseObject(iFeignServiceCommon.sendRestToSapCommon(doc));
        log.info("\n=====国内收货入库箱码推送SAP数据：======\n" + doc + "\n=====国内仓收货入库箱码SAP返回数据：======\n" + message);
        if (!"S".equals(message.getJSONObject("RESPONSE").getJSONObject("RETURN_DATA").getString("O_TYPE"))) {
        	return ResponseResult.error("国内收货入库箱码信息同步SAP调用接口失败："+message.getJSONObject("RESPONSE").getJSONObject("RETURN_DATA").getString("O_MSTXT"));
        }
        return ResponseResult.success();
	}

	private void setItItemData(SapDeliveryNoteBatchReceipt selectHead, List<SapDeliveryNoteBatchReceiptDtl> list, List<Map<String, Object>> itItem) {
		for (SapDeliveryNoteBatchReceiptDtl dtl : list) {
			if (dtl.getReceivedQty() != null && dtl.getReceivedQty() > 0) {
				WhsStorageInventory whsStorageInventory = iWhsStorageInventoryService.getBoxNoteStorage(dtl.getBoxNote());
				WhsStorage whsStorage = iWhsStorageService.getWhsStorageByUuid(whsStorageInventory.getUuid());
	            Werks werks = iWerksService.getOne(new QueryWrapper<Werks>().eq("WERKS", whsStorage.getWerks()));
	            List<SapBoxNoteDtl> sapBoxNoteDtlList = iSapBoxNoteDtlService.getSapBoxNoteDtlList(dtl.getBoxNote());
				for (SapBoxNoteDtl sapBoxNoteDtl : sapBoxNoteDtlList) {
					Map<String, Object> map = new HashMap<>();
		            map.put("PACKAGE_NO", sapBoxNoteDtl.getPackageNote());
		            map.put("SERIAL", sapBoxNoteDtl.getItem().toString());
		            map.put("PACKAGE_CODE", sapBoxNoteDtl.getBoxNote());
		            map.put("PACKAGE_POSNR", sapBoxNoteDtl.getPackagePosnr() != null ? sapBoxNoteDtl.getPackagePosnr().toString() : "");
		            map.put("MATNR", sapBoxNoteDtl.getMaterialNo());
		            map.put("SPECS", sapBoxNoteDtl.getSpecs() != null ? sapBoxNoteDtl.getSpecs() : "");
		            map.put("MENGE", sapBoxNoteDtl.getQuantity() != null ? sapBoxNoteDtl.getQuantity().toString() : "0");
		            map.put("MEINS", sapBoxNoteDtl.getBasicUnit());
		            map.put("SRM_CONTRACT_NO", sapBoxNoteDtl.getSrmContractNo() != null ? sapBoxNoteDtl.getSrmContractNo() : "");
		            map.put("EBELN", sapBoxNoteDtl.getPurchaseNo() != null ? sapBoxNoteDtl.getPurchaseNo() : "");
		            map.put("EBELP", sapBoxNoteDtl.getPurchaseNoItem() != null ? sapBoxNoteDtl.getPurchaseNoItem().toString() : "");
		            map.put("VBELN", sapBoxNoteDtl.getDeliveryNoteSap() != null ? sapBoxNoteDtl.getDeliveryNoteSap() : "");
		            map.put("POSNR", sapBoxNoteDtl.getDeliveryNoteSapItem() != null ? sapBoxNoteDtl.getDeliveryNoteSapItem().toString() : "");
		            map.put("DEMAND_NO", sapBoxNoteDtl.getDemandNo() != null ? sapBoxNoteDtl.getDemandNo() : "");
		            map.put("DEMAND_POSNR", sapBoxNoteDtl.getDemandNoItem() != null ? sapBoxNoteDtl.getDemandNoItem().toString() : "");
		            map.put("DEMANDER", sapBoxNoteDtl.getDemander() != null ? sapBoxNoteDtl.getDemander() : "");
		            map.put("MARK", sapBoxNoteDtl.getRemark() != null ? sapBoxNoteDtl.getRemark() : "");
		            map.put("BRGEW", sapBoxNoteDtl.getGrossWeight() != null ? sapBoxNoteDtl.getGrossWeight().toString() : "0");
		            map.put("NTGEW", sapBoxNoteDtl.getNetWeight() != null ? sapBoxNoteDtl.getNetWeight().toString() : "0");
		            map.put("GNSHSL", sapBoxNoteDtl.getDomesticQtyReceivable() != null ? sapBoxNoteDtl.getDomesticQtyReceivable().toString() : "0");
		            map.put("GNSJSL", sapBoxNoteDtl.getDomesticQtyReceived() != null ? sapBoxNoteDtl.getDomesticQtyReceived().toString() : "0");
		            map.put("HWSHSL", sapBoxNoteDtl.getOverseaQtyReceived() != null ? sapBoxNoteDtl.getOverseaQtyReceived().toString() : "0");
		            if (werks != null) {
		            	map.put("BUKRS", werks.getCompanyCode());
		            }
		            itItem.add(map);
				}
			}
		}
	}

	private void setItXheadData(List<SapDeliveryNoteBatchReceiptDtl> list, JSONArray array, SapDeliveryNoteBatchReceipt selectHead) {
		for (SapDeliveryNoteBatchReceiptDtl dtl : list) {
			if (dtl.getReceivedQty() != null && dtl.getReceivedQty() > 0) {
				SapBoxNote sapBoxNote = this.iSapBoxNoteService.getByBoxNote(dtl.getBoxNote());
				Map<String, Object> map = new HashMap<>();
				map.put("PACKAGE_NO", sapBoxNote.getPackageNote());
				map.put("PACKAGE_CODE", sapBoxNote.getBoxNote());
				map.put("OUTER_BOX_TEXTURE", sapBoxNote.getBoxMaterialName());
				map.put("TOTAL_QTY", sapBoxNote.getTotalQty() != null ? String.valueOf(sapBoxNote.getTotalQty()) : "");
				map.put("BOX_BRGEW", sapBoxNote.getBoxGrossWeight() != null ? sapBoxNote.getBoxGrossWeight().toString() : "");
				map.put("BOX_VOLUM", sapBoxNote.getBoxVolume() != null ? sapBoxNote.getBoxVolume().toString() : "");
				map.put("LENGTH", sapBoxNote.getBoxLength() != null ? sapBoxNote.getBoxLength().toString() : "");
				map.put("WIDTH", sapBoxNote.getBoxWidth() != null ? sapBoxNote.getBoxWidth().toString() : "");
				map.put("HEIGHT", sapBoxNote.getBoxHeight() != null ? sapBoxNote.getBoxHeight().toString() : "");
				map.put("COLOR", sapBoxNote.getBoxColor());
				WhsStorageInventory whsStorageInventory = iWhsStorageInventoryService.getBoxNoteStorage(dtl.getBoxNote());
				WhsStorage whsStorage = iWhsStorageService.getWhsStorageByUuid(whsStorageInventory.getUuid());
				map.put("WERKS_CF", whsStorage.getWerks());
				map.put("LGORT_CF", whsStorage.getWhsLocationCode());
				// 箱码状态
				map.put("STATSU_PKCODE", "2");
				// 箱码类型
				map.put("CODE_TYPE", "1");
				map.put("INBOUND_TIME", StringUtils.isNotBlank(selectHead.getPostingDate()) ? selectHead.getPostingDate().replaceAll("-", "") : "");
				array.add(map);
			}
		}
	}

	private void setItHeadData(SapPackageNote sapPackageNote, Map<String, Object> itHead) {
		itHead.put("PACKAGE_NO", sapPackageNote.getPackageNote());
		itHead.put("SRM_DN", sapPackageNote.getDeliveryNoteSrm());
		itHead.put("SAP_DN", sapPackageNote.getDeliveryNoteSap());
		itHead.put("LIFNR", sapPackageNote.getSupplierCode());
		itHead.put("VOLUM_T", sapPackageNote.getTotalVolume() != null ? sapPackageNote.getTotalVolume().toString() : "");
		itHead.put("BRGEW_T", sapPackageNote.getTotalWeight() != null ? sapPackageNote.getTotalWeight().toString() : "");
		itHead.put("ZXDATE_F", sapPackageNote.getLoadBeginTime());
		itHead.put("ZXDATE_T", sapPackageNote.getLoadEndTime());
		itHead.put("YSR", sapPackageNote.getTransporter());
		itHead.put("CYRLXFS", sapPackageNote.getContractorInfo());
		itHead.put("SHR", sapPackageNote.getReceiver());
		itHead.put("SHRLXFS", sapPackageNote.getReceiverInfo());
		itHead.put("SHDZ", sapPackageNote.getReceivingAddress());
		itHead.put("SPMS_CONTRACT_NO", sapPackageNote.getSpmsContractNote());
		itHead.put("SPMS_FLG", "S");
	}

	private void addWhsInventory(SapDeliveryNoteBatchReceipt selectHead, List<SapDeliveryNoteBatchReceiptDtl> list, String userId) throws Exception {
		for (SapDeliveryNoteBatchReceiptDtl dtl : list) {
			if (StringUtils.isNotBlank(dtl.getMaterialNo())) {
				// 贸易货增加储位库存
				String tempStorage = dtl.getTempStorage();
				String materialNo = dtl.getMaterialNo();
				JSONArray receiptArray = JSONArray.parseArray(tempStorage);
				for (int i = 0; i < receiptArray.size(); i++) {
					JSONObject obj = receiptArray.getJSONObject(i);
					String storageUuid = obj.getString("storageUuid");
					double qty = Double.parseDouble(obj.getString("qty"));
					if (qty > 0) {
						ResponseResult inventoryM = iWhsStorageInventoryService.updateStorageInventoryM(storageUuid, materialNo, qty, "add");
                        if (inventoryM.getCode() != 200) {
                        	throw new Exception("储位："+storageUuid+"，物料："+materialNo+"增加储位库存失败");
                        }
						// 记录自管仓 贸易货 按物料 上架 增加储位库存日志
                        iWhsOperateLogService.insertWhsOperateLogMS(storageUuid, materialNo, qty, dtl.getDeliveryNoteSap(), TRADE_GOODS_INTO_STORAGE, userId,
                        		selectHead.getWerks(), selectHead.getLocationCode(), dtl.getDeliveryNoteSapItem());
					}
				}
			} else {
				if (dtl.getReceivedQty() != null && dtl.getReceivedQty() > 0) {
					// 备件增加仓库库存
					WhsInventoryInfo inventoryInfo = iWhsInventoryInfoService.getOne(new QueryWrapper<WhsInventoryInfo>().eq("BOX_NOTE", dtl.getBoxNote()));
					if (inventoryInfo == null) {
						this.baseMapper.addBoxNoteToWhsInventoryInfo(selectHead.getWerks(), selectHead.getLocationCode(), dtl.getBoxNote(), userId);
						// 自管仓 备件货 按箱 验收入库 增加仓库库存日志
		                iWhsOperateLogService.insertWhsOperateLogBR(dtl.getBoxNote(), 1.0, selectHead.getDeliveryNoteSap(), "", SPARE_PARTS_INTO_WHS, userId,
		                		selectHead.getWerks(), selectHead.getLocationCode());
					}
					// 增加储位库存
					iWhsStorageInventoryService.updateStorageInventoryX(dtl.getStorageUuid(), dtl.getBoxNote(), selectHead.getDeliveryNoteSap(), userId);
				}
			}
		}
		
	}

	private void updateDeliveryItemQuantity(SapDeliveryNoteBatchReceipt selectHead, List<SapDeliveryNoteBatchReceiptDtl> list, String userId, String pdaSn) throws Exception {
//		List<SapDeliveryNoteDtl> updateList = new ArrayList<SapDeliveryNoteDtl>();
		for (SapDeliveryNoteBatchReceiptDtl dtl : list) {
			if (StringUtils.isNotBlank(dtl.getMaterialNo())) {
				// 贸易货回写收货数量到交货单行中
				// 基本单位实收数量
				Double receivedQty = dtl.getReceivedQty();
				Double actualQtySales = dtl.getActualQtySales();
				String tempStorage = dtl.getTempStorage();
				QueryWrapper<SapDeliveryNoteDtl> query = new QueryWrapper<SapDeliveryNoteDtl>()
						.eq("DELIVERY_NOTE_SAP", dtl.getDeliveryNoteSap())
						.eq("DELIVERY_NOTE_SAP_ITEM", dtl.getDeliveryNoteSapItem());
				SapDeliveryNoteDtl noteDtl = iSapDeliveryNoteDtlService.getOne(query);
				if (noteDtl == null) {
					continue;
				}
				noteDtl.setReceivedQty(noteDtl.getReceivedQty() == null ? receivedQty : noteDtl.getReceivedQty() + receivedQty);
				noteDtl.setActualQtySales(noteDtl.getActualQtySales() == null ? actualQtySales : noteDtl.getActualQtySales() + actualQtySales);
				noteDtl.setUnitSales(dtl.getUnitSales());
				// 差异数量：应收数量-实收数量
				noteDtl.setDiffQuantity(noteDtl.getDeliveryQty() - noteDtl.getReceivedQty());
				// 差异件数
				noteDtl.setDiffQtySales(noteDtl.getQtySales() - noteDtl.getActualQtySales());
				// 判断行项目的收货状态
				if (noteDtl.getDiffQuantity() == null || noteDtl.getDiffQuantity() > 0) {
					// 未完成收货
					noteDtl.setReceivedStatus("0");
				} else if (noteDtl.getDiffQuantity() != null || noteDtl.getDiffQuantity() <= 0) {
					// 完成收货
					noteDtl.setReceivedStatus("1");
				}
				if (StringUtils.isBlank(noteDtl.getTempStorage())) {
					noteDtl.setTempStorage(tempStorage);
				} else {
					// 交货单行项目的储位信息
					JSONArray dnArray = JSONArray.parseArray(noteDtl.getTempStorage());
					// 分批收货的储位信息
					JSONArray receiptArray = JSONArray.parseArray(tempStorage);
					for (int i = 0; i < receiptArray.size(); i++) {
						JSONObject rcobj = receiptArray.getJSONObject(i);
						rcobj.put("spmsId", selectHead.getSpmsId());
						rcobj.put("itemNumber", dtl.getItem());
						dnArray.add(rcobj);
					}
					noteDtl.setTempStorage(dnArray.toJSONString());
				}
				iSapDeliveryNoteDtlService.update(noteDtl, query);
			} else {
				// 备件货回写收货数量
				// 更新箱码信息表
				SapBoxNote sapBoxNote = new SapBoxNote();
				sapBoxNote.setBoxNote(dtl.getBoxNote());
				sapBoxNote.setBoxQtyReceived(dtl.getReceivedQty() != null ? dtl.getReceivedQty().intValue() : 0);
				sapBoxNote.setArrivalDate(DateFormatUtils.format(new Date(), "yyyy-MM-dd"));
				sapBoxNote.setItemStatus("8");
				// 收货完成状态
				sapBoxNote.setReceivedStatus("1");
				sapBoxNote.setStorageCode(dtl.getStorageUuid());
				iSapBoxNoteService.update(sapBoxNote, new QueryWrapper<SapBoxNote>().eq("BOX_NOTE", dtl.getBoxNote()));
				// 更新箱码行项目表
				if (dtl.getReceivedQty() != null && dtl.getReceivedQty() > 0) {
					iSapBoxNoteDtlService.updateSapBoxNoteDtl(dtl.getBoxNote(), dtl.getReceivedQty());
				}
			}
		}
		// 备件增加上下架数据
		if (StringUtils.isBlank(list.get(0).getMaterialNo())) {
			List<ShelfOnTaskDtl> insertTaskList = new ArrayList<>();
			QueryWrapper<ShelfOnTask> queryWrapper = new QueryWrapper<ShelfOnTask>()
					.eq("DELIVERY_NOTE_SAP", selectHead.getDeliveryNoteSap()).eq("TASK_TYPE", "1")
					.eq("TASK_STATUS", "3");
			ShelfOnTask shelfOnTask = iShelfOnTaskService.getOne(queryWrapper);
			if (shelfOnTask == null) {
				ShelfOnTask insertTask = new ShelfOnTask();
				insertTask.setWerks(selectHead.getWerks());
				insertTask.setWhsLocationCode(selectHead.getLocationCode());
				insertTask.setCreateUserId(userId);
				insertTask.setCreateDate(DateFormatUtils.format(new Date(), "yyyyMMdd"));
				insertTask.setCreateTime(new Date());
				insertTask.setTaskStatus("3");
				insertTask.setDeliveryNoteSap(selectHead.getDeliveryNoteSap());
				insertTask.setTaskType("1");
				insertTask.setPdaSN(pdaSn);
				insertTask.setUpdateUsername(userId);
				String uuid = UUID.randomUUID().toString().replaceAll("-", "").toLowerCase();
				insertTask.setUuid(uuid);
				iShelfOnTaskService.save(insertTask);
				// 增加上下架行项目
				int sort = 1;
				for (SapDeliveryNoteBatchReceiptDtl dtl : list) {
					ShelfOnTaskDtl taskDtl = new ShelfOnTaskDtl();
					taskDtl.setUuid(uuid);
					taskDtl.setTaskRowId(String.valueOf(sort*10));
					taskDtl.setBoxNote(dtl.getBoxNote());
					taskDtl.setDeliveryNoteSap(selectHead.getDeliveryNoteSap());
					if (dtl.getReceivedQty() != null && dtl.getReceivedQty() > 0) {
						taskDtl.setQuantity(dtl.getReceivedQty());
						taskDtl.setTargetStorage(dtl.getStorageUuid());
					} else {
						taskDtl.setTargetStorage("[]");
						taskDtl.setQuantity(0.0);
					}
					insertTaskList.add(taskDtl);
				}
				// 记录上架任务日志
				logService.insertSapDeliveryNoteLogM(uuid, userId, CLOSE_SHELF_ON_TASK);
			} else {
				// 如果已存在上下架，那么只增加行项目
				QueryWrapper<ShelfOnTaskDtl> dtlWrapper = new QueryWrapper<ShelfOnTaskDtl>().eq("UUID", shelfOnTask.getUuid());
				List<ShelfOnTaskDtl> taskDtls = iShelfOnTaskDtlService.list(dtlWrapper);
				int sort = taskDtls.size();
				for (SapDeliveryNoteBatchReceiptDtl dtl : list) {
					ShelfOnTaskDtl taskDtl = new ShelfOnTaskDtl();
					taskDtl.setUuid(shelfOnTask.getUuid());
					taskDtl.setTaskRowId(String.valueOf((sort+1)*10));
					taskDtl.setBoxNote(dtl.getBoxNote());
					taskDtl.setDeliveryNoteSap(selectHead.getDeliveryNoteSap());
					if (dtl.getReceivedQty() != null && dtl.getReceivedQty() > 0) {
						taskDtl.setQuantity(dtl.getReceivedQty());
						taskDtl.setTargetStorage(dtl.getStorageUuid());
					} else {
						taskDtl.setTargetStorage("[]");
						taskDtl.setQuantity(0.0);
					}
					insertTaskList.add(taskDtl);
				}
			}
			if (!CollectionUtils.isEmpty(insertTaskList)) {
				iShelfOnTaskDtlService.saveBatch(insertTaskList);
			}
		}
	}

	@SuppressWarnings("unchecked")
	private void sendSapData(SapDeliveryNoteBatchReceipt selectHead, SapDeliveryNoteBatchReceipt head, List<SapDeliveryNoteBatchReceiptDtl> list, String userId) throws Exception {
		// 组装头信息
        Map<String, Object> dataHead = this.baseMapper.dataHead(selectHead.getUuid(), head.getPostingDate(), userId);
//        SimpleDateFormat simp = new SimpleDateFormat("yyyy:MM:ddHH:mm:ss:SS");//月日时分秒 毫秒
//        String serialNumber=simp.format(new Date()).replace(":","" );
//        dataHead.put("SPMSID", "SPMS"+serialNumber);
        // 组装行信息
        List<Map<String, Object>> Items = new ArrayList<>();
        if (StringUtils.isBlank(list.get(0).getBoxNote())) {
        	// 贸易货
        	Items = this.baseMapper.selectNoteItemM(selectHead.getSpmsId());
        } else {
        	// 备件货
        	Items = this.baseMapper.selectNoteItemX(selectHead.getSpmsId());
        }
        JSONObject setToSapData = new JSONObject();
    	String mqUuid = UUID.randomUUID().toString();
		JSONObject REQUEST = new JSONObject();
		JSONObject ESB_ATTRS = new JSONObject();
		JSONObject REQUEST_DATA = new JSONObject();
		ESB_ATTRS.put("Application_ID", "00020000000002");
		ESB_ATTRS.put("Transaction_ID", mqUuid);
		ESB_ATTRS.put("App_ID", "SPMS");
		ESB_ATTRS.put("Target_ID", zxdSapClient);//装箱单的接口只推送到装箱单的client
		REQUEST_DATA.put("Operation", "ZZXD_IF_SPMS_04");
		REQUEST_DATA.put("Type", "ZZXD_IF_SPMS_04");
		Map<String, Object> tables = new HashMap<>();
		List<Object> headt = new ArrayList<>();
		headt.add(dataHead);
        tables.put("T_HEAD", headt);
		tables.put("T_ITEM", Items);
		REQUEST_DATA.put("tables", tables);
//		REQUEST_DATA.put("Head", dataHead);
//		REQUEST_DATA.put("Items", Items);
		REQUEST.put("ESB_ATTRS", ESB_ATTRS);
		REQUEST.put("REQUEST_DATA", REQUEST_DATA);
		setToSapData.put("REQUEST", REQUEST);
		log.info("国内仓收货入库提交SAP开始推送ZZXD_IF_SPMS_04报文："+setToSapData.toJSONString());
    	JSONObject message = JSONObject.parseObject(iFeignServiceCommon.sendRestToSapCommon(setToSapData));
		log.info("国内仓收货入库提交SAP开始推送ZZXD_IF_SPMS_04报文返回："+setToSapData.toJSONString());
    	// 增加接口日志
    	this.addInterfaceLog("3", "ZZXD_IF_SPMS_04", "国内仓收货入库分批收货同步SAP接口", mqUuid, setToSapData.toJSONString(), message.toJSONString(), null);
    	JSONObject RETURN_DATA = message.getJSONObject("RESPONSE").getJSONObject("RETURN_DATA");
    	if ("S".equals(RETURN_DATA.getJSONArray("T_R_HEAD").getJSONObject(0).getString("TYPE"))) {
//            String sapVoucherNumber = RETURN_DATA.getJSONArray("IT_MSG").getJSONObject(0).getString("MBLNR");
//            String sapVoucherYear = RETURN_DATA.getJSONArray("IT_MSG").getJSONObject(0).getString("MJAHR");

			String sapVoucherNumber = message.getJSONObject("RESPONSE").getJSONObject("RETURN_DATA").getJSONArray("T_R_HEAD").getJSONObject(0).getString("MBLNR");
			String sapVoucherYear = message.getJSONObject("RESPONSE").getJSONObject("RETURN_DATA").getJSONArray("T_R_HEAD").getJSONObject(0).getString("MJAHR");
            // 更新分批收货头状态
            selectHead.setSpmsStatus(WmsBatchReceiptEnum.SUBMITTED_SAP.getCode());
            selectHead.setPostingDate(head.getPostingDate());
            selectHead.setSapVoucherNumber(sapVoucherNumber);
            selectHead.setSapVoucherYear(sapVoucherYear);
            selectHead.setUpdateTime(new Date());
            selectHead.setUpdateUserid(userId);
            this.baseMapper.updateById(selectHead);
            // 添加操作日志
            iSapDeliveryNoteLogService.insertSapRequestRecord(selectHead.getSpmsId(), userId, WmsBatchReceiptEnum.SUBMITTED_SAP.getDescZh(), JSON.toJSONString(message), JSON.toJSONString(setToSapData));
            // 更新SAP返回的金额、货币值到分批收货行项目中
            try {
                //JSONArray costJson = message.getJSONObject("RESPONSE").getJSONObject("RETURN_DATA").getJSONArray("IT_COST");
				JSONArray costJson =  message.getJSONObject("RESPONSE").getJSONObject("RETURN_DATA").getJSONArray("T_R_ITEM");
                if (costJson != null && costJson.size() > 0) {
            		List<SapDeliveryNoteBatchReceiptDtl> itemList = new ArrayList<SapDeliveryNoteBatchReceiptDtl>();
            		for (int i = 0; i < costJson.size(); i++) {
            			Map<String, Object> map = (Map<String, Object>) costJson.get(i);
            			if (map.get("VBELP_IM") != null && map.get("DMBTR") != null) {
            				SapDeliveryNoteBatchReceiptDtl dtl = new SapDeliveryNoteBatchReceiptDtl();
            				String zeile = (String) map.get("VBELP_IM");
            				String zeileRepla = zeile.replaceAll("^(0+)", "");
            				if (StringUtils.isNotBlank(list.get(0).getMaterialNo())) {
            					// 贸易货
            					dtl.setSpmsId(head.getSpmsId());
            					dtl.setDeliveryNoteSapItem(zeileRepla);
            					dtl.setDmbtr(map.get("DMBTR").toString());
            					dtl.setWaers(map.get("WAERS") != null ? map.get("WAERS").toString() : "");
            					itemList.add(dtl);
            				} else {
            					// TODO 备件货
//                					itemList.add(dtl);
            				}
            			}
            		}
            		if (!CollectionUtils.isEmpty(itemList)) {
            			if (itemList.size() > 1000) {
            				List<List<SapDeliveryNoteBatchReceiptDtl>> partition = Lists.partition(itemList, 1000);
            				for (List<SapDeliveryNoteBatchReceiptDtl> pa : partition) {
            					this.baseMapper.updateBatchDtl(pa);
            				}
            			} else {
            				this.baseMapper.updateBatchDtl(itemList);
            			}
            		}
            	}
            } catch (Exception e) {
            }
        } else {
        	throw new Exception("分批收货提交SAP失败"+JSON.toJSONString(message));
        	// 提交SAP失败
//        	selectHead.setSpmsStatus(WmsBatchReceiptEnum.SUBMIT_SAP_ERROR.getCode());
//        	selectHead.setPostingDate(head.getPostingDate());
//        	selectHead.setUpdateTime(new Date());
//        	selectHead.setUpdateUserid(userId);
//            this.baseMapper.updateById(selectHead);
//            // 添加操作日志
//            iSapDeliveryNoteLogService.insertSapRequestRecord(selectHead.getSpmsId(), userId, WmsBatchReceiptEnum.SUBMIT_SAP_ERROR.getDescZh(), JSON.toJSONString(message), JSON.toJSONString(setToSapData));
//            return ResponseResult.error("分批收货提交SAP错误")
//                    .add("sapReturnedMessage", message)
//                    .add("dataToSap", setToSapData)
//                    .add("batchReceiptHead", selectHead)
//                    .add("batchReceiptDtl", this.baseMapper.selectBatchReceiptDtl(selectHead.getSpmsId()));
        }
		
	}

	private void addInterfaceLog(String logType, String requestInterface, String requestDesc, String functionId, String requestParam,
			String receivedMessage, String remarks) {
		taskExcuteor.execute(new Runnable() {
				@Override
				public void run() {
					iSysLogMqService.addSysLogMq(logType, requestInterface, requestDesc, functionId, requestParam, receivedMessage, remarks);
				}
		});
	}

	@Override
	@Transactional(rollbackFor = Exception.class)
	public synchronized ResponseResult cancelDn(JSONObject obj, String userId) throws Exception {
		JSONObject headObj = obj.containsKey("batchReceiptHead") ? obj.getJSONObject("batchReceiptHead") : null;
        if (headObj == null) {
        	return ResponseResult.error("Error, batchReceiptHead missed from the parameters, please double check");
        }
        SapDeliveryNoteBatchReceipt head = headObj.toJavaObject(SapDeliveryNoteBatchReceipt.class);
        SapDeliveryNoteBatchReceipt selectHead = this.baseMapper.selectById(head.getUuid());
    	if (selectHead == null) {
    		return ResponseResult.error("分批收货任务不存在，请检查数据！");
    	}
    	if (StringUtils.isBlank(head.getCancelPostingDate()) && WmsBatchReceiptEnum.SUBMITTED_SAP.getCode().equals(selectHead.getSpmsStatus())) {
    		return ResponseResult.error("撤销日期不能为空");
    	}
    	if (!WmsBatchReceiptEnum.SUBMITTED.getCode().equals(selectHead.getSpmsStatus()) && !WmsBatchReceiptEnum.SUBMIT_SAP_ERROR.getCode().equals(selectHead.getSpmsStatus()) && !WmsBatchReceiptEnum.SUBMITTED_SAP.getCode().equals(selectHead.getSpmsStatus())) {
    		return ResponseResult.error("单据当前状态禁止此操作");
    	}
    	selectHead.setUpdateTime(new Date());
    	selectHead.setUpdateUserid(userId);
		if (WmsBatchReceiptEnum.SUBMITTED.getCode().equals(selectHead.getSpmsStatus()) || WmsBatchReceiptEnum.SUBMIT_SAP_ERROR.getCode().equals(selectHead.getSpmsStatus())) {
			// 从提交状态撤回为保存状态
        	selectHead.setSpmsStatus(WmsBatchReceiptEnum.SAVE.getCode());
        	this.baseMapper.updateById(selectHead);
			// 增加操作日志
        	iSapDeliveryNoteLogService.insertSapRequestRecord(selectHead.getSpmsId(), userId, WmsBatchReceiptEnum.CANCEL_TO_SAVE.getDescZh(), null, JSON.toJSONString(obj));
        	// 扣减关联的交货单行项目中的实收数量
			QueryWrapper<SapDeliveryNoteBatchReceiptDtl> dtlQuery = new QueryWrapper<SapDeliveryNoteBatchReceiptDtl>().eq("SPMS_ID", selectHead.getSpmsId());
	    	List<SapDeliveryNoteBatchReceiptDtl> list = iSapDeliveryNoteBatchReceiptDtlService.list(dtlQuery);
        	this.deductionNoteItemQuantity(selectHead, list, userId);
        	return ResponseResult.success("撤销成功").add("batchReceiptHead", selectHead).add("batchReceiptDtl", this.baseMapper.selectBatchReceiptDtl(selectHead.getSpmsId()));
		} else if (WmsBatchReceiptEnum.SUBMITTED_SAP.getCode().equals(selectHead.getSpmsStatus())) {
			// 判断库存是否足够扣减，足够就进行扣减
			QueryWrapper<SapDeliveryNoteBatchReceiptDtl> dtlQuery = new QueryWrapper<SapDeliveryNoteBatchReceiptDtl>().eq("SPMS_ID", selectHead.getSpmsId());
	    	List<SapDeliveryNoteBatchReceiptDtl> list = iSapDeliveryNoteBatchReceiptDtlService.list(dtlQuery);
	    	this.deductionInventoryQuantity(selectHead, list, userId);
        	// 查询管理的交货单
        	QueryWrapper<SapDeliveryNote> eq = new QueryWrapper<SapDeliveryNote>().eq("DELIVERY_NOTE_SAP", selectHead.getDeliveryNoteSap());
        	SapDeliveryNote one = iSapDeliveryNoteService.getOne(eq);

        	selectHead.setSpmsStatus(WmsBatchReceiptEnum.SUBMITTED.getCode());
            selectHead.setUpdateTime(new Date());
            selectHead.setUpdateUserid(userId);
            this.baseMapper.updateById(selectHead);
            // 根据交货单号查询全部的分批收货单据
            QueryWrapper<SapDeliveryNoteBatchReceipt> batchEq = new QueryWrapper<SapDeliveryNoteBatchReceipt>().eq("DELIVERY_NOTE_SAP", selectHead.getDeliveryNoteSap()).ne("SPMS_STATUS", "0");
            List<SapDeliveryNoteBatchReceipt> selectAllList = this.baseMapper.selectList(batchEq);
            List<SapDeliveryNoteBatchReceipt> toSAPSuccessList = selectAllList.stream().filter(o -> "3".equals(o.getSpmsStatus())).collect(Collectors.toList());
            if (StringUtils.isNotBlank(list.get(0).getMaterialNo())) {
            	// 贸易货
            	// 查询交货单行项目
            	QueryWrapper<SapDeliveryNoteDtl> deliEq = new QueryWrapper<SapDeliveryNoteDtl>().eq("DELIVERY_NOTE_SAP", selectHead.getDeliveryNoteSap());
            	List<SapDeliveryNoteDtl> noteList = iSapDeliveryNoteDtlService.list(deliEq);
            	List<SapDeliveryNoteDtl> receivedList = noteList.stream().filter(o -> "1".equals(o.getReceivedStatus())).collect(Collectors.toList());
            	if (CollectionUtils.isEmpty(toSAPSuccessList)) {
            		// 收货中
            		one.setSpmsStatus("3");
            	} else if (selectAllList.size() > toSAPSuccessList.size()) {
            		// 部分提交SAP
            		one.setSpmsStatus("10");
            	} else if (selectAllList.size() == toSAPSuccessList.size() && noteList.size() > receivedList.size()) {
            		// 部分提交SAP
            		one.setSpmsStatus("10");
            	} else if (selectAllList.size() == toSAPSuccessList.size() && noteList.size() == receivedList.size()) {
            		// 收货完成
            		one.setSpmsStatus("8");
            	}
            } else {
            	// 备件货
            	// 查询箱码信息
            	QueryWrapper<SapBoxNote> boxEq = new QueryWrapper<SapBoxNote>().eq("PACKAGE_NOTE", one.getPackageNote());
            	List<SapBoxNote> boxList = iSapBoxNoteService.list(boxEq);
            	List<SapBoxNote> receivedList = boxList.stream().filter(o -> "1".equals(o.getReceivedStatus())).collect(Collectors.toList());
            	if (CollectionUtils.isEmpty(toSAPSuccessList)) {
            		// 收货中
            		one.setSpmsStatus("3");
            	} else if (selectAllList.size() > toSAPSuccessList.size()) {
            		// 部分提交SAP
            		one.setSpmsStatus("10");
            	} else if (selectAllList.size() == toSAPSuccessList.size() && boxList.size() > receivedList.size()) {
            		// 部分提交SAP
            		one.setSpmsStatus("10");
            	} else if (selectAllList.size() == toSAPSuccessList.size() && boxList.size() == receivedList.size()) {
            		// 收货完成
            		one.setSpmsStatus("8");
            	}
            }
            // 更新交货单状态
            iSapDeliveryNoteService.update(one, eq);
			// 调用接口同步SAP
			JSONObject setToSapData = new JSONObject();
	    	String mqUuid = UUID.randomUUID().toString();
			JSONObject REQUEST = new JSONObject();
			JSONObject ESB_ATTRS = new JSONObject();
			JSONObject REQUEST_DATA = new JSONObject();
			ESB_ATTRS.put("Application_ID", "00020000000002");
			ESB_ATTRS.put("Transaction_ID", mqUuid);
			ESB_ATTRS.put("App_ID", "SPMS");
			ESB_ATTRS.put("Target_ID", zxdSapClient);
			REQUEST_DATA.put("Operation", "ZZXD_IF_SPMS_05");
			REQUEST_DATA.put("Type", "ZZXD_IF_SPMS_05");
			Map<String, Object> fileds = new HashMap<>();
			REQUEST_DATA.put("fileds", fileds);
	        Map<String, Object> structures = new HashMap<>();
	        Map<String, Object> dataHead = new HashMap<>();
			dataHead.put("MBLNR", selectHead.getSapVoucherNumber());
			dataHead.put("MJAHR", selectHead.getSapVoucherYear());
			dataHead.put("BUDAT", head.getCancelPostingDate().replaceAll("-", ""));
			dataHead.put("VBELN", selectHead.getDeliveryNoteSap());
			// 根据工厂查询SAP Clinet
			String sapClinet = "";
			List<ZSapOrgClient> selectList = zSapOrgClientMapper.selectList(new QueryWrapper<ZSapOrgClient>().eq("WERKS", selectHead.getWerks()));
			if (!CollectionUtils.isEmpty(selectList)) {
				sapClinet = selectList.get(0).getZmandt();
			} else {
				return ResponseResult.error("工厂："+selectHead.getWerks()+"未找到对应的SAP Clinet");
			}
			dataHead.put("DN_MANDT", sapClinet);
//			SimpleDateFormat simp = new SimpleDateFormat("yyyy:MM:ddHH:mm:ss:SS");//月日时分秒 毫秒
//	        String serialNumber=simp.format(new Date()).replace(":","" );
//	        dataHead.put("SPMID", "SPMS"+serialNumber);
	        dataHead.put("CLIENT", one != null ? one.getMandt() : "");
	        dataHead.put("SHLX", "A");
	        dataHead.put("LYDJH", selectHead.getSpmsId());
	        structures.put("I_DATA", dataHead);
	        REQUEST_DATA.put("structures", structures);
	        Map<String, Object> tables = new HashMap<>();
	        REQUEST_DATA.put("tables", tables);
			REQUEST.put("ESB_ATTRS", ESB_ATTRS);
			REQUEST.put("REQUEST_DATA", REQUEST_DATA);
			setToSapData.put("REQUEST", REQUEST);
	    	JSONObject message = JSONObject.parseObject(iFeignServiceCommon.sendRestToSapCommon(setToSapData));
	    	// 增加接口日志
	    	this.addInterfaceLog("3", "ZZXD_IF_SPMS_05", "国内仓收货入库分批收货撤销同步SAP接口", mqUuid, setToSapData.toJSONString(), message.toJSONString(), null);
    		JSONObject RETURN_DATA = message.getJSONObject("RESPONSE").getJSONObject("RETURN_DATA");
    		JSONObject E_DATA = RETURN_DATA.getJSONObject("E_DATA");
    		if (E_DATA != null && "S".equals(E_DATA.getString("TYPE"))) {
    			String cancelVoucherNumber = E_DATA.getString("MBLNR");
    			String cancelVoucherYear = E_DATA.getString("MJAHR");
    			selectHead.setCancelPostingDate(head.getCancelPostingDate());
    			selectHead.setCancelSapVoucherNumber(cancelVoucherNumber);
    			selectHead.setCancelSapVoucherYear(cancelVoucherYear);
    			this.baseMapper.updateById(selectHead);
    			// 增加操作日志
	        	iSapDeliveryNoteLogService.insertSapRequestRecord(selectHead.getSpmsId(), userId, WmsBatchReceiptEnum.CANCEL_TO_SUBMITTED.getDescZh(), null, JSON.toJSONString(selectHead));
    			return ResponseResult.success("分批收货撤销成功").add("batchReceiptHead", selectHead);
    		} else {
    			throw new Exception("分批收货撤销失败："+JSON.toJSONString(message));
    		}
		}
		return ResponseResult.error("分批收货提交SAP错误");
	}

	private void deductionInventoryQuantity(SapDeliveryNoteBatchReceipt selectHead, List<SapDeliveryNoteBatchReceiptDtl> list, String userId) throws Exception {
		for (SapDeliveryNoteBatchReceiptDtl dtl : list) {
			if (StringUtils.isNotBlank(dtl.getMaterialNo())) {
				// 贸易货
				String tempStorage = dtl.getTempStorage();
				String materialNo = dtl.getMaterialNo();
				JSONArray receiptArray = JSONArray.parseArray(tempStorage);
				for (int i = 0; i < receiptArray.size(); i++) {
					JSONObject obj = receiptArray.getJSONObject(i);
					String storageUuid = obj.getString("storageUuid");
					double qty = Double.parseDouble(obj.getString("qty"));
					if (qty > 0) {
						ResponseResult inventoryM = iWhsStorageInventoryService.updateStorageInventoryM(storageUuid, materialNo, qty, "sub");
						if (inventoryM.getCode() != 200) {
                        	throw new Exception("储位："+storageUuid+"，物料："+materialNo+"扣减储位库存失败");
                        }
						// 记录自管仓 贸易货 按物料 上架 增加储位库存日志
                        iWhsOperateLogService.insertWhsOperateLogMX(storageUuid, materialNo, qty, dtl.getDeliveryNoteSap(), GOODS_OUT_STORAGE, userId,
                        		selectHead.getWerks(), selectHead.getLocationCode());
					}
				}
			} else {
				// 备件
				if (dtl.getReceivedQty() != null && dtl.getReceivedQty() > 0) {
					// 检验是否有库存扣减
					WhsInventoryInfo whsInventoryInfo = iWhsInventoryInfoService.getWhsInventoryInfoByBoxNote(dtl.getBoxNote(), selectHead.getWerks(), selectHead.getLocationCode());
					if (whsInventoryInfo == null) {
						throw new Exception("箱码："+dtl.getBoxNote()+"，在工厂："+selectHead.getWerks()+"、仓库："+selectHead.getLocationCode()+"库存不足，扣减仓库库存失败");
					}
					// 扣减仓库库存
					iWhsInventoryInfoService.deleteBoxNoteWhsInventory(selectHead.getWerks(), selectHead.getLocationCode(), dtl.getBoxNote());
					// 自管仓 备件货 按箱 验收入库 增加仓库库存日志
					iWhsOperateLogService.insertWhsOperateLogBC(dtl.getBoxNote(), 1.0, selectHead.getDeliveryNoteSap(), SPARE_PARTS_OUT_WHS, userId,
							selectHead.getWerks(), selectHead.getLocationCode());
					// 扣减储位库存
					WhsStorageInventory storageInventory = iWhsStorageInventoryService.getStorageBoxNote(dtl.getStorageUuid(), dtl.getBoxNote());
					if (storageInventory == null) {
						throw new Exception("箱码" + dtl.getBoxNote() + "在储位" + dtl.getStorageUuid() + "不存在，请检查重试");
					}
					iWhsStorageInventoryService.updateStorageInvX(dtl.getStorageUuid(), dtl.getBoxNote(), 1, "sub");
					// 增加出库日志
					iWhsOperateLogService.insertWhsOperateLogBX(dtl.getStorageUuid(), dtl.getBoxNote(), 1.0, selectHead.getDeliveryNoteSap(), SPARE_PARTS_OUT_STORAGE, userId, selectHead.getWerks(), selectHead.getLocationCode());
				}
			}
		}
	}

	@SuppressWarnings("unchecked")
	private synchronized void deductionNoteItemQuantity(SapDeliveryNoteBatchReceipt selectHead, List<SapDeliveryNoteBatchReceiptDtl> list, String userId) throws Exception {
        // 扣减交货单行项目上的分批收货数量
        // 将分批收货的实收数量回写到其他收货行项目中的实收数量字段上
        for (SapDeliveryNoteBatchReceiptDtl dtl : list) {
        	String materialNo = dtl.getMaterialNo();
        	Double receivedQty = dtl.getReceivedQty();
        	Double actualQtySales = dtl.getActualQtySales();
        	if (StringUtils.isNotBlank(materialNo)) {
        		// 贸易货
        		QueryWrapper<SapDeliveryNoteDtl> query = new QueryWrapper<SapDeliveryNoteDtl>().eq("DELIVERY_NOTE_SAP", dtl.getDeliveryNoteSap()).eq("DELIVERY_NOTE_SAP_ITEM", dtl.getDeliveryNoteSapItem());
        		SapDeliveryNoteDtl noteDtl = iSapDeliveryNoteDtlService.getOne(query);
        		if (noteDtl == null) {
        			continue;
        		}
        		noteDtl.setReceivedQty(noteDtl.getReceivedQty() != null ? noteDtl.getReceivedQty()-receivedQty : 0);
        		noteDtl.setActualQtySales(noteDtl.getActualQtySales() != null ? noteDtl.getActualQtySales()-actualQtySales : 0);
        		// 差异数量：应收数量-实收数量
        		noteDtl.setDiffQuantity(noteDtl.getDeliveryQty()-noteDtl.getReceivedQty());
        		// 差异件数
        		noteDtl.setDiffQtySales(noteDtl.getQtySales()-noteDtl.getActualQtySales());
        		// 交货单行项目收货状态未完成收货
        		noteDtl.setReceivedStatus("0");
        		if (StringUtils.isNotBlank(noteDtl.getTempStorage())) {
        			// 交货单行的储位信息
            		JSONArray dnArray = JSONArray.parseArray(noteDtl.getTempStorage());
            		Iterator<Object> it = dnArray.iterator();
            		while(it.hasNext()) {
            			Map<String, Object> dnMap = (Map<String, Object>) it.next();
            			if (dnMap.get("spmsId") != null && dnMap.get("itemNumber") != null && selectHead.getSpmsId().equals(dnMap.get("spmsId").toString()) && dtl.getItem().equals(dnMap.get("itemNumber").toString())) {
            				it.remove();
            			}
            		}
            		noteDtl.setTempStorage(dnArray.toJSONString());
        		}
        		iSapDeliveryNoteDtlService.update(noteDtl, query);
        	} else {
        		// 备件扣减箱码表数量
        		SapBoxNote sapBoxNote = new SapBoxNote();
        		sapBoxNote.setBoxNote(dtl.getBoxNote());
        		sapBoxNote.setBoxQtyReceived(0);
        		sapBoxNote.setArrivalDate(DateFormatUtils.format(new Date(), "yyyy-MM-dd"));
        		sapBoxNote.setItemStatus("0");
        		// 收货完成状态
        		sapBoxNote.setReceivedStatus("0");
        		sapBoxNote.setStorageCode("");
        		iSapBoxNoteService.update(sapBoxNote, new QueryWrapper<SapBoxNote>().eq("BOX_NOTE", dtl.getBoxNote()));
        		// 更新箱码行项目表
        		if (dtl.getReceivedQty() != null && dtl.getReceivedQty() > 0) {
        			this.baseMapper.updateSapBoxNoteDtl(dtl.getBoxNote());
        		}
        	}
        }
        // 删除上下架信息
        if (StringUtils.isBlank(list.get(0).getMaterialNo())) {
        	QueryWrapper<ShelfOnTask> queryWrapper = new QueryWrapper<ShelfOnTask>()
					.eq("DELIVERY_NOTE_SAP", selectHead.getDeliveryNoteSap()).eq("TASK_TYPE", "1")
					.eq("TASK_STATUS", "3");
			ShelfOnTask shelfOnTask = iShelfOnTaskService.getOne(queryWrapper);
			if (shelfOnTask != null) {
				QueryWrapper<ShelfOnTaskDtl> dtlWrapper = new QueryWrapper<ShelfOnTaskDtl>().eq("UUID", shelfOnTask.getUuid());
				List<ShelfOnTaskDtl> taskDtls = iShelfOnTaskDtlService.list(dtlWrapper);
				int count = 0;
				if (!CollectionUtils.isEmpty(taskDtls)) {
					List<String> boxNoteList = list.stream().map(SapDeliveryNoteBatchReceiptDtl::getBoxNote).distinct().collect(Collectors.toList());
					for (ShelfOnTaskDtl task : taskDtls) {
						if (boxNoteList.contains(task.getBoxNote())) {
							QueryWrapper<ShelfOnTaskDtl> taskWrapper = new QueryWrapper<ShelfOnTaskDtl>().eq("BOX_NOTE", task.getBoxNote());
							iShelfOnTaskDtlService.remove(taskWrapper);
							++count;
						}
					}
				}
				if (count == taskDtls.size()) {
					iShelfOnTaskService.removeById(shelfOnTask.getUuid());
				}
				// 记录上架任务日志
				logService.insertSapDeliveryNoteLogM(shelfOnTask.getUuid(), userId, CLOSE_DEDUCT_SHELF_TASK);
			}
        }
	}

	@Override
	public ResponseResult deleteReceipt(JSONObject obj, String userId) {
		try {
			JSONObject headObj = obj.containsKey("batchReceiptHead") ? obj.getJSONObject("batchReceiptHead") : null;
            if (headObj == null) {
            	return ResponseResult.error("Error, batchReceiptHead missed from the parameters, please double check");
            }
            SapDeliveryNoteBatchReceipt head = headObj.toJavaObject(SapDeliveryNoteBatchReceipt.class);
	        SapDeliveryNoteBatchReceipt selectHead = this.baseMapper.selectById(head.getUuid());
        	if (selectHead == null) {
        		return ResponseResult.error("分批收货任务不存在，请检查数据！");
        	}
        	if (!WmsBatchReceiptEnum.SAVE.getCode().equals(selectHead.getSpmsStatus())) {
        		return ResponseResult.error("单据当前状态禁止此操作");
        	}
        	selectHead.setUpdateTime(new Date());
        	selectHead.setUpdateUserid(userId);
        	selectHead.setSpmsStatus(WmsBatchReceiptEnum.DELETE.getCode());
        	this.baseMapper.updateById(selectHead);
        	// 增加操作日志
        	iSapDeliveryNoteLogService.insertSapRequestRecord(selectHead.getSpmsId(), userId, WmsBatchReceiptEnum.DELETE.getDescZh(), null, JSON.toJSONString(obj));
			return ResponseResult.success("删除成功").add("batchReceiptHead", selectHead).add("batchReceiptDtl", this.baseMapper.selectBatchReceiptDtl(selectHead.getSpmsId()));
		} catch (Exception e){
            e.printStackTrace();
            return ResponseResult.error(e.getMessage());
        }
	}

}
