package com.sunda.spmsoversea.service.impl;

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.utils.OaFlowCreateUtils;
import com.sunda.spmsoversea.entity.OverseaDeliveryNote;
import com.sunda.spmsoversea.entity.OverseaDn;
import com.sunda.spmsoversea.entity.OverseaWhsInventoryLoss;
import com.sunda.spmsoversea.entity.OverseaWhsInventoryLossDtl;
import com.sunda.spmsoversea.entity.ZOaOrgClient;
import com.sunda.spmsoversea.enums.OverseaDeliveryNoteEnum;
import com.sunda.spmsoversea.enums.OverseaDnEnum;
import com.sunda.spmsoversea.enums.OverseaWhsInventoryLossEnum;
import com.sunda.spmsoversea.enums.OverseaWhsLossOrderTypeEnum;
import com.sunda.spmsoversea.mapper.OverseaWhsInventoryLossMapper;
import com.sunda.spmsoversea.service.IFormatDataToSapService;
import com.sunda.spmsoversea.service.IOverseaDeliveryNoteService;
import com.sunda.spmsoversea.service.IOverseaDnService;
import com.sunda.spmsoversea.service.IOverseaOperateLogService;
import com.sunda.spmsoversea.service.IOverseaWhsInventoryLossDtlService;
import com.sunda.spmsoversea.service.IOverseaWhsInventoryLossService;
import com.sunda.spmsoversea.service.IZOaOrgClientService;
import com.sunda.spmsuser.entity.SpmsUser;

import cn.hutool.json.JSONUtil;
import io.micrometer.core.instrument.util.StringUtils;
import lombok.extern.slf4j.Slf4j;

import com.alibaba.excel.util.DateUtils;
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.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;

import static com.sunda.spmscommon.constant.OaConstant.BUSINESS_TYPE_OVERSEA_DELIVERY;
import static com.sunda.spmsoversea.constant.CommonConstant.spmsLog;
import static com.sunda.spmsoversea.constant.SapConstant.SAP_SUCCESS;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;

import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang.time.DateFormatUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

/**
 * <p>
 * 海外仓-存货损益头表 服务实现类
 * </p>
 *
 * @author Hzc
 * @since 2024-05-07
 */
@Slf4j
@Service
public class OverseaWhsInventoryLossServiceImpl extends ServiceImpl<OverseaWhsInventoryLossMapper, OverseaWhsInventoryLoss> implements IOverseaWhsInventoryLossService {
	
	@Autowired
	private IOverseaWhsInventoryLossDtlService iOverseaWhsInventoryLossDtlService;
	
	@Autowired
	private IOverseaOperateLogService iOverseaOperateLogService;
	
	@Autowired
	private IOverseaDeliveryNoteService iOverseaDeliveryNoteService;
	
	@Autowired
	private IOverseaDnService iOverseaDnService;
	
	@Autowired
	private IFormatDataToSapService iFormatDataToSapService;
	
	@Autowired
	private IFeignServiceCommon iFeignServiceCommon;
	
	@Autowired
    ZSapOrgClientMapper zSapOrgClientMapper;
	
	@Autowired
	private IZOaOrgClientService izOaOrgClientService;
	
	@Autowired
	private OaFlowCreateUtils oaFlowCreateUtils;
	
	@Value("${oa.new.workflow.id3180}")
    String workflow3180_new;
	
	@Value("${oa.ipo.workflow.id3180}")
    String workflow3180_ipo;
	
	@Value("${oa.new.url}")
    String oaUrl;
	
	@Override
	public ResponseResult getWhsInventoryLossPage(JSONObject doc) {
		String werks = StringUtils.isBlank(doc.getString("werks")) ? null : doc.getString("werks");
		String whsLocationCode = StringUtils.isBlank(doc.getString("whsLocationCode")) ? null : doc.getString("whsLocationCode");
		String beginDate = StringUtils.isBlank(doc.getString("beginDate")) ? null : doc.getString("beginDate");
		String endDate = StringUtils.isBlank(doc.getString("endDate")) ? null : doc.getString("endDate");
		String spmsStatus = StringUtils.isBlank(doc.getString("spmsStatus")) ? null : doc.getString("spmsStatus");
		String orderType = StringUtils.isBlank(doc.getString("orderType")) ? null : doc.getString("orderType");
		String movementType = StringUtils.isBlank(doc.getString("movementType")) ? null : doc.getString("movementType");
		String spmsId = StringUtils.isBlank(doc.getString("spmsId")) ? null : doc.getString("spmsId");
		String oaWorkflow = StringUtils.isBlank(doc.getString("oaWorkflow")) ? null : doc.getString("oaWorkflow");
		String sapDeliveryNote = StringUtils.isBlank(doc.getString("sapDeliveryNote")) ? null : doc.getString("sapDeliveryNote");
		int pageNo = StringUtils.isNotBlank(doc.getString("current")) ? doc.getIntValue("current") : 1;
        int pageSize = StringUtils.isNotBlank(doc.getString("size")) ? doc.getIntValue("size") : 20;
        Page<Map<String, Object>> pages = new Page<>(pageNo, pageSize);
        List<Map<String, Object>> pageMaData = this.baseMapper.selectListByPage(pages, werks, whsLocationCode, beginDate, endDate, spmsStatus, orderType, movementType, spmsId, oaWorkflow, sapDeliveryNote);
        return ResponseResult.success().add("list", pages.setRecords(pageMaData));
	}

	@Override
	public ResponseResult getWhsInventoryLossDetails(JSONObject obj) {
		if (StringUtils.isBlank(obj.getString("uuid"))) {
			ResponseResult.error("参数为空，查询失败");
		}
		QueryWrapper<OverseaWhsInventoryLoss> qw = new QueryWrapper<OverseaWhsInventoryLoss>().eq("UUID", obj.getString("uuid"));
		OverseaWhsInventoryLoss inventoryLoss = this.baseMapper.selectOne(qw);
		if (inventoryLoss == null) {
			ResponseResult.error("单据不存在，查询失败");
		}
		// 查询行项目
		List<Map<String, Object>> list = iOverseaWhsInventoryLossDtlService.selectListByHeadId(obj.getString("uuid"));
		// 汇总行项目的总金额
		BigDecimal allAmount = BigDecimal.ZERO;
		// 货币
		String currency = "";
		if (CollectionUtils.isNotEmpty(list)) {
			for (Map<String, Object> dtl : list) {
				if (dtl.get("waers") != null) {
					currency = dtl.get("waers").toString();
				}
				if (dtl.get("dmbtr") != null && dtl.get("underchargedQtyBasicUnit") != null) {
					allAmount = allAmount.add(new BigDecimal(dtl.get("dmbtr").toString()).multiply(new BigDecimal(dtl.get("underchargedQtyBasicUnit").toString())));
				} else if (dtl.get("dmbtr") != null && dtl.get("overchargedQtyBasicUnit") != null) {
					allAmount = allAmount.add(new BigDecimal(dtl.get("dmbtr").toString()).multiply(new BigDecimal(dtl.get("overchargedQtyBasicUnit").toString())));
				}
			}
		}
		inventoryLoss.setWaers(currency);
		inventoryLoss.setDmbtr(allAmount.stripTrailingZeros().toPlainString());
		return ResponseResult.success().add("head", inventoryLoss).add("list", list);
	}

	@Override
	@Transactional(rollbackFor = Exception.class)
	public ResponseResult createWhsInventoryLoss(JSONObject obj, String userId) throws Exception {
		JSONObject headObj = obj.getJSONObject("head");
		JSONArray itemObj = obj.getJSONArray("itemList");
		if (headObj == null || itemObj == null || itemObj.size() == 0) {
			ResponseResult.error("参数head或itemList为空，操作失败");
		}
		String uuid = headObj.getString("uuid");
		OverseaWhsInventoryLoss headVO = headObj.toJavaObject(OverseaWhsInventoryLoss.class);
		if (StringUtils.isNotBlank(uuid)) {
			// 更新
			headVO.setUpdateTime(new Date());
			headVO.setUpdateUserid(userId);
			this.baseMapper.updateById(headVO);
		} else {
			// 新增
			if (StringUtils.isBlank(headVO.getSapDeliveryNote())) {
				ResponseResult.error("交货单号为空，保存失败");
			}
			if (StringUtils.isBlank(headVO.getWerks())) {
				ResponseResult.error("工厂为空，保存失败");
			}
			if (StringUtils.isBlank(headVO.getWhsLocationCode())) {
				ResponseResult.error("仓库为空，保存失败");
			}
			if (StringUtils.isBlank(headVO.getMovementType())) {
				ResponseResult.error("移动类型为空，保存失败");
			}
			if (StringUtils.isBlank(headVO.getOrderType())) {
				ResponseResult.error("单据类型为空，保存失败");
			}
			uuid = UUID.randomUUID().toString().replaceAll("-", "").toLowerCase();
			headVO.setUuid(uuid);
			headVO.setCreateTime(new Date());
			headVO.setCreateUserid(userId);
			headVO.setSpmsStatus(OverseaWhsInventoryLossEnum.DRAFT.getCode());
			this.baseMapper.insert(headVO);
			String zhDesc = "";
			String enDesc = "";
			String ruDesc = "";
			if ("Z15".equals(headVO.getMovementType())) {
				// 少收
				zhDesc = OverseaDeliveryNoteEnum.UNDERCHARGED_TO_OA.getDescZh();
				enDesc = OverseaDeliveryNoteEnum.UNDERCHARGED_TO_OA.getDescEn();
				ruDesc = OverseaDeliveryNoteEnum.UNDERCHARGED_TO_OA.getDescRu();
			} else {
				// 多收
				zhDesc = OverseaDeliveryNoteEnum.OVERCHARGED_TO_OA.getDescZh();
				enDesc = OverseaDeliveryNoteEnum.OVERCHARGED_TO_OA.getDescEn();
				ruDesc = OverseaDeliveryNoteEnum.OVERCHARGED_TO_OA.getDescRu();
			}
			if (OverseaWhsLossOrderTypeEnum.OVERSEA_RECEIVED.getCode().equals(headVO.getOrderType())) {
				// 根据交货单号更新海运收货单状态
				QueryWrapper<OverseaDeliveryNote> noteQW = new QueryWrapper<OverseaDeliveryNote>().eq("SAP_DELIVERY_NOTE", headVO.getSapDeliveryNote()).eq("WERKS_RECEIVE", headVO.getWerks());
				OverseaDeliveryNote note = new OverseaDeliveryNote();
				if ("Z15".equals(headVO.getMovementType())) {
					// 少收
					note.setSpmsStatus(OverseaDeliveryNoteEnum.UNDERCHARGED_TO_OA.getCode());
				} else {
					// 多收
					note.setSpmsStatus(OverseaDeliveryNoteEnum.OVERCHARGED_TO_OA.getCode());
				}
				iOverseaDeliveryNoteService.update(note, noteQW);
				iOverseaOperateLogService.addOverseaOperateLog(userId, headVO.getSapDeliveryNote(), zhDesc, enDesc, spmsLog, obj.toString(), "", "", ruDesc);
			} else if (OverseaWhsLossOrderTypeEnum.OVERSEA_DUMP.getCode().equals(headVO.getOrderType()) || 
					OverseaWhsLossOrderTypeEnum.AIR_TRANSPORT.getCode().equals(headVO.getOrderType())) {
				// 根据交货单号更新其他收货中的海外转储、空运人带单据状态
				QueryWrapper<OverseaDn> dnQW = new QueryWrapper<OverseaDn>().eq("SAP_DELIVERY_NOTE", headVO.getSapDeliveryNote()).eq("WERKS_RECEIVE", headVO.getWerks());
				OverseaDn dn = new OverseaDn();
				if ("Z15".equals(headVO.getMovementType())) {
					// 少收
					dn.setSpmsStatus(OverseaDnEnum.UNDERCHARGED_TO_OA.getCode());
				} else {
					// 多收
					dn.setSpmsStatus(OverseaDnEnum.OVERCHARGED_TO_OA.getCode());
				}
				iOverseaDnService.update(dn, dnQW);
				// 增加日志
				iOverseaOperateLogService.addOverseaOperateLog(userId, headVO.getSapDeliveryNote(), zhDesc, enDesc, spmsLog, obj.toString(), "", "", ruDesc);
			}
		}
		// 先删除行项目
    	QueryWrapper<OverseaWhsInventoryLossDtl> dtlQuery = new QueryWrapper<OverseaWhsInventoryLossDtl>().eq("HEAD_UUID", uuid);
    	iOverseaWhsInventoryLossDtlService.remove(dtlQuery);
		List<OverseaWhsInventoryLossDtl> itemList = new ArrayList<OverseaWhsInventoryLossDtl>();
		int itemNum = 10;
		for (int i = 0; i < itemObj.size(); i++) {
			OverseaWhsInventoryLossDtl item = itemObj.getObject(i, OverseaWhsInventoryLossDtl.class);
			if (StringUtils.isBlank(item.getSapDeliveryNote())) {
				ResponseResult.error("行项目交货单号为空，保存失败");
			}
			if (StringUtils.isBlank(item.getSapDeliveryNoteItem())) {
				ResponseResult.error("行项目交货单行号为空，保存失败");
			}
			if (StringUtils.isBlank(item.getMovementType())) {
				ResponseResult.error("行项目移动类型为空，保存失败");
			}
			if (StringUtils.isBlank(item.getMaterialNo())) {
				ResponseResult.error("行项目物料号为空，保存失败");
			}
			item.setHeadUuid(uuid);
			item.setItemNumber(itemNum+"");
			item.setWerks(headVO.getWerks());
			item.setWhsLocationCode(headVO.getWhsLocationCode());
			itemNum += 10;
			itemList.add(item);
		}
		iOverseaWhsInventoryLossDtlService.saveBatch(itemList);
		iOverseaOperateLogService.addOverseaOperateLog(userId, uuid, OverseaWhsInventoryLossEnum.DRAFT.getDescZh(),
				OverseaWhsInventoryLossEnum.DRAFT.getDescEn(), spmsLog, JSON.toJSONString(obj), null, "存货损益保存", OverseaWhsInventoryLossEnum.DRAFT.getDescRu());
		return ResponseResult.success().add("head", this.baseMapper.selectById(uuid)).add("list", iOverseaWhsInventoryLossDtlService.list(dtlQuery));
	}

	@Override
	@Transactional(rollbackFor = Exception.class)
	public ResponseResult toOaWhsInventoryLoss(JSONObject obj, SpmsUser spmsUser) throws Exception {
		JSONObject headObj = obj.getJSONObject("head");
		JSONArray itemObj = obj.getJSONArray("itemList");
		if (headObj == null || itemObj == null || itemObj.size() == 0) {
			ResponseResult.error("参数head或itemList为空，操作失败");
		}
		OverseaWhsInventoryLoss headVO = headObj.toJavaObject(OverseaWhsInventoryLoss.class);
		if (StringUtils.isBlank(headVO.getUuid())) {
			ResponseResult.error("参数UUID为空，提交失败");
		}
		QueryWrapper<OverseaWhsInventoryLoss> query = new QueryWrapper<OverseaWhsInventoryLoss>().eq("UUID", headVO.getUuid());
		OverseaWhsInventoryLoss selectHead = this.baseMapper.selectOne(query);
		if (!OverseaWhsInventoryLossEnum.DRAFT.getCode().equals(selectHead.getSpmsStatus()) && !OverseaWhsInventoryLossEnum.OA_APPROVAL_RETURN.getCode().equals(selectHead.getSpmsStatus())) {
			ResponseResult.error("当前状态不能提交OA，提交失败");
		}
		if (StringUtils.isBlank(headVO.getCostCenter())) {
			ResponseResult.error("参数成本中心为空，提交失败");
		}
		// 更新
		headVO.setUpdateTime(new Date());
		headVO.setUpdateUserid(spmsUser.getUserId());
		// 更新单据状态
		headVO.setSubmitOaDate(DateFormatUtils.format(new Date(), "yyyy-MM-dd"));
		headVO.setSpmsStatus(OverseaWhsInventoryLossEnum.PENDING_OA_APPROVAL.getCode());
		this.baseMapper.updateById(headVO);
		// 先删除行项目
    	QueryWrapper<OverseaWhsInventoryLossDtl> dtlQuery = new QueryWrapper<OverseaWhsInventoryLossDtl>().eq("HEAD_UUID", headVO.getUuid());
    	iOverseaWhsInventoryLossDtlService.remove(dtlQuery);
		List<OverseaWhsInventoryLossDtl> itemList = new ArrayList<OverseaWhsInventoryLossDtl>();
		int itemNum = 10;
		for (int i = 0; i < itemObj.size(); i++) {
			OverseaWhsInventoryLossDtl item = itemObj.getObject(i, OverseaWhsInventoryLossDtl.class);
			if (StringUtils.isBlank(item.getSapDeliveryNote())) {
				ResponseResult.error("行项目交货单号为空，保存失败");
			}
			if (StringUtils.isBlank(item.getSapDeliveryNoteItem())) {
				ResponseResult.error("行项目交货单行号为空，保存失败");
			}
			if (StringUtils.isBlank(item.getMovementType())) {
				ResponseResult.error("行项目移动类型为空，保存失败");
			}
			if (StringUtils.isBlank(item.getMaterialNo())) {
				ResponseResult.error("行项目物料号为空，保存失败");
			}
			item.setHeadUuid(headVO.getUuid());
			item.setItemNumber(itemNum+"");
			item.setWerks(headVO.getWerks());
			item.setWhsLocationCode(headVO.getWhsLocationCode());
			itemNum += 10;
			itemList.add(item);
		}
		iOverseaWhsInventoryLossDtlService.saveBatch(itemList);
		// 提交OA
		this.sendDataToOa(headVO, itemList, spmsUser);
		iOverseaOperateLogService.addOverseaOperateLog(spmsUser.getUserId(), headVO.getUuid(), OverseaWhsInventoryLossEnum.PENDING_OA_APPROVAL.getDescZh(),
				OverseaWhsInventoryLossEnum.PENDING_OA_APPROVAL.getDescEn(), spmsLog, JSON.toJSONString(obj), null, "存货损益提交OA", OverseaWhsInventoryLossEnum.PENDING_OA_APPROVAL.getDescRu());
		return ResponseResult.success().add("head", this.baseMapper.selectById(headVO.getUuid())).add("list", iOverseaWhsInventoryLossDtlService.list(dtlQuery));
	}

	private void sendDataToOa(OverseaWhsInventoryLoss headVO, List<OverseaWhsInventoryLossDtl> itemList, SpmsUser spmsUser) throws Exception {
		// 根据工厂查询对应的OA Clinet
        List<ZOaOrgClient> selectList = izOaOrgClientService.getByWerks(headVO.getWerks());
        String oaClient = "OA";
        String workFlowId = workflow3180_new;
        if (CollectionUtils.isNotEmpty(selectList)) {
            String oaUl =  selectList.get(0).getOa();
            if(oaUl.contains("fm-oa") || oaUl.contains("oa-ipo")){
                oaClient = "OA-IPO";
                workFlowId = workflow3180_ipo;
            }
        } else {
            throw new RuntimeException("工厂："+headVO.getWerks()+"未找到对应的OA服务");
        }
        // 组装推送OA的数据
        Map<String, Object> params = new HashMap<>();
        this.setDataOA(params, headVO, itemList, spmsUser, workFlowId);
        Map<String, Object> oaRestFul = oaFlowCreateUtils.oaRestFul(oaClient, params, spmsUser.getUserId());
        if (oaRestFul == null || !(boolean) oaRestFul.get("status")) {
        	String msg = oaRestFul != null ? oaRestFul.get("msg").toString() : "";
        	throw new Exception("推送OA创建流程失败："+msg);
        }
        OverseaWhsInventoryLoss head = new OverseaWhsInventoryLoss();
        head.setUuid(headVO.getUuid());
        head.setOaBianhao(oaRestFul.get("requestid") != null ? oaRestFul.get("requestid").toString() : "");
        head.setOaWorkflow(workflow3180_ipo);
        head.setOaClient(oaClient);
        this.baseMapper.updateById(head);
	}

	private void setDataOA(Map<String, Object> params, OverseaWhsInventoryLoss headVO, List<OverseaWhsInventoryLossDtl> itemList, SpmsUser spmsUser, String workFlowId) {
		// 查询行项目
		List<Map<String, Object>> list = iOverseaWhsInventoryLossDtlService.selectListByHeadId(headVO.getUuid());
		// 汇总行项目的总金额
		BigDecimal allAmount = BigDecimal.ZERO;
		// 货币
		String currency = "";
		for (Map<String, Object> dtl : list) {
			if (dtl.get("waers") != null) {
				currency = dtl.get("waers").toString();
			}
			if (dtl.get("dmbtr") != null && dtl.get("underchargedQtyBasicUnit") != null) {
				allAmount = allAmount.add(new BigDecimal(dtl.get("dmbtr").toString()).multiply(new BigDecimal(dtl.get("underchargedQtyBasicUnit").toString())));
			} else if (dtl.get("dmbtr") != null && dtl.get("overchargedQtyBasicUnit") != null) {
				allAmount = allAmount.add(new BigDecimal(dtl.get("dmbtr").toString()).multiply(new BigDecimal(dtl.get("overchargedQtyBasicUnit").toString())));
			}
		}
		// 头表数据
		Map<String, Object> mapHead = new HashMap<>();
		mapHead.put("businessType", BUSINESS_TYPE_OVERSEA_DELIVERY);
        mapHead.put("bianhao", "");
        // 工号
        mapHead.put("workcode", spmsUser.getUserId());
        // 申请日期
        mapHead.put("workflowdate", headVO.getSubmitOaDate());
        // 申请人
        mapHead.put("requestuserid", spmsUser.getWorkId());
        // 申请人部门
        mapHead.put("dep", spmsUser.getDeptId() == null  ? "" : spmsUser.getDeptId());
        // 岗位
        mapHead.put("jobtitle", spmsUser.getPositionId() == null  ? "" : spmsUser.getPositionId());
        // 分公司
        mapHead.put("sub", spmsUser.getCompany() == null ? "" : spmsUser.getCompany());
        // 分点
        mapHead.put("fendian", spmsUser.getBranchPoint() == null ? "" : spmsUser.getBranchPoint());
        // 职级
        mapHead.put("joblevel", "");
        // 附件
        mapHead.put("workfile", "");
        // 出库类型
        if ("Z15".equals(headVO.getMovementType())) {
        	// 少收
        	mapHead.put("stocktype", "0");
        } else if ("Z16".equals(headVO.getMovementType())) {
        	// 多收
        	mapHead.put("stocktype", "1");
        }
        // 仓库-库区
        mapHead.put("area", "");
        // 调账说明
        mapHead.put("tzremark", StringUtils.isNotBlank(headVO.getRemark()) ? headVO.getRemark() : "");
        // 是否加审
        mapHead.put("additional", "1");
        // 执行调账人员
        mapHead.put("Executivepersonnel", spmsUser.getWorkId());
        // POS单号/SPMS交货单号
        mapHead.put("posdh", headVO.getSapDeliveryNote());
        // POS单号/SPMS交货单号
        mapHead.put("spmsordernum", headVO.getSapDeliveryNote());
        // 相关流程
        mapHead.put("sdworkflow", "");
        // 环境标识
        mapHead.put("hjbs", "");
        // SPMS单号
        mapHead.put("spmsdh", headVO.getSpmsId());
        // 单据类型
        mapHead.put("djlx", "海运收货");
        // 成本中心
        mapHead.put("cbzx", StringUtils.isNotBlank(headVO.getCostCenter()) ? headVO.getCostCenter() : "");
        // 存货损益总金额
        mapHead.put("chsyzje", allAmount.stripTrailingZeros().toPlainString());
        // 币种
        mapHead.put("bz", currency);
        List<Map<String, Object>> mainData = new ArrayList<>();
        for (Map.Entry<String, Object> entry : mapHead.entrySet()){
            Map<String, Object> ol = new HashMap<String, Object>();
            ol.put("fieldName", entry.getKey());
            ol.put("fieldValue", entry.getValue().toString());
            mainData.add(ol);
        }
        params.put("mainData", JSONUtil.parseArray(mainData).toString());
		// 行表数据
        List<Map<String, Object>> mapList = new ArrayList<>();
        for (Map<String, Object> dtl : list) {
        	Map<String, Object> mapItem = new HashMap<>();
        	// 序号
        	mapItem.put("xh", dtl.get("itemNumber").toString());
        	// 仓库-库区
        	mapItem.put("area", dtl.get("whsLocationCode").toString());
        	// 交货单号
        	mapItem.put("sapjhd", headVO.getSapDeliveryNote());
        	// 物料号
        	mapItem.put("wlid", dtl.get("materialNo").toString());
        	// 物料描述
        	mapItem.put("wltext", dtl.get("materialZhDesc").toString());
        	// 出库类型
        	if ("Z15".equals(headVO.getMovementType())) {
            	// 少收
        		mapItem.put("stocktype", "0");
            } else if ("Z16".equals(headVO.getMovementType())) {
            	// 多收
            	mapItem.put("stocktype", "1");
            }
        	// 出库数量
        	mapItem.put("wlquantity", dtl.get("underchargedQtyBasicUnit") != null ? dtl.get("underchargedQtyBasicUnit").toString() : dtl.get("overchargedQtyBasicUnit").toString());
        	// 物料单位
        	mapItem.put("wlunit", dtl.get("basicUnit").toString());
        	// 色号
        	mapItem.put("colorno", "");
        	// 破损原因
        	mapItem.put("causeofbroken", dtl.get("remarks") != null ? dtl.get("remarks").toString() : "");
        	mapList.add(mapItem);
        }
        List<Map<String, Object>> aasDetailList = new ArrayList<>();
        Map<String, Object> aasDetail = new HashMap<>();
        List<Map<String, Object>> detailTableDb = new ArrayList<Map<String, Object>>();
        for (int k = 0; k < mapList.size(); k++) {
            Map<String, Object> item = mapList.get(k);
            Map<String, Object> workflowRequestTableRecord = new HashMap<>();
            workflowRequestTableRecord.put("recordOrder", 0);
            List<Map<String, Object>> detailTable = new ArrayList<Map<String, Object>>();
            for (Map.Entry<String, Object> entry : item.entrySet()) {
                Map<String, Object> ol = new HashMap<String, Object>();
                ol.put("fieldName", entry.getKey());
                ol.put("fieldValue", entry.getValue() == null ? "" : entry.getValue().toString());
                detailTable.add(ol);
            }
            workflowRequestTableRecord.put("workflowRequestTableFields", detailTable);
            detailTableDb.add(workflowRequestTableRecord);
        }
        aasDetail.put("workflowRequestTableRecords", detailTableDb);
        aasDetail.put("tableDBName", "formtable_main_416_dt1");
        aasDetailList.add(aasDetail);
        params.put("detailData", JSONUtil.parseArray(aasDetailList).toString());
        params.put("requestName", "海外备件仓存货损益结果审批 SPMS单号："+headVO.getSpmsId());
        params.put("workflowId", workFlowId);
	}

	@Override
	@Transactional(rollbackFor = Exception.class)
	public ResponseResult toSapWhsInventoryLoss(JSONObject obj, String userId) throws Exception {
		if (StringUtils.isBlank(obj.getString("uuid"))) {
			ResponseResult.error("参数UUID为空，提交失败");
		}
		if (StringUtils.isBlank(obj.getString("postingDate"))) {
			ResponseResult.error("参数过账日期为空，提交失败");
		}
		QueryWrapper<OverseaWhsInventoryLoss> query = new QueryWrapper<OverseaWhsInventoryLoss>().eq("UUID", obj.getString("uuid"));
		OverseaWhsInventoryLoss selectHead = this.baseMapper.selectOne(query);
		if (!OverseaWhsInventoryLossEnum.OA_APPROVED.getCode().equals(selectHead.getSpmsStatus())) {
			ResponseResult.error("当前状态不能提交SAP，提交失败");
		}
		QueryWrapper<OverseaWhsInventoryLossDtl> dtlQuery = new QueryWrapper<OverseaWhsInventoryLossDtl>().eq("HEAD_UUID", selectHead.getUuid());
		List<OverseaWhsInventoryLossDtl> list = iOverseaWhsInventoryLossDtlService.list(dtlQuery);
		// 提交SAP
		this.sendDataToSap(obj, selectHead, list);
		String zhDesc = "";
		String enDesc = "";
		String ruDesc = "";
		if ("Z15".equals(selectHead.getMovementType())) {
			// 少收
			zhDesc = OverseaDeliveryNoteEnum.UNDERCHARGED_COMPLETED.getDescZh();
			enDesc = OverseaDeliveryNoteEnum.UNDERCHARGED_COMPLETED.getDescEn();
			ruDesc = OverseaDeliveryNoteEnum.UNDERCHARGED_COMPLETED.getDescRu();
		} else {
			// 多收
			zhDesc = OverseaDeliveryNoteEnum.OVERCHARGED_COMPLETED.getDescZh();
			enDesc = OverseaDeliveryNoteEnum.OVERCHARGED_COMPLETED.getDescEn();
			ruDesc = OverseaDeliveryNoteEnum.OVERCHARGED_COMPLETED.getDescRu();
		}
		if (OverseaWhsLossOrderTypeEnum.OVERSEA_RECEIVED.getCode().equals(selectHead.getOrderType())) {
			// 根据交货单号更新海运收货单状态
			QueryWrapper<OverseaDeliveryNote> noteQW = new QueryWrapper<OverseaDeliveryNote>().eq("SAP_DELIVERY_NOTE", selectHead.getSapDeliveryNote()).eq("WERKS_RECEIVE", selectHead.getWerks());
			OverseaDeliveryNote note = new OverseaDeliveryNote();
			if ("Z15".equals(selectHead.getMovementType())) {
				// 少收
				note.setSpmsStatus(OverseaDeliveryNoteEnum.UNDERCHARGED_COMPLETED.getCode());
			} else {
				// 多收
				note.setSpmsStatus(OverseaDeliveryNoteEnum.OVERCHARGED_COMPLETED.getCode());
			}
			iOverseaDeliveryNoteService.update(note, noteQW);
			iOverseaOperateLogService.addOverseaOperateLog(userId, selectHead.getSapDeliveryNote(), zhDesc, enDesc, spmsLog, obj.toString(), "", "", ruDesc);
		} else if (OverseaWhsLossOrderTypeEnum.OVERSEA_DUMP.getCode().equals(selectHead.getOrderType()) || 
				OverseaWhsLossOrderTypeEnum.AIR_TRANSPORT.getCode().equals(selectHead.getOrderType())) {
			// 根据交货单号更新其他收货中的海外转储、空运人带单据状态
			QueryWrapper<OverseaDn> dnQW = new QueryWrapper<OverseaDn>().eq("SAP_DELIVERY_NOTE", selectHead.getSapDeliveryNote()).eq("WERKS_RECEIVE", selectHead.getWerks());
			OverseaDn dn = new OverseaDn();
			if ("Z15".equals(selectHead.getMovementType())) {
				// 少收
				dn.setSpmsStatus(OverseaDnEnum.UNDERCHARGED_COMPLETED.getCode());
			} else {
				// 多收
				dn.setSpmsStatus(OverseaDnEnum.OVERCHARGED_COMPLETED.getCode());
			}
			iOverseaDnService.update(dn, dnQW);
			// 增加日志
			iOverseaOperateLogService.addOverseaOperateLog(userId, selectHead.getSapDeliveryNote(), zhDesc, enDesc, spmsLog, obj.toString(), "", "", ruDesc);
		}
		iOverseaOperateLogService.addOverseaOperateLog(userId, selectHead.getUuid(), OverseaWhsInventoryLossEnum.SUBMIT_SAP_SUCCESS.getDescZh(),
				OverseaWhsInventoryLossEnum.SUBMIT_SAP_SUCCESS.getDescEn(), spmsLog, JSON.toJSONString(obj), null, "存货损益提交SAP", OverseaWhsInventoryLossEnum.SUBMIT_SAP_SUCCESS.getDescRu());
		return ResponseResult.success().add("head", this.baseMapper.selectById(selectHead.getUuid())).add("list", list);
	}

	private void sendDataToSap(JSONObject obj, OverseaWhsInventoryLoss selectHead, List<OverseaWhsInventoryLossDtl> list) throws Exception {
		// 设置头信息
		Map<String, Object> dataHead = new HashMap<>();
		this.setSapHeadData(obj, selectHead, dataHead);
		// 设置行信息
		List<Map<String, Object>> itemMap = new ArrayList<>();
		this.setSapItemData(selectHead, list, itemMap);
		JSONObject dataToSap = iFormatDataToSapService.formatDataToSap(dataHead, itemMap, "Z_SPMS_ANOMALY_POST", "ANOMALY_POST");
		// 根据工厂查询对应的SAP Clinet
        List<ZSapOrgClient> selectList = zSapOrgClientMapper.selectList(new QueryWrapper<ZSapOrgClient>().eq("WERKS", selectHead.getWerks()));
        if (CollectionUtils.isNotEmpty(selectList)) {
            JSONObject json = dataToSap.getJSONObject("REQUEST").getJSONObject("ESB_ATTRS");
            json.put("Target_ID", "SAP-"+selectList.get(0).getZmandt());
        } else {
        	throw new Exception("工厂："+selectHead.getWerks()+"未找到对应的SAP Clinet");
        }
        log.info("=======存货损益推送SAP数据 dataToSap=========\n" + dataToSap);
        JSONObject message = JSONObject.parseObject(iFeignServiceCommon.sendRestToSapCommon(dataToSap));
        log.info("=======存货损益推送SAP返回结果 message=========\n" + message);
        JSONObject RETURN_DATA = message.getJSONObject("RESPONSE").getJSONObject("RETURN_DATA");
        String O_MSTXT = RETURN_DATA.getString("O_MSTXT");
        if (SAP_SUCCESS.equals(RETURN_DATA.getString("O_TYPE"))){
        	String underVoucherNumber = RETURN_DATA.getString("O_MBLNR").trim();
            String underVoucherYear = RETURN_DATA.getString("O_MJAHR").trim();
        	// 更新单据状态
    		OverseaWhsInventoryLoss updateVO = new OverseaWhsInventoryLoss();
    		updateVO.setUuid(selectHead.getUuid());
    		updateVO.setPostingDate(obj.getString("postingDate"));
    		updateVO.setSpmsStatus(OverseaWhsInventoryLossEnum.SUBMIT_SAP_SUCCESS.getCode());
    		updateVO.setSapVoucherNumber(underVoucherNumber);
    		updateVO.setSapVoucherYear(underVoucherYear);
    		this.baseMapper.updateById(updateVO);
        } else {
        	throw new Exception("存货损益推送SAP失败："+O_MSTXT);
        }
	}

	private void setSapItemData(OverseaWhsInventoryLoss selectHead, List<OverseaWhsInventoryLossDtl> list, List<Map<String, Object>> itemMap) {
		for (OverseaWhsInventoryLossDtl dtl : list) {
			Map<String, Object> map = new HashMap<>();
			map.put("ZEILE", dtl.getSapDeliveryNoteItem());
			map.put("MATNR", dtl.getMaterialNo());
			map.put("MENGE", dtl.getUnderchargedQtyBasicUnit() != null ? dtl.getUnderchargedQtyBasicUnit() : dtl.getOverchargedQtyBasicUnit());
			map.put("MEINS", dtl.getBasicUnit());
			map.put("LIFNR", "");
			map.put("KOSTL", selectHead.getCostCenter());
			map.put("SGTXT", dtl.getRemarks());
			map.put("WERKS", selectHead.getWerks());
			map.put("LGORT", selectHead.getWhsLocationCode());
			itemMap.add(map);
		}
	}

	private void setSapHeadData(JSONObject obj, OverseaWhsInventoryLoss selectHead, Map<String, Object> dataHead) {
		dataHead.put("LGORT", selectHead.getWhsLocationCode());
		dataHead.put("WERKS", selectHead.getWerks());
		dataHead.put("XBLNR", selectHead.getSapDeliveryNote());
		dataHead.put("BLDAT", DateUtils.format(selectHead.getCreateTime(), "yyyyMMdd"));
		dataHead.put("BUDAT", obj.getString("postingDate").replaceAll("-", ""));
		if ("Z15".equals(selectHead.getMovementType())) {
			dataHead.put("BWART", "Z15");
		} else {
			dataHead.put("BWART", "Z16");
		}
		dataHead.put("BKTXT", selectHead.getSapDeliveryNote()+selectHead.getRemark());
	}

	@Override
	@Transactional(rollbackFor = Exception.class)
	public ResponseResult cancelWhsInventoryLoss(JSONObject obj, String userId) throws Exception {
		if (StringUtils.isBlank(obj.getString("uuid"))) {
			ResponseResult.error("参数UUID为空，提交失败");
		}
		QueryWrapper<OverseaWhsInventoryLoss> query = new QueryWrapper<OverseaWhsInventoryLoss>().eq("UUID", obj.getString("uuid"));
		OverseaWhsInventoryLoss selectHead = this.baseMapper.selectOne(query);
		if (OverseaWhsInventoryLossEnum.DRAFT.getCode().equals(selectHead.getSpmsStatus()) || OverseaWhsInventoryLossEnum.DELETE.getCode().equals(selectHead.getSpmsStatus())) {
			ResponseResult.error("当前状态不能撤销，提交失败");
		}
		// 更新单据状态
		OverseaWhsInventoryLoss updateVO = new OverseaWhsInventoryLoss();
		updateVO.setUuid(selectHead.getUuid());
		updateVO.setSpmsStatus(OverseaWhsInventoryLossEnum.DRAFT.getCode());
		if (OverseaWhsInventoryLossEnum.SUBMIT_SAP_SUCCESS.getCode().equals(selectHead.getSpmsStatus())) {
			// 提交SAP成功进行撤销需要调用SAP接口
			if (StringUtils.isBlank(obj.getString("cancelPostingDate"))) {
				ResponseResult.error("参数撤销过账日期为空，提交失败");
			}
			Map<String, Object> dataHead = new HashMap<>();
			dataHead.put("I_MBLNR", selectHead.getSapVoucherNumber());
			dataHead.put("I_MJAHR", selectHead.getSapVoucherYear());
			dataHead.put("I_BUDAT", obj.getString("cancelPostingDate").replaceAll("-", ""));
			JSONObject dataToSap = iFormatDataToSapService.formatDataToSap(dataHead, null, "Z_SPMS_CANCEL", "SPMS_CANCEL");
			// 根据工厂查询对应的SAP Clinet
            List<ZSapOrgClient> selectList = zSapOrgClientMapper.selectList(new QueryWrapper<ZSapOrgClient>().eq("WERKS", selectHead.getWerks()));
            if (CollectionUtils.isNotEmpty(selectList)) {
            	JSONObject json = dataToSap.getJSONObject("REQUEST").getJSONObject("ESB_ATTRS");
            	json.put("Target_ID", "SAP-"+selectList.get(0).getZmandt());
            } else {
            	return ResponseResult.error("工厂："+selectHead.getWerks()+"未找到对应的SAP Clinet");
            }
            log.info("=======存货损益撤销同步SAP数据 dataToSap=========\n" + dataToSap);
            JSONObject message = JSONObject.parseObject(iFeignServiceCommon.sendRestToSapCommon(dataToSap));
            log.info("=======存货损益撤销同步SAP响应结果 message=========\n" + message);
            JSONObject RETURN_DATA = message.getJSONObject("RESPONSE").getJSONObject("RETURN_DATA");
            String O_MSTXT = RETURN_DATA.getString("O_MSTXT");
            if (SAP_SUCCESS.equals(RETURN_DATA.getString("O_TYPE"))){
            	String cancelUnderVoucherNumber = RETURN_DATA.getString("0_MBLNR");
            	updateVO.setCancelPostingDate(obj.getString("cancelPostingDate"));
            	updateVO.setCancelVoucherNumber(cancelUnderVoucherNumber);
            } else {
            	throw new Exception("存货损益撤销同步SAP失败："+O_MSTXT);
            }
		}
		this.baseMapper.updateById(updateVO);
		// 更新来源单据状态
		if (OverseaWhsInventoryLossEnum.SUBMIT_SAP_SUCCESS.getCode().equals(selectHead.getSpmsStatus())) {
			String zhDesc = "";
			String enDesc = "";
			String ruDesc = "";
			if ("Z15".equals(selectHead.getMovementType())) {
				// 少收
				zhDesc = OverseaDeliveryNoteEnum.UNDERCHARGED_TO_OA.getDescZh();
				enDesc = OverseaDeliveryNoteEnum.UNDERCHARGED_TO_OA.getDescEn();
				ruDesc = OverseaDeliveryNoteEnum.UNDERCHARGED_TO_OA.getDescRu();
			} else {
				// 多收
				zhDesc = OverseaDeliveryNoteEnum.OVERCHARGED_TO_OA.getDescZh();
				enDesc = OverseaDeliveryNoteEnum.OVERCHARGED_TO_OA.getDescEn();
				ruDesc = OverseaDeliveryNoteEnum.OVERCHARGED_TO_OA.getDescRu();
			}
			if (OverseaWhsLossOrderTypeEnum.OVERSEA_RECEIVED.getCode().equals(selectHead.getOrderType())) {
				// 根据交货单号更新海运收货单状态
				QueryWrapper<OverseaDeliveryNote> noteQW = new QueryWrapper<OverseaDeliveryNote>().eq("SAP_DELIVERY_NOTE", selectHead.getSapDeliveryNote()).eq("WERKS_RECEIVE", selectHead.getWerks());
				OverseaDeliveryNote note = new OverseaDeliveryNote();
				if ("Z15".equals(selectHead.getMovementType())) {
					// 少收
					note.setSpmsStatus(OverseaDeliveryNoteEnum.UNDERCHARGED_TO_OA.getCode());
				} else {
					// 多收
					note.setSpmsStatus(OverseaDeliveryNoteEnum.OVERCHARGED_TO_OA.getCode());
				}
				iOverseaDeliveryNoteService.update(note, noteQW);
				iOverseaOperateLogService.addOverseaOperateLog(userId, selectHead.getSapDeliveryNote(), zhDesc, enDesc, spmsLog, obj.toString(), "", "", ruDesc);
			}  else if (OverseaWhsLossOrderTypeEnum.OVERSEA_DUMP.getCode().equals(selectHead.getOrderType()) || 
					OverseaWhsLossOrderTypeEnum.AIR_TRANSPORT.getCode().equals(selectHead.getOrderType())) {
				// 根据交货单号更新其他收货中的海外转储、空运人带单据状态
				QueryWrapper<OverseaDn> dnQW = new QueryWrapper<OverseaDn>().eq("SAP_DELIVERY_NOTE", selectHead.getSapDeliveryNote()).eq("WERKS_RECEIVE", selectHead.getWerks());
				OverseaDn dn = new OverseaDn();
				if ("Z15".equals(selectHead.getMovementType())) {
					// 少收
					dn.setSpmsStatus(OverseaDnEnum.UNDERCHARGED_TO_OA.getCode());
				} else {
					// 多收
					dn.setSpmsStatus(OverseaDnEnum.OVERCHARGED_TO_OA.getCode());
				}
				iOverseaDnService.update(dn, dnQW);
				// 增加日志
				iOverseaOperateLogService.addOverseaOperateLog(userId, selectHead.getSapDeliveryNote(), zhDesc, enDesc, spmsLog, obj.toString(), "", "", ruDesc);
			} 
		}
		iOverseaOperateLogService.addOverseaOperateLog(userId, selectHead.getUuid(), OverseaWhsInventoryLossEnum.DRAFT.getDescZh(),
				OverseaWhsInventoryLossEnum.DRAFT.getDescEn(), spmsLog, JSON.toJSONString(obj), null, "存货损益撤销", OverseaWhsInventoryLossEnum.DRAFT.getDescRu());
		QueryWrapper<OverseaWhsInventoryLossDtl> dtlQuery = new QueryWrapper<OverseaWhsInventoryLossDtl>().eq("HEAD_UUID", selectHead.getUuid());
		return ResponseResult.success().add("head", this.baseMapper.selectById(selectHead.getUuid())).add("list", iOverseaWhsInventoryLossDtlService.list(dtlQuery));
	}

	@Override
	@Transactional(rollbackFor = Exception.class)
	public ResponseResult closeWhsInventoryLoss(JSONObject obj, String userId) throws Exception {
		if (StringUtils.isBlank(obj.getString("uuid"))) {
			ResponseResult.error("参数UUID为空，操作失败");
		}
//		if (StringUtils.isBlank(obj.getString("cancelReason"))) {
//			ResponseResult.error("参数关闭原因为空，操作失败");
//		}
		QueryWrapper<OverseaWhsInventoryLoss> query = new QueryWrapper<OverseaWhsInventoryLoss>().eq("UUID", obj.getString("uuid"));
		OverseaWhsInventoryLoss selectHead = this.baseMapper.selectOne(query);
		if (!OverseaWhsInventoryLossEnum.DRAFT.getCode().equals(selectHead.getSpmsStatus())) {
			ResponseResult.error("当前状态不能关闭，操作失败");
		}
		// 更新单据状态
		OverseaWhsInventoryLoss updateVO = new OverseaWhsInventoryLoss();
		updateVO.setUuid(selectHead.getUuid());
		updateVO.setSpmsStatus(OverseaWhsInventoryLossEnum.DELETE.getCode());
		updateVO.setCancelReason(StringUtils.isNotBlank(obj.getString("cancelReason")) ? obj.getString("cancelReason") : "");
		updateVO.setUpdateTime(new Date());
		updateVO.setUpdateUserid(userId);
		this.baseMapper.updateById(updateVO);
		QueryWrapper<OverseaWhsInventoryLoss> qw = new QueryWrapper<OverseaWhsInventoryLoss>().eq("SAP_DELIVERY_NOTE", selectHead.getSapDeliveryNote()).eq("WERKS", selectHead.getWerks()).ne("SPMS_STATUS", OverseaWhsInventoryLossEnum.DELETE.getCode());
		List<OverseaWhsInventoryLoss> selectList = this.baseMapper.selectList(qw);
		if (CollectionUtils.isEmpty(selectList)) {
			if (OverseaWhsLossOrderTypeEnum.OVERSEA_RECEIVED.getCode().equals(selectHead.getOrderType())) {
				// 更新海运收货单状态
				// 根据交货单号更新海运收货单状态
				QueryWrapper<OverseaDeliveryNote> noteQW = new QueryWrapper<OverseaDeliveryNote>().eq("SAP_DELIVERY_NOTE", selectHead.getSapDeliveryNote()).eq("WERKS_RECEIVE", selectHead.getWerks());
				OverseaDeliveryNote note = new OverseaDeliveryNote();
				note.setSpmsStatus(OverseaDeliveryNoteEnum.OVERSEA_WHS_IN_DONE.getCode());
				iOverseaDeliveryNoteService.update(note, noteQW);
				iOverseaOperateLogService.addOverseaOperateLog(userId, selectHead.getSapDeliveryNote(), OverseaDeliveryNoteEnum.OVERSEA_DN_CANCEL_TO_DONE.getDescZh(), OverseaDeliveryNoteEnum.OVERSEA_DN_CANCEL_TO_DONE.getDescEn(), spmsLog, obj.toString(), "", "", OverseaDeliveryNoteEnum.OVERSEA_DN_CANCEL_TO_DONE.getDescRu());
			} else if (OverseaWhsLossOrderTypeEnum.OVERSEA_DUMP.getCode().equals(selectHead.getOrderType()) || 
					OverseaWhsLossOrderTypeEnum.AIR_TRANSPORT.getCode().equals(selectHead.getOrderType())) {
				// 根据交货单号更新其他收货中的海外转储、空运人带单据状态
				QueryWrapper<OverseaDn> dnQW = new QueryWrapper<OverseaDn>().eq("SAP_DELIVERY_NOTE", selectHead.getSapDeliveryNote()).eq("WERKS_RECEIVE", selectHead.getWerks());
				OverseaDn dn = new OverseaDn();
				dn.setSpmsStatus(OverseaDnEnum.DN_SUBMIT_SAP.getCode());
				iOverseaDnService.update(dn, dnQW);
				// 增加日志
				iOverseaOperateLogService.addOverseaOperateLog(userId, selectHead.getSapDeliveryNote(), "存货损益撤销交货单到提交SAP", "Inventory profit and loss cancellation delivery note to SAP submission.", spmsLog, obj.toString(), "", "", "Прибыль или убыток товарно - материальных запасов.");
			} 
		}
		iOverseaOperateLogService.addOverseaOperateLog(userId, selectHead.getUuid(), OverseaWhsInventoryLossEnum.DELETE.getDescZh(),
				OverseaWhsInventoryLossEnum.DELETE.getDescEn(), spmsLog, JSON.toJSONString(obj), null, "存货损益关闭", OverseaWhsInventoryLossEnum.DELETE.getDescRu());
		QueryWrapper<OverseaWhsInventoryLossDtl> dtlQuery = new QueryWrapper<OverseaWhsInventoryLossDtl>().eq("HEAD_UUID", selectHead.getUuid());
		return ResponseResult.success().add("head", this.baseMapper.selectById(selectHead.getUuid())).add("list", iOverseaWhsInventoryLossDtlService.list(dtlQuery));
	}

}
