package com.huaheng.pc.receipt.receiptDetail.service;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.huaheng.common.exception.BusinessException;
import com.huaheng.common.utils.Wrappers;
import com.huaheng.common.constant.QuantityConstant;
import com.huaheng.common.exception.service.ServiceException;
import com.huaheng.common.support.Convert;
import com.huaheng.common.utils.StringUtils;
import com.huaheng.common.utils.security.ShiroUtils;
import com.huaheng.framework.web.domain.AjaxResult;
import com.huaheng.mobile.receipt.ReceiptBill;
import com.huaheng.pc.check.checkHeader.domain.CheckHeader;
import com.huaheng.pc.check.checkHeader.service.CheckHeaderService;
import com.huaheng.pc.config.company.domain.Company;
import com.huaheng.pc.config.company.service.CompanyService;
import com.huaheng.pc.config.configValue.domain.ConfigValue;
import com.huaheng.pc.config.configValue.service.ConfigValueService;
import com.huaheng.pc.config.material.domain.Material;
import com.huaheng.pc.config.material.service.MaterialService;
import com.huaheng.pc.config.materialType.domain.MaterialType;
import com.huaheng.pc.config.materialType.service.MaterialTypeService;
import com.huaheng.pc.config.receiptPreference.domain.ReceiptPreference;
import com.huaheng.pc.config.receiptPreference.service.ReceiptPreferenceService;
import com.huaheng.pc.config.receiptType.domain.ReceiptType;
import com.huaheng.pc.config.receiptType.service.ReceiptTypeService;
import com.huaheng.pc.config.statusFlow.domain.StatusFlowDetail;
import com.huaheng.pc.config.statusFlow.service.StatusFlowDetailService;
import com.huaheng.pc.receipt.receiptContainerDetail.domain.ReceiptContainerDetail;
import com.huaheng.pc.receipt.receiptHeader.domain.ReceiptHeader;
import com.huaheng.pc.receipt.receiptHeader.service.ReceiptHeaderService;
import com.huaheng.pc.system.config.domain.Config;
import com.huaheng.pc.system.dict.domain.DictData;
import com.huaheng.pc.system.dict.service.IDictDataService;
import com.huaheng.pc.task.taskDetail.domain.TaskDetail;
import io.swagger.models.auth.In;
import org.aspectj.weaver.loadtime.Aj;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.huaheng.pc.receipt.receiptDetail.domain.ReceiptDetail;
import com.huaheng.pc.receipt.receiptDetail.mapper.ReceiptDetailMapper;
import com.huaheng.pc.receipt.receiptDetail.service.ReceiptDetailService;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

@Service
public class ReceiptDetailServiceImpl extends ServiceImpl<ReceiptDetailMapper, ReceiptDetail> implements ReceiptDetailService{

    @Resource
    private MaterialService materialService;
    @Resource
    private ReceiptHeaderService receiptHeaderService;
    @Resource
    private ReceiptTypeService receiptTypeService;
    @Resource
    private StatusFlowDetailService statusFlowDetailService;
    @Resource
    private MaterialTypeService materialTypeService;
    @Resource
    private ReceiptPreferenceService receiptPreferenceService;
    @Resource
    private IDictDataService dictDataService;
    @Resource
    private CheckHeaderService checkHeaderService;
    @Resource
    private ConfigValueService configValueService;
    @Resource
    private ReceiptDetailMapper receiptDetailMapper;
    @Resource
    private CompanyService companyService;

    /**
     * 新增入库明细
     * @param receiptDetail
     * @return
     */
    @Transactional(rollbackFor = Exception.class)
    @Override
    public AjaxResult saveReceiptDetaial(ReceiptDetail receiptDetail){
        /* 判断入库头表状态*/
        LambdaQueryWrapper<ReceiptHeader> lambdaReceiptHeader = Wrappers.lambdaQuery();
        lambdaReceiptHeader.eq(ReceiptHeader::getId, receiptDetail.getReceiptId());
        ReceiptHeader receiptHeader = receiptHeaderService.getOne(lambdaReceiptHeader);

        //判断入库头表状态
        if (receiptHeader == null ){
            throw new ServiceException("找不到主单据");
        } else if (receiptHeader.getFirstStatus() > QuantityConstant.RECEIPT_HEADER_POOL){
            throw new ServiceException("单据进入订单池后,不允许新增明细");
        } else if (receiptHeader.getFirstStatus() == 20) {
            throw new ServiceException("单据已作废");
        }
        receiptDetail.setReceiptCode(receiptHeader.getCode());

        /* 判断物料编码*/
        LambdaQueryWrapper<Material> lambdaQueryWrapper = Wrappers.lambdaQuery();
        lambdaQueryWrapper.eq(Material::getCode, receiptDetail.getMaterialCode());
        lambdaQueryWrapper.eq(Material::getWarehouseCode, ShiroUtils.getWarehouseCode());
        Material material = materialService.getOne(lambdaQueryWrapper);
        if (material == null) {
            throw new ServiceException("物料不存在");
        }
        receiptDetail.setCompanyCode(receiptHeader.getCompanyCode());
        receiptDetail.setMaterialCode(material.getCode());
        receiptDetail.setMaterialName(material.getName());
        receiptDetail.setMaterialSpec(material.getSpec());
        receiptDetail.setMaterialUnit(material.getUnit());

        receiptDetail.setInventorySts(QuantityConstant.GOOD);
        receiptDetail.setCreatedBy(ShiroUtils.getLoginName());
        receiptDetail.setLastUpdatedBy(ShiroUtils.getLoginName());
        receiptDetail.setWarehouseCode(ShiroUtils.getWarehouseCode());

        //根据流程配置更新入库明细下一流程
        ReceiptDetail receiptDetail1 = queryflow(receiptDetail);

        if (this.save(receiptDetail1)) {
//            receiptHeader.setTotalQty(receiptHeader.getTotalQty().add(receiptDetail1.getTotalQty()));
//            receiptHeader.setTotalLines(receiptHeader.getTotalLines()+1);
//            receiptHeaderService.updateById(receiptHeader);
            updateReceiptHeader(receiptHeader);
            return AjaxResult.success("新增单据明细成功");
        } else {
            return AjaxResult.error("新增单据明细失败!");
        }

    }

    /**
     * 修改入库明细
     * @param receiptDetail
     * @return
     */
    @Override
    @Transactional
    public AjaxResult updateReceiptDetaial(ReceiptDetail receiptDetail) {
        /* 先修改入库头表中的总数量和总行数,再更新记录,完成后更新入库头表中总数量和总行数*/

        //查询原记录
        ReceiptDetail originalReceiptDetail= this.getById(receiptDetail.getId());
        ReceiptHeader receiptHeader = receiptHeaderService.getById(receiptDetail.getReceiptId());
        //判断物料编码是否被修改
        if (!originalReceiptDetail.getMaterialCode().equals(receiptDetail.getMaterialCode())){
            LambdaQueryWrapper<Material> lambdaMaterial = Wrappers.lambdaQuery();
            lambdaMaterial.eq(Material::getCode,receiptDetail.getMaterialCode());
            Material material = materialService.getOne(lambdaMaterial);
            if (material == null) {
                throw new ServiceException("该物料编码不存在");

            }else {
                receiptDetail.setMaterialName(material.getName());
                receiptDetail.setMaterialSpec(material.getSpec());
                receiptDetail.setMaterialUnit(material.getUnit());
//                receiptDetail.setProcessStamp("0");
//                receiptHeader.setTotalQty(receiptHeader.getTotalQty().subtract(originalReceiptDetail.getTotalQty()));
//                receiptHeader.setTotalLines(receiptHeader.getTotalLines()-1);
//                if ( !receiptHeaderService.updateById(receiptHeader)){
//                    return AjaxResult.error("入库头表更新失败");
//                }
            }
        }
        //如果单据状态为驳回则设置状态为提交审核
        if ("10".equals(receiptDetail.getProcessStamp())){
            receiptDetail.setProcessStamp("5");
        }
        receiptDetail.setLastUpdatedBy(ShiroUtils.getLoginName());
        if ( !this.updateById(receiptDetail) ){
            return AjaxResult.error("入库明细更新失败");
        } else {

            updateReceiptHeader(receiptHeader);
            return AjaxResult.success("修改单据明细成功");
        }
    }

    /**
     * 更新入库单头表状态
     * @param receiptHeader 入库单按头表
     * @return
     */
    @Override
    public AjaxResult updateReceiptHeader(ReceiptHeader receiptHeader) {
        BigDecimal totalQty = new BigDecimal(0);
        int totalLines = 0;
        LambdaQueryWrapper<ReceiptDetail> receiptDetailLambdaQueryWrapper = Wrappers.lambdaQuery();
        receiptDetailLambdaQueryWrapper.eq(ReceiptDetail::getReceiptId,receiptHeader.getId());
        List<ReceiptDetail> receiptDetailList =  list(receiptDetailLambdaQueryWrapper);
        for(ReceiptDetail receiptDetail : receiptDetailList) {
            totalLines++;
            totalQty = totalQty.add(receiptDetail.getQty());
        }
        receiptHeader.setTotalQty(totalQty);
        receiptHeader.setTotalLines(totalLines);
        if (!receiptHeaderService.updateById(receiptHeader)){
            return AjaxResult.error("入库头表更新失败");
        }
        return AjaxResult.success("入库头表更新成功");
    }

    @Override
    public List<ReceiptDetail> findByReceiptId(Integer id) {
        LambdaQueryWrapper<ReceiptDetail> queryWrapper = Wrappers.lambdaQuery();
        queryWrapper.eq(ReceiptDetail::getReceiptId, id);
        return list(queryWrapper);
    }

    /**
     * 根据流程配置更新入库明细下一流程
     * 1.先查询入库子表要没有设置入库流程
     * 2.查询入库主表的入库单据流程
     * 3.物料是否有入库流程
     * 4.物料类别是否有入库流程
     * 5.入库首选项的入库流程
     * @param receiptDetail
     * @return
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public ReceiptDetail queryflow(ReceiptDetail receiptDetail){
        //当单据状态为驳回或作废时不更新状态
        if (QuantityConstant.RECEIPT_HEADER_REJECTED.toString().equals(receiptDetail.getProcessStamp()) || QuantityConstant.RECEIPT_HEADER_OBSOLETE.toString().equals(receiptDetail.getProcessStamp())){
            return receiptDetail;
        }

        //如果入库明细绑定了入库流程则从入库明细中选择流程
        if ( StringUtils.isNotEmpty(receiptDetail.getStatusFlowCode())){
            List<StatusFlowDetail> statusFlowDetails = statusFlowDetailService.queryStatusFlowDetail(receiptDetail.getStatusFlowCode());
            String status = nextStatusFlow(statusFlowDetails, receiptDetail.getProcessStamp());
            //在状态到达时候是判断是否要质检
            if (QuantityConstant.RECEIPT_HEADER_RECEIVING.toString().equals(status) && inspection(receiptDetail)){
                receiptDetail.setProcessStamp(QuantityConstant.RECEIPT_HEADER_CHECK.toString());
            } else {
                receiptDetail.setProcessStamp(status);
            }
            return receiptDetail;
        }
        //查询头表信息
        LambdaQueryWrapper<ReceiptHeader> lambdaReceiptHeader = Wrappers.lambdaQuery();
        lambdaReceiptHeader.eq(ReceiptHeader::getCode, receiptDetail.getReceiptCode());
        lambdaReceiptHeader.last("limit 1");
        ReceiptHeader receiptHeader = receiptHeaderService.getOne(lambdaReceiptHeader);

        //查询明细表中入库物料信息
        LambdaQueryWrapper<Material> lambdaMaterial = Wrappers.lambdaQuery();
        lambdaMaterial.eq(Material::getCode, receiptDetail.getMaterialCode());
        lambdaMaterial.eq(Material::getWarehouseCode, ShiroUtils.getWarehouseCode());
        lambdaMaterial.last("limit 1");
        Material material = materialService.getOne(lambdaMaterial);

        //查询头表中绑定的入库类型中的入库流程
        LambdaQueryWrapper<ReceiptType> lambdaReceiptType = Wrappers.lambdaQuery();
        lambdaReceiptType.eq(ReceiptType::getCode,  receiptHeader.getReceiptType())
                .eq(ReceiptType::getWarehouseCode,ShiroUtils.getWarehouseCode())
                .eq(ReceiptType::getCompanyCode, receiptDetail.getCompanyCode());
        lambdaReceiptType.last("limit 1");
        ReceiptType receiptType = receiptTypeService.getOne(lambdaReceiptType);


        if (receiptType.getReceiptFlow() != null){
            //物料是否有入库流程
            List<StatusFlowDetail> statusFlowDetails = statusFlowDetailService.queryStatusFlowDetail(receiptType.getReceiptFlow());
            String status = nextStatusFlow(statusFlowDetails, receiptDetail.getProcessStamp());
            //在状态到达时候是判断是否要质检
            if (QuantityConstant.RECEIPT_HEADER_RECEIVING.toString().equals(status) && inspection(receiptDetail)){
                receiptDetail.setProcessStamp(QuantityConstant.RECEIPT_HEADER_CHECK.toString());
            } else {
                receiptDetail.setProcessStamp(status);
            }
            return receiptDetail;
        } else if (material.getReceivingFlow() != null){
            //物料是否有入库流程
            List<StatusFlowDetail> statusFlowDetails = statusFlowDetailService.queryStatusFlowDetail(material.getReceivingFlow());
            String status = nextStatusFlow(statusFlowDetails, receiptDetail.getProcessStamp());
            //在状态到达时候是判断是否要质检
            if (QuantityConstant.RECEIPT_HEADER_RECEIVING.toString().equals(status) && inspection(receiptDetail)){
                receiptDetail.setProcessStamp(QuantityConstant.RECEIPT_HEADER_CHECK.toString());
            } else {
                receiptDetail.setProcessStamp(status);
            }
            return receiptDetail;
        } else {
            //该物料类别是否有入库流程
            LambdaQueryWrapper<MaterialType> lambdaMaterialType = Wrappers.lambdaQuery();
            lambdaMaterialType.eq(MaterialType::getCode, material.getType());
            MaterialType materialType = materialTypeService.getOne(lambdaMaterialType);
            if (materialType.getReceivingFlow() != null) {
                List<StatusFlowDetail> statusFlowDetails = statusFlowDetailService.queryStatusFlowDetail(materialType.getReceivingFlow());
                String status = nextStatusFlow(statusFlowDetails, receiptDetail.getProcessStamp());
                //在状态到达时候是判断是否要质检
                if (QuantityConstant.RECEIPT_HEADER_RECEIVING.toString().equals(status) && inspection(receiptDetail)){
                    receiptDetail.setProcessStamp(QuantityConstant.RECEIPT_HEADER_CHECK.toString());
                } else {
                    receiptDetail.setProcessStamp(status);
                }
                return receiptDetail;
            } else {
                //以上都没有的情况下查询入库首选项中的入库流程
                LambdaQueryWrapper<ConfigValue> lambdaQueryWrapper = Wrappers.lambdaQuery();
                lambdaQueryWrapper.eq(ConfigValue::getModuleType, "receipt");
                ConfigValue configValue = configValueService.getOne(lambdaQueryWrapper);

                LambdaQueryWrapper<ReceiptPreference> lambda = Wrappers.lambdaQuery();
                lambda.eq(ReceiptPreference::getCode, configValue.getValue());
                ReceiptPreference receiptPreference = receiptPreferenceService.getOne(lambda);
                List<StatusFlowDetail> statusFlowDetails = statusFlowDetailService.queryStatusFlowDetail(receiptPreference.getReceivingFlow());
                String status = nextStatusFlow(statusFlowDetails, receiptDetail.getProcessStamp());
                //在状态到达时候是判断是否要质检
                if (QuantityConstant.RECEIPT_HEADER_RECEIVING.toString().equals(status) && inspection(receiptDetail)){
                    receiptDetail.setProcessStamp(QuantityConstant.RECEIPT_HEADER_CHECK.toString());
                } else {
                    receiptDetail.setProcessStamp(status);
                }
                return receiptDetail;
            }
        }
    }

    /**
     * 获取配置流程中下一状态
     * @param statusFlowDetails 流程列表
     * @param status 当前状态
     */
    public String nextStatusFlow(List<StatusFlowDetail> statusFlowDetails, String status){
        //判断当前状态是否为最后状态,若为最后状态返回当前状态
        if (StringUtils.isEmpty(status)){
            status = "0";
        }
        if (status.equals(statusFlowDetails.get(statusFlowDetails.size()-1).getFlowCode())){
            return status;
        } else {
            for (int i = 0; i < statusFlowDetails.size(); i++){
                if (Integer.parseInt(statusFlowDetails.get(i).getFlowCode()) > Integer.parseInt(status)){
                    return statusFlowDetails.get(i).getFlowCode();
                }
            }
            return status;
        }
    }

    @Override
    public List<StatusFlowDetail> queryflow(){
        LambdaQueryWrapper<ConfigValue> lambdaQueryWrapper = Wrappers.lambdaQuery();
        lambdaQueryWrapper.eq(ConfigValue::getModuleType, "receipt");
        ConfigValue configValue = configValueService.getOne(lambdaQueryWrapper);

        LambdaQueryWrapper<ReceiptPreference> lambda = Wrappers.lambdaQuery();
        lambda.eq(ReceiptPreference::getCode, configValue.getValue());
        ReceiptPreference receiptPreference = receiptPreferenceService.getOne(lambda);
        List<StatusFlowDetail> statusFlowDetails = statusFlowDetailService.queryStatusFlowDetail(receiptPreference.getReceivingFlow());
        return statusFlowDetails;
    }

    /**
     * @description 更新头表尾状态
     * 每次明细表更新后调用该方法
     * 当所有明细表到达该状态时,更新头表状态
     * @param id 头表id
     */
    @Override
    public void updateReceiptHeaderLastStatus(Integer id){
        LambdaQueryWrapper<ReceiptDetail> lambdaDetails = Wrappers.lambdaQuery();
        lambdaDetails.eq(ReceiptDetail::getReceiptId, id);
        List<ReceiptDetail> receiptDetails = this.list(lambdaDetails);
        //查询出头表信息
        ReceiptHeader receiptHeader = receiptHeaderService.getById(id);
        int minStatus;
        int maxStatus;
        // 判断入库明细是否为空, 为空时入库单头表状态为新建
        if (receiptDetails.isEmpty()){
            minStatus = 0;
            maxStatus = 0;
        } else {
            minStatus = Integer.parseInt(receiptDetails.get(0).getProcessStamp());
            maxStatus = Integer.parseInt(receiptDetails.get(0).getProcessStamp());
            //遍历明细状态得出最小状态值
            for (int i = 1; i<receiptDetails.size(); i++){
                if ( minStatus > Integer.parseInt(receiptDetails.get(i).getProcessStamp())) {
                    minStatus = Integer.parseInt(receiptDetails.get(i).getProcessStamp());
                }
                if ( maxStatus < Integer.parseInt(receiptDetails.get(i).getProcessStamp())) {
                    maxStatus = Integer.parseInt(receiptDetails.get(i).getProcessStamp());
                }
            }
        }
        //若更新状态值小于头状态,更新尾状态否则更新头尾状态
        receiptHeader.setFirstStatus(maxStatus);
        receiptHeader.setLastStatus(minStatus);
        if (!receiptHeaderService.updateById(receiptHeader)) {
            throw new ServiceException("更新状态失败");
        }
    }
    /**
     * @description 更新头表尾状态
     * 每次明细表更新后调用该方法
     * 当所有明细表到达该状态时,更新头表状态
     * @param receiptHeaderIdSet 头表id
     */
    @Override
    public void updateReceiptHeaderLastStatusV2(Set<Integer> receiptHeaderIdSet){
        for (Integer id:receiptHeaderIdSet){
            LambdaQueryWrapper<ReceiptDetail> lambdaDetails = Wrappers.lambdaQuery();
            lambdaDetails.eq(ReceiptDetail::getReceiptId, id);
            lambdaDetails.orderByDesc(ReceiptDetail::getProcessStamp);
            lambdaDetails.last("limit 1");
            List<ReceiptDetail> receiptDetails = this.list(lambdaDetails);
            //查询出头表信息
            ReceiptHeader receiptHeader = receiptHeaderService.getById(id);
            int minStatus=0;
            int maxStatus=0;
            if(receiptDetails!=null&&receiptDetails.size()>0){
                minStatus = Integer.parseInt(receiptDetails.get(0).getProcessStamp());
                maxStatus = Integer.parseInt(receiptDetails.get(0).getProcessStamp());
                //遍历明细状态得出最小状态值
                for (int i = 1; i<receiptDetails.size(); i++){
                    if ( minStatus > Integer.parseInt(receiptDetails.get(i).getProcessStamp())) {
                        minStatus = Integer.parseInt(receiptDetails.get(i).getProcessStamp());
                    }
                    if ( maxStatus < Integer.parseInt(receiptDetails.get(i).getProcessStamp())) {
                        maxStatus = Integer.parseInt(receiptDetails.get(i).getProcessStamp());
                    }
                }
            }
            //若更新状态值小于头状态,更新尾状态否则更新头尾状态
            receiptHeader.setFirstStatus(maxStatus);
            receiptHeader.setLastStatus(minStatus);
            if (!receiptHeaderService.updateById(receiptHeader)) {
                throw new ServiceException("更新状态失败");
            }
        }
    }
    /**
     * 入库单审核
     * @param ids
     * @param approval
     * @return
     */
    @Override
    public AjaxResult approval(String ids, Integer approval) {
        ReceiptHeader receiptHeader = new ReceiptHeader();
        if (StringUtils.isEmpty(ids)){
            return AjaxResult.error("id不能为空");
        }
        Integer[] idArray = Convert.toIntArray(ids);
        for (Integer id: idArray) {
            receiptHeader.setId(id);
            receiptHeader.setLastStatus(approval);
            receiptHeader.setFirstStatus(approval);
            receiptHeader.setLastUpdatedBy(ShiroUtils.getLoginName());
            if (!receiptHeaderService.updateById(receiptHeader)){
                throw new ServiceException("更新头表失败");
            } else {
                LambdaQueryWrapper<ReceiptDetail> lambda = Wrappers.lambdaQuery();
                lambda.eq(ReceiptDetail::getReceiptId, id);
                List<ReceiptDetail> receiptDetails = this.list(lambda);
                for (ReceiptDetail receiptDetail : receiptDetails){
                    receiptDetail.setProcessStamp(QuantityConstant.RECEIPT_HEADER_POOL.toString());
                    receiptDetail = this.queryflow(receiptDetail);
                    if (!this.updateById(receiptDetail)){
                        throw new ServiceException("更新入库明细表失败");
                    }
                }
            }
            this.updateReceiptHeaderLastStatus(id);
        }
        return AjaxResult.success("审核完成");
    }

    @Override
    public List<TaskDetail> getReceiptQtyLast7Days() {
        return receiptDetailMapper.getReceiptQtyLast7Days();
    }

    @Override
    public List<TaskDetail> getWarehouseReceipt() {
        return receiptDetailMapper.getWarehouseReceipt();
    }

    @Override
    public List<TaskDetail> getCompanyReceipt() {
        return receiptDetailMapper.getCompanyReceipt();
    }


    /**
     * 判断明细中是否质检
     */
    public boolean inspection(ReceiptDetail receiptDetail){
        //如果明细中需要质检,则判断是否已经生成质检单
        if ("0".equals(receiptDetail.getQcCheck())){
            LambdaQueryWrapper<CheckHeader> lambda = Wrappers.lambdaQuery();
            lambda.eq(CheckHeader::getCode, receiptDetail.getReceiptCode());
            CheckHeader checkHeader = checkHeaderService.getOne(lambda);
            if (checkHeader == null){
                return true;
            }
        }
        return false;
    }

    /**
     //     * 移动端收货
     //     *
     //     * @param code
     //     * @return
     //     */
    @Override
    public AjaxResult scanReceiptCode(String code, String type, String companyCode) {
        LambdaQueryWrapper<ReceiptHeader> lambdaQueryWrapper = Wrappers.lambdaQuery();
        lambdaQueryWrapper.eq(ReceiptHeader::getReferCode, code)
                .eq(ReceiptHeader::getReceiptType, type);
        ReceiptHeader receiptHeader = receiptHeaderService.getOne(lambdaQueryWrapper);
        if (receiptHeader == null) {
            LambdaQueryWrapper<Company> companyLambdaQueryWrapper = Wrappers.lambdaQuery();
            companyLambdaQueryWrapper.eq(Company::getCode,companyCode);
            Company company = companyService.getOne(companyLambdaQueryWrapper);
            return AjaxResult.success("");
            //    return receiptHeaderService.findErpReceipt(String.valueOf(company.getId()), receiptHeader.getReferType(), receiptHeader.getReferCode());
        } else {
            LambdaQueryWrapper<ReceiptDetail> queryWrapper = Wrappers.lambdaQuery();
            queryWrapper.eq(ReceiptDetail::getReceiptCode, receiptHeader.getCode());
            List<ReceiptDetail> receiptDetailList = list(queryWrapper);
            return AjaxResult.success(receiptDetailList);
        }

    }

    @Override
    public List<Integer> insertTodayReceiptDetail(int headerId, List<ReceiptBill> receiptBills, boolean isCompletedQty, String companyCode) {
        List<Integer> mReceiptDetailIds = new ArrayList<>();
        ReceiptHeader receiptHeader = receiptHeaderService.getById(headerId);

        for(ReceiptBill receiptBill : receiptBills) {
            ReceiptDetail receiptDetail = new ReceiptDetail();
            receiptDetail.setId(null);
            receiptDetail.setWarehouseCode(ShiroUtils.getWarehouseCode());
			receiptDetail.setCompanyCode(companyCode);
            receiptDetail.setReceiptId(receiptHeader.getId());
            receiptDetail.setReceiptCode(receiptHeader.getCode());
            receiptDetail.setMaterialCode(receiptBill.getMaterialCode());
            receiptDetail.setMaterialName(receiptBill.getMaterialName());
            receiptDetail.setInventorySts("good");
            receiptDetail.setQty(receiptBill.getQty());
            if(isCompletedQty) {
                receiptDetail.setTaskQty(receiptBill.getQty());
            }
            receiptDetail.setCreatedBy(ShiroUtils.getLoginName());
            receiptDetail.setLastUpdatedBy(ShiroUtils.getLoginName());
            receiptDetail.setDeleted(false);
            receiptDetail.setBatch(receiptBill.getBatch());
            save(receiptDetail);
            mReceiptDetailIds.add(receiptDetail.getId());
        }
        return mReceiptDetailIds;
    }

    @Override
    @Transactional(rollbackFor = Exception.class)
    public String insertExcelData(List<ReceiptDetail> list, boolean updateSupport, String operName) {
        if (StringUtils.isNull(list) || list.size() == 0) {
            throw new ServiceException("导入数据不能为空!");
        }
        //新增入库头表
        ReceiptHeader receiptHeader=createHeader(operName,list);
        int successNum = 0;
        int failureNum = 0;
        StringBuilder successMsg = new StringBuilder();
        StringBuilder failureMsg = new StringBuilder();
        for (ReceiptDetail importData : list) {
            /*if(StringUtils.isEmpty(importData.getWarehouseCode())){
                failureNum++;
                String msg = "<br/>" + failureNum + "、仓库编码为空 导入失败:";
                failureMsg.append(msg );
                continue;
            }
            if(StringUtils.isEmpty(importData.getCompanyCode())){
                failureNum++;
                String msg = "<br/>" + failureNum + "、货主编码为空 导入失败:";
                failureMsg.append(msg );
                continue;
            }*/
            if(StringUtils.isNull(importData.getQty())){
                failureNum++;
                String msg = "<br/>" + failureNum + "、数量为空 导入失败:";
                failureMsg.append(msg );
                continue;
            }
            try {
                importData.setReceiptId(receiptHeader.getId());
                importData.setReceiptCode(receiptHeader.getCode());
                Material material = materialService.getMaterialByCode(importData.getMaterialCode());
                importData.setMaterialName(material.getName());
                importData.setMaterialSpec(material.getSpec());
                importData.setMaterialUnit(material.getUnit());
                importData.setWarehouseCode(ShiroUtils.getWarehouseCode());
                importData.setCompanyCode(QuantityConstant.COMPANY_CS);
                importData.setInventorySts(QuantityConstant.GOOD);
                this.save(importData);
                successNum++;
                successMsg.append("<br/>" + successNum + "、数据 " + importData.getMaterialCode() + " 导入成功");

            } catch (Exception e) {
                failureNum++;
                String msg = "<br/>" + failureNum + "、物料编码 " + importData.getMaterialCode() + " 导入失败:";
                failureMsg.append(msg + e.getMessage());
            }
        }
        if (failureNum > 0) {
            failureMsg.insert(0, "很抱歉,导入失败!共 " + failureNum + " 条数据格式不正确,错误如下:");
            throw new ServiceException(failureMsg.toString());
        } else {
            successMsg.insert(0, "恭喜您,数据已全部导入成功!共 " + successNum + " 条,数据如下:");
        }
        return successMsg.toString();
    }

    public ReceiptHeader createHeader(String operName,List<ReceiptDetail> list){
        ReceiptHeader receiptHeader=new ReceiptHeader();
        receiptHeader.setWarehouseCode(ShiroUtils.getWarehouseCode());
        String code =receiptHeaderService.createCode(QuantityConstant.RECEIPT_TYPE_PPI,receiptHeader.getWarehouseCode());
        receiptHeader.setId(null);
        receiptHeader.setLastUpdated(null);
        receiptHeader.setLastUpdatedBy(operName);
        receiptHeader.setCreated(null);
        receiptHeader.setCreatedBy(operName);

        receiptHeader.setCompanyCode(QuantityConstant.COMPANY_CS);
        receiptHeader.setCode(code);
        receiptHeader.setReceiptType(QuantityConstant.RECEIPT_TYPE_PPI);
        receiptHeader.setTotalLines(list.size());
        receiptHeader.setFirstStatus(QuantityConstant.RECEIPT_HEADER_BUILD);
        receiptHeader.setLastStatus(QuantityConstant.RECEIPT_HEADER_BUILD);
        BigDecimal bigDecimal = list.stream().map(ReceiptDetail::getQty).reduce(BigDecimal::add).orElse(BigDecimal.ZERO);
        receiptHeader.setTotalQty(bigDecimal);
        if (!receiptHeaderService.save(receiptHeader)) {
            throw new ServiceException("导入失败,添加入库单头表失败");
        }
        return receiptHeader;
    }

    @Override
    public String getWorkNo(Integer id) {
        LambdaQueryWrapper<ReceiptDetail> detailLambda = Wrappers.lambdaQuery();
        detailLambda.eq(ReceiptDetail::getId, id);
        detailLambda.last("limit 1");
        ReceiptDetail receiptDetail= this.getOne(detailLambda);
        if(receiptDetail!=null){
            return receiptDetail.getMoCode();
        }
        return null;
    }

    @Override
    public List<ReceiptDetail> getByHeaderCode(String code){
        LambdaQueryWrapper<ReceiptDetail> detailLambda = Wrappers.lambdaQuery();
        detailLambda.eq(ReceiptDetail::getReceiptCode,code);
        List<ReceiptDetail> list=this.list(detailLambda);
        return list;
    }
    @Override
    public List<ReceiptDetail> selectListEntityByLike(ReceiptDetail receiptDetail){
        LambdaQueryWrapper<ReceiptDetail> detailLambda = Wrappers.lambdaQuery();
        detailLambda.eq(StringUtils.isNotEmpty(receiptDetail.getReceiptCode()),ReceiptDetail::getReceiptCode,receiptDetail.getReceiptCode());
        detailLambda.eq(StringUtils.isNotNull(receiptDetail.getReceiptId()),ReceiptDetail::getReceiptId,receiptDetail.getReceiptId());
        detailLambda.eq(ReceiptDetail::getDeleted,false);

        List<ReceiptDetail> list=this.list(detailLambda);
        return list;
    }
    @Override
    public ReceiptDetail selectFirstEntity(ReceiptDetail receiptDetail){
        LambdaQueryWrapper<ReceiptDetail> detailLambda = Wrappers.lambdaQuery();
        detailLambda.eq(StringUtils.isNotNull(receiptDetail.getId()),ReceiptDetail::getReceiptCode,receiptDetail.getReceiptCode());
        detailLambda.eq(ReceiptDetail::getDeleted,false);
        detailLambda.last("limit 1");
        return this.getOne(detailLambda);
    }
    @Override
    public List<Map<String, Object>> selectList(String code, String goodsShelfNo) {
        String warehouseCode=ShiroUtils.getWarehouseCode();
        String shelfNo=goodsShelfNo.substring(1,5);
        return receiptDetailMapper.selectLists(code,shelfNo,warehouseCode);
    }
}