package com.huaheng.pc.srm.service;

import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;

import com.huaheng.api.srm.domain.ICSPOArrive;
import com.huaheng.api.srm.domain.ICSPOArriveDetail;
import com.huaheng.api.srm.domain.ICSinspection;
import com.huaheng.common.constant.QuantityConstant;
import com.huaheng.common.exception.service.ServiceException;
import com.huaheng.common.utils.DateUtils;
import com.huaheng.common.utils.StringUtils;
import com.huaheng.common.utils.Wrappers;
import com.huaheng.common.utils.security.ShiroUtils;
import com.huaheng.framework.web.domain.AjaxResult;
import com.huaheng.pc.config.material.domain.Material;
import com.huaheng.pc.config.material.service.MaterialService;
import com.huaheng.pc.config.warehouse.domain.WarehouseU8;
import com.huaheng.pc.config.warehouse.service.WarehouseService;

import com.huaheng.pc.config.warehouse.service.WarehouseU8Service;
import com.huaheng.pc.receipt.receiptDetail.domain.ReceiptDetail;
import com.huaheng.pc.receipt.receiptDetail.service.ReceiptDetailService;
import com.huaheng.pc.receipt.receiptHeader.domain.ReceiptHeader;
import com.huaheng.pc.receipt.receiptHeader.service.ReceiptHeaderService;
import com.huaheng.pc.srm.domain.ICSASN;
import com.huaheng.pc.srm.domain.SrmDetail;
import com.huaheng.pc.srm.domain.SrmHeader;
import com.huaheng.pc.srm.mapper.ICSASNMapper;
import com.huaheng.pc.srm.mapper.SrmHeaderMapper;
import com.huaheng.pc.system.user.domain.User;
import com.huaheng.pc.system.user.service.IUserService;
import com.huaheng.pc.u8.domain.ICSReceiptDetail;
import com.huaheng.pc.u8.domain.ICSReceiptHeader;
import com.huaheng.pc.u8.domain.ICSReceiptModel;
import com.huaheng.pc.u8.service.ICSReceiptAPIService;
import com.huaheng.pc.u8.service.ICSReceiptDetailService;
import com.huaheng.pc.u8.service.ICSReceiptHeaderService;
import org.apache.commons.collections.CollectionUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.math.BigDecimal;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.stream.Collectors;

@Service
public class SrmHeaderService extends ServiceImpl<SrmHeaderMapper, SrmHeader> {

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


    @Resource
    private SrmHeaderMapper srmHeaderMapper;
    @Resource
    private SrmDetailService srmDetailService;
    @Resource
    private ICSASNService icsasnService;
    @Resource
    private ICSReceiptAPIService icsReceiptAPIService;
    @Resource
    private IUserService userService;
    @Resource
    private WarehouseU8Service warehouseU8Service;
    @Resource
    private ReceiptHeaderService receiptHeaderService;
    @Resource
    private ICSReceiptHeaderService icsReceiptHeaderService;
    @Resource
    private ICSReceiptDetailService icsReceiptDetailService;
    @Resource
    private MaterialService materialService;
    @Resource
    private ReceiptDetailService receiptDetailService;

    public SrmHeader selectFirstModel(SrmHeader srmHeader){
        LambdaQueryWrapper<SrmHeader> queryWrapper = Wrappers.lambdaQuery();
        queryWrapper.eq(StringUtils.isNotNull(srmHeader.getId()),SrmHeader::getId,srmHeader.getId());
        queryWrapper.eq(StringUtils.isNotEmpty(srmHeader.getCode()),SrmHeader::getCode,srmHeader.getCode());
        queryWrapper.eq(StringUtils.isNotEmpty(srmHeader.getWarehouseCode()),SrmHeader::getWarehouseCode,srmHeader.getWarehouseCode());
        queryWrapper.last("limit 1");
        return this.getOne(queryWrapper);
    }
    public List<SrmHeader> selectBySTNO(List<String> STNOS) {
        if(STNOS!=null&&STNOS.size()>0){
            String[] split=STNOS.toArray(new String[0]);
            LambdaQueryWrapper<SrmHeader> queryWrapper = Wrappers.lambdaQuery();
            queryWrapper.in(SrmHeader::getCode,split);
            return this.list(queryWrapper);
        }
        return null;
    }
    /**
     * 根据条件查询list
     * @param srmHeader
     * @return
     */
    public List<SrmHeader> selectList(SrmHeader srmHeader) {
        LambdaQueryWrapper<SrmHeader> queryWrapper = Wrappers.lambdaQuery();
        queryWrapper.like(StringUtils.isNotEmpty(srmHeader.getCode()),SrmHeader::getCode,srmHeader.getCode());
        queryWrapper.ge(StringUtils.isNotNull(srmHeader.getEnable()),SrmHeader::getEnable,srmHeader.getEnable());
        queryWrapper.ge(StringUtils.isNotNull(srmHeader.getCheckCode()),SrmHeader::getCheckCode,srmHeader.getCheckCode());
        queryWrapper.eq(StringUtils.isNotEmpty(srmHeader.getSupplierCode()),SrmHeader::getSupplierCode,srmHeader.getSupplierCode());
        queryWrapper.eq(StringUtils.isNotNull(srmHeader.getMark()),SrmHeader::getMark,srmHeader.getMark());
        queryWrapper.like(StringUtils.isNotEmpty(srmHeader.getUserDef2()),SrmHeader::getUserDef2,srmHeader.getUserDef2());
        queryWrapper.eq(SrmHeader::getWarehouseCode,ShiroUtils.getWarehouseCode());
        queryWrapper.orderByDesc(SrmHeader::getId);

        return this.list(queryWrapper);
    }

    /**
     * 回传srm
     * @return
     */
    @Transactional
    public AjaxResult returnSrmModel() {
        //1、查找所有需要回传的明细
        List<SrmDetail> details = new ArrayList<>();
        SrmDetail srmDetail = new SrmDetail();
        srmDetail.setUploadStatus1(0);
        srmDetail.setEnable(1);
        List<SrmDetail> srmDetailList = srmDetailService.selectList(srmDetail);

        srmDetail.setUploadStatus1(2);
        List<SrmDetail> srmDetails = srmDetailService.selectList(srmDetail);

        if (srmDetailList.isEmpty() && srmDetails.isEmpty()) {
            return AjaxResult.success("没有目标数据");
        }

        if (!srmDetailList.isEmpty()) {
            details.addAll(srmDetailList);
        }
        if (!srmDetails.isEmpty()) {
            details.addAll(srmDetails);
        }

        if(details!=null&&details.size()>50){
            details=details.subList(0,49);
        }
        return this.confirmSRMModel(details);
    }


    /**
     * 回传实体
     * @param details
     * @return
     */
    @Transactional
    public AjaxResult comfirmSrmModel(List<SrmDetail> details) {
        //单据根据单号分组,组建回传实体
        //根据code去重
        Set<String> codes = new HashSet<>();
        String warehouseCode=null;
        for (SrmDetail detail : details) {
            codes.add(detail.getCode());
        }
        warehouseCode=details.get(0).getWarehouseCode();
//        List<SrmDetail> newlist = details.stream().collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(SrmDetail :: getCode))), ArrayList::new));

        Integer number = 0;
        for (String code : codes) {
            List<ICSPOArrive> icspoArrives = new ArrayList<>();

            List<ICSPOArriveDetail> icspoArriveDetails = new ArrayList<>();
            //将相同code的放一个list
            icspoArriveDetails=createIcspoArriveDetail(details,code,icspoArriveDetails);
            //创建ICSPOArrive
            ICSPOArrive icspoArrive=createIcspoArrive(details,code,icspoArriveDetails);

            icspoArrives.add(icspoArrive);
            AjaxResult ajaxResult = icsasnService.returnICSPOArrive(icspoArrives,warehouseCode);
            if (ajaxResult.hasErr()) {
                for (SrmDetail detail : details) {
                    if (detail.getCode().equals(code)) {
                        detail.setUploadStatus1(2);
                        srmDetailService.updateById(detail);
                    }
                }
                number++;
            } else {
                for (SrmDetail detail : details) {
                    if (detail.getCode().equals(code)) {
                        detail.setUploadStatus1(1);
                        srmDetailService.updateById(detail);
                    }
                }
            }
        }
        if (number == codes.size()) {
            return AjaxResult.error("失败");
        }
        return AjaxResult.success("成功");

    }
    //组建回传实体
    public List<ICSPOArriveDetail> createIcspoArriveDetail(List<SrmDetail> details,String code,List<ICSPOArriveDetail> icspoArriveDetails){
        for (SrmDetail item : details) {
            if (item.getCode().equals(code)) {
                ICSPOArriveDetail icspoArriveDetail = new ICSPOArriveDetail();
                icspoArriveDetail.setLOTNO(item.getLineCode());
                icspoArriveDetail.setWHCode(item.getUWarehouseCode());
                icspoArriveDetail.setReceiveQty(item.getConfirmQty());
                icspoArriveDetails.add(icspoArriveDetail);
            }
        }
        return icspoArriveDetails;
    }
    //组建回传实体
    public ICSPOArrive createIcspoArrive(List<SrmDetail> details,String code,List<ICSPOArriveDetail> icspoArriveDetails){
        ICSPOArrive icspoArrive = new ICSPOArrive();
        icspoArrive.setUser(details.get(0).getLastUpdateBy());
        User user = userService.selectUserByLoginName(details.get(0).getLastUpdateBy());
        if (user != null) {
            icspoArrive.setMUSERName(user.getUserName());
        }
        WarehouseU8 warehouseWu = new WarehouseU8();
        warehouseWu.setUWarehouseCode(details.get(0).getUWarehouseCode());
        warehouseWu.setCompanyCode(details.get(0).getCompanyCode());
        warehouseWu.setWarehouseCode("KS0001");
        List<WarehouseU8> warehouseWulist = warehouseU8Service.getByDomain(warehouseWu);
        if(warehouseWulist!=null&&warehouseWulist.size()>0){
            warehouseWu=warehouseWulist.get(0);
            icspoArrive.setCompanyCode(warehouseWu.getUCompanyCode().substring(7,10));
        }else {
            icspoArrive.setCompanyCode("");
        }

        icspoArrive.setMTime(DateUtils.getTime());
        icspoArrive.setASNNO(code);
        icspoArrive.setCompanyCode("");
        icspoArrive.setType(QuantityConstant.PLATFORM_SRM);
        icspoArrive.setDetails(icspoArriveDetails);
        return icspoArrive;
    }


    @Transactional
    public AjaxResult returnSrmCheck() {
        //1、查找所有需要回传的明细
        List<SrmDetail> details = new ArrayList<>();
        SrmDetail srmDetail = new SrmDetail();
        srmDetail.setCheckCode(2);
        srmDetail.setUploadStatus1(1);
        srmDetail.setUploadStatus2(0);
        srmDetail.setEnable(1);
        List<SrmDetail> srmDetailList = srmDetailService.selectList(srmDetail);

        srmDetail.setUploadStatus2(2);
        List<SrmDetail> srmDetails = srmDetailService.selectList(srmDetail);

        if(srmDetailList.isEmpty() && srmDetails.isEmpty()){
            return AjaxResult.success("没有目标数据");
        }

        if(!srmDetailList.isEmpty()){
            details.addAll(srmDetailList);
        }
        if(!srmDetails.isEmpty()){
            details.addAll(srmDetails);
        }

        if(details!=null&&details.size()>100){
            details = details.subList(0, 99);
        }

        //组建回传实体
        List<ICSinspection> icSinspections = createICSinspection(details);

        AjaxResult ajaxResult = icsasnService.returnICSinspection(icSinspections,details.get(0).getWarehouseCode());
        if(ajaxResult.hasErr()){
            for (SrmDetail detail : details) {
                detail.setUploadStatus2(2);
                srmDetailService.updateById(detail);
            }
            try {
                if(StringUtils.isNotEmpty(ajaxResult.getMsg())){
                    String s = ajaxResult.getMsg().trim().split(":")[1];
                    if(StringUtils.isNotEmpty(s)){
                        String lineCode = s.split("未")[0];
                        srmDetailService.updateByLineCode(lineCode);
                    }
                }
            }catch (Exception e) {

            }
            return AjaxResult.error("失败");


        }else {
            for (SrmDetail detail : details) {
                detail.setUploadStatus2(1);
                srmDetailService.updateById(detail);
            }
            return AjaxResult.success("成功");
        }
    }
    //组建回传实体
    public List<ICSinspection>  createICSinspection(List<SrmDetail> details ){
        List<ICSinspection> icSinspections = new ArrayList<>();
        for (SrmDetail detail : details) {
            ICSinspection icSinspection = new ICSinspection();
            icSinspection.setLotNo(detail.getLineCode());
            icSinspection.setYLOTQTY(detail.getQualifiedQty());
            icSinspection.setNLOTQTY(detail.getUnqualifiedQty());
            if(StringUtils.isEmpty(detail.getReason())){
                icSinspection.setBadCause("");
            }else {
                icSinspection.setBadCause(detail.getReason());
            }
            if(StringUtils.isEmpty(detail.getCheckUser())){
                icSinspection.setUser("");
                icSinspection.setMUSERName("");
            }else {
                icSinspection.setUser(detail.getCheckUser());
                User user = userService.selectUserByLoginName(detail.getCheckUser());
                if(user!=null){
                    icSinspection.setMUSERName(user.getUserName());
                }
            }
            SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            if(StringUtils.isNull(detail.getCheckTime())){
                String dt = simpleDateFormat.format(new Date());
                icSinspection.setMTime(dt);
            }else {
                String dt = simpleDateFormat.format(detail.getCheckTime());
                icSinspection.setMTime(dt);
            }
            icSinspections.add(icSinspection);
        }
        return icSinspections;
    }


    @Transactional(rollbackFor = Exception.class)
    public AjaxResult getReceipt(String[] ids)throws ParseException {
        //分别获取主单和未上传的明细
        for (String id : ids) {
            SrmHeader srmHeader = this.getById(id);
            if(srmHeader == null){
                return AjaxResult.error("id为"+id+"的到货单不存在");
            }
            SrmDetail srmDetail = new SrmDetail();
            //查询未提交的明细
            srmDetail.setUploadStatus4(0);
            srmDetail.setEnable(1);
            srmDetail.setHeaderId(srmHeader.getId());
            List<SrmDetail> srmDetailList = srmDetailService.selectList(srmDetail);
            if(srmDetailList.isEmpty()){
                break;
            }
            //转换为接口实体,发送获取ERP单据
            List<ICSPOArrive> icspoArrives = new ArrayList<>();
            ICSPOArrive icspoArrive = new ICSPOArrive();
            List<ICSPOArriveDetail> icspoArriveDetails = new ArrayList<>();
            for (SrmDetail item : srmDetailList) {
                if(item.getConfirmQty().compareTo(new BigDecimal(0)) == 1) {
                    ICSPOArriveDetail icspoArriveDetail = new ICSPOArriveDetail();
                    icspoArriveDetail.setLOTNO(item.getLineCode());
                    icspoArriveDetail.setReceiveQty(item.getConfirmQty());
                    icspoArriveDetail.setWHCode(item.getUWarehouseCode());
                    icspoArriveDetails.add(icspoArriveDetail);
                }
            }
            if(icspoArriveDetails.isEmpty()){
                break;
            }
            SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            String dt = simpleDateFormat.format(new Date());
            icspoArrive.setUser(ShiroUtils.getLoginName());
            User user = userService.selectUserByLoginName(ShiroUtils.getLoginName());
            if(user!=null){
                icspoArrive.setMUSERName(user.getUserName());
            }
            icspoArrive.setCompanyCode(srmDetailList.get(0).getCompanyCode());
            icspoArrive.setMTime(dt);
            icspoArrive.setASNNO(srmHeader.getCode());
            icspoArrive.setType("ERP");
            icspoArrive.setDetails(icspoArriveDetails);
            icspoArrives.add(icspoArrive);

            //获取ERP到货单
            AjaxResult ajaxResult = icsasnService.returnICSPOArrive(icspoArrives,srmHeader.getWarehouseCode());
            List<ICSReceiptModel> icsReceiptModels = new ArrayList<>();
            if(ajaxResult.hasErr()){
                // 获取到货单失败改为从数据库获取
                icsReceiptModels = this.getICSReceiptModelList(srmHeader);
            }else {
                try {
                    icsReceiptModels = this.parseResults(ajaxResult, srmHeader, srmDetailList.get(0).getCompanyCode());
                } catch (Exception e) {
                    this.updateErrMsg(srmHeader, e.getMessage());
                    return AjaxResult.error(e.getMessage());
                }
            }
            if (icsReceiptModels.size() == 0){
                this.updateErrMsg(srmHeader, ajaxResult.getMsg());
                return ajaxResult;
            }
            for (ICSReceiptModel icsReceiptModel :icsReceiptModels){
                // 生成入库信息
                try {
                    ajaxResult  = icsReceiptAPIService.insertICSReceipts(icsReceiptModel);
                    if (ajaxResult.hasErr()){
                        return ajaxResult;
                    }
                }catch (Exception e){
                    this.updateErrMsg(srmHeader, e.getMessage());
                    return AjaxResult.error(e.getMessage());
                }finally {
                    ajaxResult = this.saveResult(icsReceiptModel);
                }
                String json = JSON.toJSONString(icsReceiptModel);
                logger.info("WMS到货单实体:{}",json);
                if(ajaxResult.hasErr()){
                    this.updateErrMsg(srmHeader, ajaxResult.getMsg());
                    return ajaxResult;
                }
            }
            srmHeader.setUploadStatus(1);
            boolean isMandatory = false;
            for (SrmDetail item : srmDetailList) {
                if(item.getConfirmQty().compareTo(new BigDecimal(0)) == 1) {
                    item.setUploadStatus4(1);
                    // 物料编码不为2开头认为不检
                    Material materialall = materialService.getMaterialByCode(item.getMaterialCode(), ShiroUtils.getWarehouseCode());
                    boolean flag=false;
                    if(materialall!=null&&materialall.getQcFlag()!=null){
                        flag = materialall.getQcFlag().equals("0");
                    }
                    if (!("2".equals(item.getMaterialCode().substring(0,1)))||flag){
                        item.setCheckCode(2);
                        // 不合格数量是否等于0
                        if (item.getUnqualifiedQty().compareTo(new BigDecimal(0)) == 0){
                            item.setQualifiedQty(item.getConfirmQty());
                            item.setCheckTime(new Date());
                            item.setCheckUser(ShiroUtils.getLoginName());
                        }
                    }else {
                        isMandatory = true;
                    }
                    srmDetailService.updateById(item);
                }
            }
            if (isMandatory == false){
                srmHeader.setCheckCode(2);
            }
            this.updateById(srmHeader);
            if(srmHeader.getCheckCode() < 2) {
                //修改入库单,不显示
                ReceiptHeader receiptHeader = new ReceiptHeader();
                receiptHeader.setUserDef3(srmHeader.getCode());
                List<ReceiptHeader> receiptHeaderlist = receiptHeaderService.getByDomain(receiptHeader);
                if(receiptHeaderlist != null&&receiptHeaderlist.size()>0){
                    receiptHeader=receiptHeaderlist.get(0);
                    receiptHeader.setDeleted(true);
                    receiptHeaderService.updateById(receiptHeader);
                }
            }


        }
        return AjaxResult.success("获取ERP到货单成功");
    }

    private List<ICSReceiptModel> getICSReceiptModelList(SrmHeader srmHeader) {
        List<ICSReceiptModel> icsReceiptModels = new ArrayList<>();
        if (srmHeader == null){
            return icsReceiptModels;
        }
        // 获取erp到货单失败,从另一个接口获取
        ICSReceiptHeader query = new ICSReceiptHeader();
        query.setCTVCode(srmHeader.getCode());
        query.setWarehouseCode(srmHeader.getWarehouseCode());
        List<ICSReceiptHeader> icsReceiptHeaderList = icsReceiptHeaderService.selectModelList(query);
        if (icsReceiptHeaderList.isEmpty()){
            return icsReceiptModels;
        }
        if (icsReceiptHeaderList.size() == 0){
            return icsReceiptModels;
        }
        for (ICSReceiptHeader header : icsReceiptHeaderList){
            LambdaQueryWrapper<ICSReceiptDetail> lambdaQueryWrapper=Wrappers.lambdaQuery();
            lambdaQueryWrapper.eq(ICSReceiptDetail::getID,header.getID());
            lambdaQueryWrapper.eq(ICSReceiptDetail::getCompanyCode,header.getCompanyCode());
            lambdaQueryWrapper.eq(ICSReceiptDetail::getWarehouseCode,header.getWarehouseCode());
            List<ICSReceiptDetail> details = icsReceiptDetailService.list(lambdaQueryWrapper);
            ICSReceiptModel icsReceiptModel = new ICSReceiptModel();
            icsReceiptModel.setIcsReceiptHeader(header);
            icsReceiptModel.setIcsReceiptDetails(details);
            icsReceiptModels.add(icsReceiptModel);
        }
        return icsReceiptModels;
    }

    public AjaxResult getReceiptlist(List<SrmDetail> srmDetails) throws ParseException {
        if (srmDetails.isEmpty()){
            return AjaxResult.error("请勿提交空数据!");
        }
        List<ICSPOArrive> list = dataConversion(srmDetails);
        if (list.size() == 0){
            return AjaxResult.success("已成功获取erp到货单!");
        }
        SrmHeader srmHeader = new SrmHeader();
        srmHeader.setCode(srmDetails.get(0).getCode());
        srmHeader.setWarehouseCode(srmDetails.get(0).getWarehouseCode());
        srmHeader = this.selectFirstModel(srmHeader);
        if (srmHeader == null){
            return AjaxResult.error("未查询到送货单主表!");
        }
        // 获取ERP到货单
        AjaxResult ajaxResult = icsasnService.returnICSPOArrive(list,srmHeader.getWarehouseCode());
        List<ICSReceiptModel> icsReceiptModels;
        if (ajaxResult.hasErr()){
            this.updateErrMsg(srmHeader, ajaxResult.getMsg());
            return ajaxResult;
        }else {
            // 解析erp到货单数据
            try {
                icsReceiptModels = this.parseResults(ajaxResult, srmHeader, srmDetails.get(0).getCompanyCode());
                // 修改送货单主表
                srmHeader.setUploadStatus(1);
                this.updateById(srmHeader);
            }catch (Exception e){
                this.updateErrMsg(srmHeader, e.getMessage());
                return AjaxResult.error(e.getMessage());
            }
            if (icsReceiptModels.size() == 0){
                this.updateErrMsg(srmHeader, ajaxResult.getMsg());
                return ajaxResult;
            }
            for (ICSReceiptModel icsReceiptModel :icsReceiptModels){
                // 生成入库信息
                try {
                    ajaxResult  = icsReceiptAPIService.insertICSReceipts(icsReceiptModel);
                    if (ajaxResult.hasErr()){
                        return ajaxResult;
                    }
                }catch (Exception e){
                    this.updateErrMsg(srmHeader, e.getMessage());
                    return AjaxResult.error(e.getMessage());
                }finally {
                    ajaxResult = this.saveResult(icsReceiptModel);
                }
                String json = JSON.toJSONString(icsReceiptModel);
                logger.info("WMS到货单实体:{}",json);
                if(ajaxResult.hasErr()){
                    this.updateErrMsg(srmHeader, ajaxResult.getMsg());
                    return ajaxResult;
                }
            }
            // 是否必检查
            boolean isMandatory = false;
            for (SrmDetail item : srmDetails) {
                if(item.getConfirmQty().compareTo(new BigDecimal(0)) == 1) {
                    item.setUploadStatus4(1);
                    // 物料编码不为2开头认为不检
                    if (!("2".equals(item.getMaterialCode().substring(0,1)))){
                        item.setCheckCode(2);
                        // 不合格数量是否等于0
                        if (item.getUnqualifiedQty().compareTo(new BigDecimal(0)) == 0){
                            item.setQualifiedQty(item.getConfirmQty());
                            item.setCheckTime(new Date());
                            item.setCheckUser(ShiroUtils.getLoginName());
                        }
                    }else {
                        isMandatory = true;
                    }
                    srmDetailService.updateById(item);
                }
            }
            if (isMandatory){
                //修改入库单,不显示
                ReceiptHeader receiptHeader = new ReceiptHeader();
                receiptHeader.setUserDef3(srmHeader.getCode());
                receiptHeader.setReferCode(icsReceiptModels.get(0).getIcsReceiptHeader().getCCode());
                List<ReceiptHeader> receiptHeaderList = receiptHeaderService.getByDomain(receiptHeader);
                if(receiptHeaderList.size() > 0){
                    receiptHeaderList.forEach(item->{
                        item.setDeleted(true);
                        receiptHeaderService.updateById(item);
                    });
                }
            }
        }
        return AjaxResult.success("送货单提交成功!");
    }

    public List<ICSPOArrive> dataConversion(List<SrmDetail> srmDetails) {
        //转换为接口实体,发送获取ERP单据
        List<ICSPOArrive> icspoArrives = new ArrayList<>();
        ICSPOArrive icspoArrive = new ICSPOArrive();
        List<ICSPOArriveDetail> icspoArriveDetails = new ArrayList<>();
        for (SrmDetail srmDetail :srmDetails){
            srmDetail.setUploadStatus4(0);
            if (srmDetail.getUploadStatus4() == 0 && srmDetail.getEnable() == 1 &&
                    srmDetail.getConfirmQty().compareTo(new BigDecimal(0)) == 1){
                ICSPOArriveDetail icspoArriveDetail = new ICSPOArriveDetail();
                icspoArriveDetail.setLOTNO(srmDetail.getLineCode());
                icspoArriveDetail.setReceiveQty(srmDetail.getConfirmQty());
                icspoArriveDetail.setWHCode(srmDetail.getUWarehouseCode());
                icspoArriveDetails.add(icspoArriveDetail);
            }else {
                break;
            }
        }
        if(icspoArriveDetails.isEmpty()){
            return icspoArrives;
        }
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String dt = format.format(new Date());
        icspoArrive.setUser(ShiroUtils.getLoginName());
        User user = userService.selectUserByLoginName(ShiroUtils.getLoginName());
        if(user!=null){
            icspoArrive.setMUSERName(user.getUserName());
        }
        icspoArrive.setCompanyCode(srmDetails.get(0).getCompanyCode());
        icspoArrive.setMTime(dt);
        icspoArrive.setASNNO(srmDetails.get(0).getCode());
        icspoArrive.setType("ERP");
        icspoArrive.setDetails(icspoArriveDetails);
        icspoArrives.add(icspoArrive);
        return icspoArrives;
    }

    public Boolean updateErrMsg(SrmHeader srmHeader, String msg) {
        srmHeader.setUploadStatus(2);
        srmHeader.setUserDef2("");
        srmHeader.setUserDef1(msg);
        return this.updateById(srmHeader);
    }
    @Transactional
    public AjaxResult saveResult(ICSReceiptModel icsReceiptModel) {
        if (icsReceiptModel == null){
            return AjaxResult.error("erp到货单接口返回结果为空值!");
        }
        // 查询数据是否已经存在
        ICSReceiptHeader query = new ICSReceiptHeader();
        query.setID(icsReceiptModel.getIcsReceiptHeader().getID());
        query.setCCode(icsReceiptModel.getIcsReceiptHeader().getCCode());
        query.setCTVCode(icsReceiptModel.getIcsReceiptHeader().getCTVCode());

        List<ICSReceiptHeader> list = icsReceiptHeaderService.selectModelList(query);
        if (list.size() > 0){
            return AjaxResult.success();
        }
        // 先保存数据在进行处理
        Boolean result = icsReceiptHeaderService.save(icsReceiptModel.getIcsReceiptHeader());
        if (!result ){
            return AjaxResult.error("插入出库下发或回传主单失败!");
        }
        ICSReceiptDetail icsReceiptDetail = new ICSReceiptDetail();
        // 主单id与送货单号是否已经存在
        icsReceiptDetail.setID(query.getID());
        icsReceiptDetail.setCCode(query.getCCode());
        List<ICSReceiptDetail> icsReceiptDetailList = icsReceiptDetailService.selectModelList(icsReceiptDetail);
        // 以存在不进行新增
        if (icsReceiptDetailList.size() > 0){
            return AjaxResult.success();
        }
        result = icsReceiptDetailService.saveBatch(icsReceiptModel.getIcsReceiptDetails());
        if (!result ){
            return AjaxResult.error("插入出库下发或回传单子表失败!");
        }
        return AjaxResult.success();
    }

    public List<ICSReceiptModel> parseResults(AjaxResult ajaxResult, SrmHeader srmHeader,String companyCode) {
        List<ICSReceiptModel> icsReceiptModels = new ArrayList<>();
        //调用ERP单据存储和wms采购到货单生成
        Object object = ajaxResult.getData();
        String ja = String.valueOf(object);

        List<Map> icsReceipts = JSON.parseObject(ja, ArrayList.class);
        for (Map map : icsReceipts) {
            ICSReceiptHeader icsReceiptHeader = new ICSReceiptHeader();
            if(StringUtils.isNotNull(map.get("cWhCode"))) {
                icsReceiptHeader.setCWHCode(map.get("cWhCode").toString());
            }
            if(StringUtils.isNotNull(map.get("cVenCode"))) {
                icsReceiptHeader.setCVenCode(map.get("cVenCode").toString());
            }
            if(StringUtils.isNotNull(map.get("POCode"))) {
                icsReceiptHeader.setDPODate(map.get("POCode").toString());
            }
            if(StringUtils.isNotNull(map.get("cMaker"))) {
                icsReceiptHeader.setCMaker(map.get("cMaker").toString());
            }
            if(StringUtils.isNotNull(map.get("cBusType"))) {
                icsReceiptHeader.setCBusType(map.get("cBusType").toString());
            }
            if(StringUtils.isNotNull(map.get("cDepCode"))) {
                icsReceiptHeader.setCDepCode(map.get("cDepCode").toString());
            }
            if(StringUtils.isNotNull(map.get("dPODate"))) {
                icsReceiptHeader.setDPODate(map.get("dPODate").toString());
            }
            if(StringUtils.isNotNull(map.get("cMemo"))) {
                icsReceiptHeader.setCMemo(map.get("cMemo").toString());
            }
            if(StringUtils.isNotNull(map.get("ID"))) {
                icsReceiptHeader.setID(Integer.valueOf(map.get("ID").toString()));
            }
            if(StringUtils.isNotNull(map.get("cCode"))) {
                icsReceiptHeader.setCCode(map.get("cCode").toString());
            }
            if(StringUtils.isNotNull(map.get("cPersonCode"))) {
                icsReceiptHeader.setCPersonCode(map.get("cPersonCode").toString());
            }
            if (StringUtils.isNotNull(map.get("cCode"))){
                if(StringUtils.isEmpty(srmHeader.getUserDef2())) {
                    srmHeader.setUserDef2(map.get("cCode").toString());
                }else {
                    srmHeader.setUserDef2(srmHeader.getUserDef2()+";"+map.get("cCode").toString());
                }
            }

            icsReceiptHeader.setType(QuantityConstant.U8_RECEIPT_TYPE_PI);
            icsReceiptHeader.setCTVCode(srmHeader.getCode());
            icsReceiptHeader.setSourcePlatform(QuantityConstant.PLATFORM_SRM);
            icsReceiptHeader.setCompanyCode(companyCode);
            icsReceiptHeader.setWarehouseCode(srmHeader.getWarehouseCode());

            List<Map> list = JSON.parseObject(map.get("list").toString(), ArrayList.class);
            List<ICSReceiptDetail> icsReceiptDetails = new ArrayList<>();

            for (Map item : list) {
                ICSReceiptDetail icsReceiptDetail = new ICSReceiptDetail();
                if(StringUtils.isNotNull(item.get("cInvCode"))) {
                    icsReceiptDetail.setCInvCode(item.get("cInvCode").toString());
                }
                if(StringUtils.isNotNull(item.get("iQuantity"))) {
                    icsReceiptDetail.setIQuantity(new BigDecimal(item.get("iQuantity").toString()));
                }
                if(StringUtils.isNotNull(item.get("POCode"))) {
                    icsReceiptDetail.setPOCode(item.get("POCode").toString());
                }
                if(StringUtils.isNotNull(item.get("Autoid"))) {
                    icsReceiptDetail.setAutoID(Integer.valueOf(item.get("Autoid").toString()));
                }
                if(StringUtils.isNotNull(item.get("POID"))) {
                    icsReceiptDetail.setPOID(Integer.valueOf(item.get("POID").toString()));
                }
                if(StringUtils.isNotNull(item.get("PODID"))) {
                    icsReceiptDetail.setPODID(Integer.valueOf(item.get("PODID").toString()));
                }
                if(StringUtils.isNotNull(item.get("cCode"))) {
                    icsReceiptDetail.setCCode(item.get("cCode").toString());
                }
                if(StringUtils.isNotNull(item.get("ID"))) {
                    icsReceiptDetail.setID(Integer.valueOf(item.get("ID").toString()));
                }
                if(StringUtils.isNotNull(item.get("irowno"))) {
                    icsReceiptDetail.setIrowno(Integer.valueOf(item.get("irowno").toString()));
                }
                if(StringUtils.isNotNull(item.get("cwhcode"))) {
                    icsReceiptDetail.setCWHCode(item.get("cwhcode").toString());
                }
                if(StringUtils.isNotNull(item.get("lotno"))) {
                    icsReceiptDetail.setLotno(item.get("lotno").toString());
                }
                icsReceiptDetail.setCompanyCode(icsReceiptHeader.getCompanyCode());
                icsReceiptDetail.setWarehouseCode(icsReceiptHeader.getWarehouseCode());
                icsReceiptDetails.add(icsReceiptDetail);
            }
            ICSReceiptModel icsReceiptModel = new ICSReceiptModel();
            icsReceiptModel.setIcsReceiptHeader(icsReceiptHeader);
            icsReceiptModel.setIcsReceiptDetails(icsReceiptDetails);
            icsReceiptModels.add(icsReceiptModel);
        }
        return icsReceiptModels;
    }

    @Transactional(rollbackFor = Exception.class)
    public AjaxResult confirmU8Model(List<SrmDetail> srmDetails){
        if (srmDetails.isEmpty()){
            return AjaxResult.error("请勿提交空数据!");
        }
        List<ICSPOArrive> icspoArrives = formU8Entities(srmDetails);
        if(icspoArrives.size()==0){
            throw new ServiceException("提交U8aohuoshitishibai");
        }
        SrmHeader srmHeader = this.getOne(new LambdaQueryWrapper<SrmHeader>().eq(SrmHeader::getCode, srmDetails.get(0).getCode()).eq(SrmHeader::getWarehouseCode, ShiroUtils.getWarehouseCode()));
        List<SrmDetail> srmDetailsAll = srmDetailService.list(new LambdaQueryWrapper<SrmDetail>().eq(SrmDetail::getCode, srmHeader.getCode()).eq(SrmDetail::getWarehouseCode, ShiroUtils.getWarehouseCode()));
        // 获取ERP到货单
        AjaxResult ajaxResult = icsasnService.returnICSPOArrive(icspoArrives,ShiroUtils.getWarehouseCode());
        List<ICSReceiptModel> icsReceiptModels = null;
        if (ajaxResult.hasErr()){
            // 获取到货单失败改为从数据库获取
            icsReceiptModels = this.getICSReceiptModelList(srmHeader);
        }else {
            // 解析erp到货单数据
            try {
                icsReceiptModels = this.parseResults(ajaxResult, srmHeader, srmDetails.get(0).getCompanyCode());
            } catch (Exception e) {
                this.updateErrMsg(srmHeader, e.getMessage());
                return AjaxResult.error(e.getMessage());
            }
        }
        if(icsReceiptModels==null||icsReceiptModels.size()==0){
            this.updateErrMsg(srmHeader, ajaxResult.getMsg());
            return ajaxResult;
        }
        AjaxResult result = new AjaxResult<>();
        // 修改送货单主表
        for (ICSReceiptModel icsReceiptModel :icsReceiptModels){
            try {
                // 生成WMS采购入库单
                result = icsReceiptAPIService.insertICSReceipts(icsReceiptModel);
                if (ajaxResult.hasErr()){
                    return ajaxResult;
                }
            }catch (Exception e){
                this.updateErrMsg(srmHeader, e.getMessage());
                return AjaxResult.error(e.getMessage());
            }finally {
                // 生成U8
                result = saveResult(icsReceiptModel);
            }
        }
        if(result.hasErr()){
            this.updateErrMsg(srmHeader, ajaxResult.getMsg());
            return ajaxResult;
        }
        icspoArrives.get(0).getDetails().forEach(icspoArriveDetail -> {
            srmDetails.forEach(srmDetail -> {
                if(icspoArriveDetail.getLOTNO().equals(srmDetail.getLineCode())){
                    srmDetail.setUploadStatus4(1);
                    srmDetailService.updateById(srmDetail);
                }
            });
        });
        List<SrmDetail> srmDetailsCheck = srmDetailService.list(new LambdaQueryWrapper<SrmDetail>().eq(SrmDetail::getCode, srmHeader.getCode()).eq(SrmDetail::getWarehouseCode, ShiroUtils.getWarehouseCode()).eq(SrmDetail::getCheckCode,2));
        if(CollectionUtils.isNotEmpty(srmDetailsCheck)&&srmDetailsCheck.size()==srmDetailsAll.size()){
            srmHeader.setCheckCode(2);
        }else {
            ReceiptHeader receiptHeader = new ReceiptHeader();
            receiptHeader.setUserDef3(srmHeader.getCode());
            receiptHeader.setWarehouseCode(ShiroUtils.getWarehouseCode());
            List<ReceiptHeader> receiptHeaderlist = receiptHeaderService.getByDomain(receiptHeader);
            if(receiptHeaderlist != null&&receiptHeaderlist.size()>0){
                receiptHeader=receiptHeaderlist.get(0);
//                receiptHeader.setDeleted(true);
//                receiptHeaderService.updateById(receiptHeader);
            }
            srmHeader.setCheckCode(1);
        }
        srmHeader.setUploadStatus(1);
        this.updateById(srmHeader);
        return AjaxResult.success("送货单提交成功!");
    }

    public List<ICSPOArrive> formU8Entities(List<SrmDetail> srmDetails) {
        //转换为接口实体,发送获取ERP单据
        List<ICSPOArrive> icspoArrives = new ArrayList<>();
        ICSPOArrive icspoArrive = new ICSPOArrive();
        List<ICSPOArriveDetail> icspoArriveDetails = new ArrayList<>();
        for (SrmDetail srmDetail :srmDetails){
//            String materialCode = srmDetail.getMaterialCode();
//            Material material = materialService.getMaterialByCode(materialCode, ShiroUtils.getWarehouseCode());
//            if(material==null){
//                throw new ServiceException("物料编码"+materialCode+"不存在");
//            }
//            //外观检
//            if(materialCode.startsWith("1")){
//                BigDecimal qualifiedQty = srmDetail.getConfirmQty().subtract(srmDetail.getUnqualifiedQty());
//                srmDetail.setQualifiedQty(qualifiedQty);
//            }
//            //品质检设置不质检属性了的
//            if(materialCode.startsWith("2")&&StringUtils.isNotEmpty(material.getQcFlag())&&material.getQcFlag().equals("0")){
//                srmDetail.setQualifiedQty(srmDetail.getConfirmQty());
//            }
//            if (srmDetail.getUploadStatus4() == 0 && srmDetail.getEnable() == 1 &&
//                    srmDetail.getQualifiedQty().compareTo(new BigDecimal(0)) == 1){
            if (srmDetail.getUploadStatus4() == 0 && srmDetail.getEnable() == 1){
                ICSPOArriveDetail icspoArriveDetail = new ICSPOArriveDetail();
                icspoArriveDetail.setLOTNO(srmDetail.getLineCode());
                icspoArriveDetail.setReceiveQty(srmDetail.getConfirmQty());
                icspoArriveDetail.setWHCode(srmDetail.getUWarehouseCode());
                icspoArriveDetails.add(icspoArriveDetail);
                srmDetailService.updateById(srmDetail);
            }
        }
        if(icspoArriveDetails.isEmpty()){
            return icspoArrives;
        }
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String dt = format.format(new Date());
        icspoArrive.setUser(srmDetails.get(0).getLastUpdateBy());
        User user = userService.selectUserByLoginName(srmDetails.get(0).getLastUpdateBy());
        if(user!=null){
            icspoArrive.setMUSERName(user.getUserName());
        }
        icspoArrive.setCompanyCode(srmDetails.get(0).getCompanyCode());
        icspoArrive.setMTime(dt);
        icspoArrive.setASNNO(srmDetails.get(0).getCode());
        icspoArrive.setType("ERP");
        icspoArrive.setDetails(icspoArriveDetails);
        icspoArrives.add(icspoArrive);
        return icspoArrives;
    }
    @Transactional(rollbackFor = Exception.class)
    public AjaxResult confirmSRMModel(List<SrmDetail> details){
        //单据根据单号分组,组建回传实体
        //根据code去重
        Set<String> codes = new HashSet<>();
        String warehouseCode=null;
        for (SrmDetail detail : details) {
            codes.add(detail.getCode());
        }
        warehouseCode=details.get(0).getWarehouseCode();
        Integer number = 0;
        for (String code : codes) {
            for (SrmDetail srmDetail : details) {
                if (srmDetail.getCode().equals(code)) {
                    String materialCode = srmDetail.getMaterialCode();
                    Material material = materialService.getMaterialByCode(materialCode, warehouseCode);
                    if(material==null){
                        throw new ServiceException("物料编码"+materialCode+"不存在");
                    }
                    //外观检
                    if(materialCode.startsWith("1")){
                        BigDecimal qualifiedQty = srmDetail.getConfirmQty().subtract(srmDetail.getUnqualifiedQty());
                        srmDetail.setQualifiedQty(qualifiedQty);
                        srmDetail.setCheckCode(2);
                    }
                    //品质检设置不质检属性了的
                    if(materialCode.startsWith("2")&&StringUtils.isNotEmpty(material.getQcFlag())&&material.getQcFlag().equals("0")){
                        srmDetail.setQualifiedQty(srmDetail.getConfirmQty());
                        srmDetail.setCheckCode(2);
                    }
                    srmDetailService.updateById(srmDetail);
                }
            }
            List<ICSPOArrive> icspoArrives = new ArrayList<>();
            List<ICSPOArriveDetail> icspoArriveDetails = new ArrayList<>();
            //将相同code的放一个list
            icspoArriveDetails=createIcspoArriveDetail(details,code,icspoArriveDetails);
            //创建ICSPOArrive
            ICSPOArrive icspoArrive=createIcspoArrive(details,code,icspoArriveDetails);

            icspoArrives.add(icspoArrive);
            AjaxResult ajaxResult = icsasnService.returnICSPOArrive(icspoArrives,warehouseCode);
            if (ajaxResult.hasErr()) {
                for (SrmDetail detail : details) {
                    if (detail.getCode().equals(code)) {
                        detail.setUploadStatus1(2);
                        srmDetailService.updateById(detail);
                    }
                }
                number++;
            } else {
                for (SrmDetail detail : details) {
                    if (detail.getCode().equals(code)) {
                        detail.setUploadStatus1(1);
                        srmDetailService.updateById(detail);
                    }
                }
            }
        }
        if (number == codes.size()) {
            return AjaxResult.error("失败");
        }
        return AjaxResult.success("成功");
    }

}