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

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.huaheng.common.constant.QuantityConstant;
import com.huaheng.common.exception.service.ServiceException;
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.config.container.domain.Container;
import com.huaheng.pc.config.container.service.ContainerService;
import com.huaheng.pc.config.location.domain.Location;
import com.huaheng.pc.config.location.service.LocationService;
import com.huaheng.pc.config.material.domain.Material;
import com.huaheng.pc.config.material.service.MaterialService;
import com.huaheng.pc.inventory.inventoryDetail.domain.InventoryDetail;
import com.huaheng.pc.inventory.inventoryDetail.service.InventoryDetailService;
import com.huaheng.pc.receipt.receiptContainerDetail.domain.ReceiptContainerDetail;
import com.huaheng.pc.receipt.receiptContainerDetail.service.ReceiptContainerDetailService;
import com.huaheng.pc.receipt.receiptContainerHeader.domain.ReceiptContainerHeader;
import com.huaheng.pc.receipt.receiptContainerHeader.domain.ReceiptContainerView;
import com.huaheng.pc.receipt.receiptContainerHeader.mapper.ReceiptContainerHeaderMapper;
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.task.taskHeader.domain.TaskHeader;
import com.huaheng.pc.task.taskHeader.service.TaskHeaderService;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.math.BigDecimal;
import java.text.MessageFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
@Service
public class ReceiptContainerHeaderServiceImpl extends ServiceImpl<ReceiptContainerHeaderMapper, ReceiptContainerHeader> implements ReceiptContainerHeaderService{

    @Resource
    private TaskHeaderService taskHeaderService;
    @Resource
    private LocationService locationService;
    @Resource
    private ReceiptDetailService receiptDetailService;
    @Resource
    private ReceiptContainerDetailService receiptContainerDetailService;
    @Resource
    private MaterialService materialService;
    @Resource
    private ContainerService containerService;
    @Resource
    private ReceiptHeaderService receiptHeaderService;
    @Resource
    private InventoryDetailService inventoryDetailService;

    /**
     * 保存入库组盘
     * @param receiptCode 入库单编码
     * @param containerCode 容器编码
     * @param receiptDetailId 入库单详情id
     * @param locationCode 库位编码
     * @param qty 收货数量
     * @param locatingRule 定位规则
     * @return 是否保存成功
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public AjaxResult saveCountain(String receiptCode, String containerCode, Integer receiptDetailId,
                 String locationCode, BigDecimal qty, String locatingRule) {
        ReceiptDetail detail = receiptDetailService.getById(receiptDetailId);
        //检查容器编码合法性
        Integer taskType = checkContainer(containerCode, detail.getMaterialCode());
        if (taskType == 1){
            //创建临时容器
            containerCode = createContainer();
            taskType = QuantityConstant.TASK_TYPE_WHOLERECEIPT;
        } else if (taskType == 2){
            throw new ServiceException("该物料不能放在这个容器上,请检查该物料是否可以混放");
        } else {
            if (taskType == 0){ throw new ServiceException("容器状态未知"); }
        }
        if (QuantityConstant.TASK_TYPE_SUPPLEMENTRECEIPT.equals(taskType)) {
            Container container = containerService.findAllByCode(containerCode);
            if (StringUtils.isNotNull(container) && StringUtils.isNotEmpty(container.getLocationCode())) {
                locationCode = container.getLocationCode();
            }
        }
        //检查库位编码合法性
        checkLocationCode(locationCode, containerCode, taskType);

        /* 新建保存组盘头表记录*/
        //根据容器编码查询组盘表头记录
        LambdaQueryWrapper<ReceiptContainerHeader> lambda = Wrappers.lambdaQuery();
        lambda.eq(ReceiptContainerHeader::getContainerCode, containerCode)
            .eq(ReceiptContainerHeader::getStatus, QuantityConstant.RECEIPT_CONTAINER_BUILD);
        List<ReceiptContainerHeader> list = this.list(lambda);

        ReceiptContainerHeader receiptContainerHeader = new ReceiptContainerHeader();
        //如果不存在记录则新建记录
        if (list.size() < 1){
            ReceiptDetail receiptDetail = receiptDetailService.getById(receiptDetailId);

            receiptContainerHeader.setWarehouseCode(ShiroUtils.getWarehouseCode());
            receiptContainerHeader.setCompanyCode(receiptDetail.getCompanyCode());
            receiptContainerHeader.setContainerCode(containerCode);
            Container container = containerService.findAllByCode(containerCode);
            receiptContainerHeader.setContainerType(container.getContainerType());
            receiptContainerHeader.setTaskType(String.valueOf(taskType));
            if (taskType.equals(QuantityConstant.TASK_TYPE_SUPPLEMENTRECEIPT)) {
                receiptContainerHeader.setFromLocation(container.getLocationCode());
                receiptContainerHeader.setToLocation(container.getLocationCode());
            } else {
                receiptContainerHeader.setToLocation(locationCode);
            }
            receiptContainerHeader.setProjectNo(receiptDetail.getProjectNo());
            receiptContainerHeader.setToLocation(locationCode);
            receiptContainerHeader.setCreatedBy(ShiroUtils.getLoginName());
            receiptContainerHeader.setLastUpdatedBy(ShiroUtils.getLoginName());
            receiptContainerHeader.setLocatingRule(locatingRule);
            if (!this.save(receiptContainerHeader)){
                throw new ServiceException("入库组盘头表保存失败");
            }
        } else {
            receiptContainerHeader = list.get(0);
            if (receiptContainerHeader.getStatus() >= QuantityConstant.RECEIPT_CONTAINER_TASK && receiptContainerHeader.getStatus() < QuantityConstant.RECEIPT_CONTAINER_FINISHED){
                throw new ServiceException("容器已经生成任务,不能放物料了!");
            }
        }
        List<ReceiptContainerHeader> receiptContainerHeaders = this.list(lambda);
        /* 更新入库单详情的收货数量*/
        //根据入库单详情id查询入库详情
        ReceiptDetail receiptDetail = receiptDetailService.getById(receiptDetailId);
        receiptDetail.setId(receiptDetailId);
        receiptDetail.setOpenQty(qty.add(receiptDetail.getOpenQty()));
        //更新入库单详情的收货数量
        if (!receiptDetailService.updateById(receiptDetail)){
            throw new ServiceException("更新入库单详情失败");
        }

        receiptDetail = receiptDetailService.getById(receiptDetailId);

        receiptContainerDetailAdd(receiptContainerHeaders.get(0).getId(), receiptDetail, qty, containerCode, locationCode);
        //如果单据数量等于已收数量,更新入库详情状态和入库单状态
        if (receiptDetail.getTotalQty().compareTo(receiptDetail.getOpenQty()) == 0){
            if (StringUtils.isNotEmpty(locationCode)){
                receiptDetail.setProcessStamp(QuantityConstant.RECEIPT_HEADER_POSITION.toString());
            } else {
                receiptDetail.setProcessStamp(QuantityConstant.RECEIPT_HEADER_RECEIVING.toString());
            }
            if (!receiptDetailService.updateById(receiptDetail)){
                throw new ServiceException("更新入库详情处理标记失败");
            }

            ReceiptDetail receiptDetail1 = receiptDetailService.queryflow(receiptDetail);
            if (!receiptDetailService.updateById(receiptDetail1)){
                throw new ServiceException("更新入库详情下一流程失败");
            }
        }
        receiptDetailService.updateReceiptHeaderLastStatus(receiptDetail.getReceiptId());
        return AjaxResult.success("success");
    }

    /**
     * 批量撤销入库组盘
     * @param ids 容器头表标识列表
     * @return true 全部取消成功
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public Boolean cancelByIds(List<Integer> ids) {
        for (Integer id : ids) {
            //如果已生成任务则不允许取消组盘
            if (this.getById(id).getStatus() < QuantityConstant.RECEIPT_CONTAINER_TASK){
                //根据组盘头表id查询组盘明细表
                LambdaQueryWrapper<ReceiptContainerDetail> containerDetailLambda = Wrappers.lambdaQuery();
                containerDetailLambda.eq(ReceiptContainerDetail::getReceiptContainerId, id);
                List<ReceiptContainerDetail> receiptContainerDetails = receiptContainerDetailService.list(containerDetailLambda);

                //查询入库单明细,减去已收数量,更新单据
                for (ReceiptContainerDetail receiptContainerDetail: receiptContainerDetails){
                    ReceiptDetail receiptDetail = receiptDetailService.getById(receiptContainerDetail.getReceiptDetailId());
                    receiptDetail.setOpenQty(receiptDetail.getOpenQty().subtract(receiptContainerDetail.getQty()));
                    if (!receiptDetailService.updateById(receiptDetail)){throw new ServiceException("回滚入库明细失败"); }

                    containerDetailLambda = Wrappers.lambdaQuery();
                    containerDetailLambda.eq(ReceiptContainerDetail::getReceiptId, receiptContainerDetail.getReceiptId());
                    List<ReceiptContainerDetail> containerDetailList = receiptContainerDetailService.list(containerDetailLambda);

                    //如果是临时容器,取消组盘时删除容器表
                    containerService.removeContainer(receiptContainerDetail.getContainerType(), receiptContainerDetail.getContainerCode());

                    //如果入库组盘没有该入库单的组盘信息,回滚入库单状态
                    if (containerDetailList == null){
                        ReceiptHeader receiptHeader = new ReceiptHeader();
                        receiptHeader.setId(receiptContainerDetail.getReceiptId());
                        receiptHeader.setFirstStatus(QuantityConstant.RECEIPT_HEADER_RECEIVING);
                        receiptHeader.setLastStatus(QuantityConstant.RECEIPT_HEADER_RECEIVING);
                        receiptHeader.setLastUpdatedBy(ShiroUtils.getLoginName());

                        if (!receiptHeaderService.updateById(receiptHeader)){ throw new ServiceException("回滚头表状态失败"); }
                    }

                    if (!receiptContainerDetailService.removeById(receiptContainerDetail.getId())){
                        throw new ServiceException("删除入库组盘明细表失败,id是"+receiptContainerDetail.getId());
                    }
                }
                //删除入库组盘头表
                if (!this.removeById(id)){
                    throw new ServiceException("删除入库组盘头表失败");
                }
            } else {
                throw new ServiceException("已生成任务不允许取消");
            }
        }
        return true;
    }

    /**
     * 检查容器状态
     *
     * @param record 容器实列
     * @return 成功 ;可以使用容器
     */
    @Override
    public AjaxResult checkContainer(ReceiptContainerView record) {
        //容器都是单据SN码,每个入库单都是新增容器

        if (com.huaheng.common.utils.StringUtils.isEmpty(record.getReceiptContainerCode())) {
            throw new ServiceException("容器不能为空");
        }

        if (taskHeaderService.UncompleteCount(record.getReceiptContainerCode()).intValue() > 0) {
            throw new ServiceException("容器已经存在任务,请更换容器");
        }
        return AjaxResult.success("");
    }


    @Override
    public AjaxResult batchSave(List<ReceiptContainerView> list) {
        if (list.size() < 1) {
            throw new ServiceException("收货明细是空!");
        }
        checkContainer(list.get(0));
//        if (checkLocationCode(list.get(0).getLocationCode(), list.get(0).getLocationCode(), Integer.valueOf(list.get(0).getTaskType())) == true) {
//            locationService.updateStatus(list.get(0).getLocationCode(), "lock");
//        }
        AjaxResult ajaxResult = null;
        for (ReceiptContainerView receiptContainerView : list) {
           ajaxResult = saveCountain(receiptContainerView.getReceiptCode(), receiptContainerView.getReceiptContainerCode(),
                    receiptContainerView.getReceiptDetailId(), receiptContainerView.getLocationCode(), receiptContainerView.getQty(), null);
        }
        return ajaxResult;
    }

    /**
     * 移动端校验库位
     * @param record
     * @return
     */
    @Override
    public Boolean mobileCheckLocationCode(ReceiptContainerView record) {
        return checkLocationCode(record.getLocationCode(), record.getReceiptContainerCode(), Integer.valueOf(record.getTaskType()));
    }

    /**
     * 检查容器编码合法性
     * @param containerCode 容器编码
     * @param materialCode 物料编码
     * @return 返回容器状态,如果需自动生成容器编码返回1
     */
    @Transactional
    public Integer checkContainer(String containerCode, String materialCode) {
        Material material = materialService.findAllByCode(materialCode);
        if (StringUtils.isEmpty(containerCode)){
            if (material.getAutoGenSerialNum() == 0){
               return 1;
               //需自动生成容器编码
            } else {
                throw new ServiceException("容器不能为空");
            }
        }
        /**
         * 判断物料是否可以放在当前容器
         */
        if (!material.getIsMix()) {
            LambdaQueryWrapper<InventoryDetail> queryWrapper = Wrappers.lambdaQuery();
            queryWrapper.eq(InventoryDetail::getContainerCode, containerCode);
            /* 该容器已存物料数*/
            int inventoryDetailCount = inventoryDetailService.count(queryWrapper);
            LambdaQueryWrapper<InventoryDetail> lambdaQueryWrapper = Wrappers.lambdaQuery();
            lambdaQueryWrapper.eq(InventoryDetail::getContainerCode, containerCode)
                    .eq(InventoryDetail::getMaterialCode, materialCode);
            /* 该容器存放该物料的记录数*/
            int inventoryDetailMaterialCount = inventoryDetailService.count(lambdaQueryWrapper);
            /* 存放多种物料时返回*/
            if (inventoryDetailCount != inventoryDetailMaterialCount) {
                return 2;
            }
        }
        LambdaQueryWrapper<Container> lambda = Wrappers.lambdaQuery();
        lambda.eq(Container::getCode, containerCode);
        Container container = containerService.getOne(lambda);
        if (container == null){
            throw new ServiceException("该容器编号不存在");
        }

        //检查该容器编码是否已存任务
        LambdaQueryWrapper<TaskHeader> lambdaQueryWrapper = Wrappers.lambdaQuery();
        lambdaQueryWrapper.eq(TaskHeader::getContainerCode, containerCode)
                .lt(TaskHeader::getStatus, QuantityConstant.TASK_STATUS_COMPLETED)
                .eq(TaskHeader::getWarehouseCode, ShiroUtils.getWarehouseCode());
        if (taskHeaderService.count(lambdaQueryWrapper) > 0){
            throw new ServiceException("容器已经存在任务,请更换容器");
        }
        if (StringUtils.isEmpty(container.getLocationCode())){
            return QuantityConstant.TASK_TYPE_WHOLERECEIPT;
        }else if (StringUtils.isNotEmpty(container.getStatus()) &&(container.getStatus().equals("empty")||container.getStatus().equals("some"))) {
            return QuantityConstant.TASK_TYPE_SUPPLEMENTRECEIPT;
        } else if ("full".equals(container.getStatus())) {
            throw new ServiceException("该容器已满,请更换容器");
        }
        return 0;
    }

    /**
     * 检查库位是否合法
     * @param locationCode 库位编码
     * @param containerCode 容器编码
     * @param taskType 任务类型
     * @return
     */
    @Transactional
    Boolean checkLocationCode(String locationCode, String containerCode, Integer taskType) {
        //如果选了库位,就要校验库位和已经组盘的库位是否一致,避免重入库
        if (StringUtils.isEmpty(locationCode)) {
            if  (QuantityConstant.TASK_TYPE_SUPPLEMENTRECEIPT.equals(taskType)) {
                throw new ServiceException("补充入库,必须填写库位");
            } else {
                return true;
            }
        }

        //查询组盘头表
        LambdaQueryWrapper<ReceiptContainerHeader> lambda = Wrappers.lambdaQuery();
        lambda.eq(ReceiptContainerHeader::getContainerCode, containerCode)
                .eq(ReceiptContainerHeader::getTaskType, taskType)
                .eq(ReceiptContainerHeader::getStatus, 0)
                .last("Limit 1");
        ReceiptContainerHeader receiptContainerHeader = this.getOne(lambda);

        if (receiptContainerHeader != null) {
            if (receiptContainerHeader.getToLocation().equals(locationCode)) {
                return true;
            } else {
                throw new ServiceException("已存在组盘,组盘头id是"+receiptContainerHeader.getId()+"容器(" + containerCode + ")对应的库位是:" + receiptContainerHeader.getToLocation());
            }
        }

        LambdaQueryWrapper<Location> lambdaLocation = Wrappers.lambdaQuery();
        lambdaLocation.eq(Location::getWarehouseCode, ShiroUtils.getWarehouseCode())
                .eq(Location::getDeleted, false)
                .eq(Location::getCode, locationCode);
        Location location = locationService.getOne(lambdaLocation);
        if (location == null) {
            throw new ServiceException("库位不存在!");
        }
        if (!"empty".equals(location.getStatus()) ) {
            throw new ServiceException("库位不是空闲状态!");
        }
        if (QuantityConstant.TASK_TYPE_WHOLERECEIPT.equals(taskType)) {
            if (com.huaheng.common.utils.StringUtils.isNotEmpty(location.getContainerCode())) {
                throw new ServiceException("库位(" + containerCode + ")有容器(" + location.getContainerCode() + "),不能整盘入库!");
            }
        }
        if(QuantityConstant.TASK_TYPE_SUPPLEMENTRECEIPT.equals(taskType))  {
            if (com.huaheng.common.utils.StringUtils.isEmpty(location.getContainerCode())){
                throw new ServiceException("库位(" + locationCode + ")没有容器,不能补充入库!");
            } else if (!location.getContainerCode().equals(containerCode)) {
                throw new ServiceException("库位(" + containerCode + ")对应的容器是:" + location.getContainerCode()+ ",请重选库位!");
            }
        }
        return true;
    }

    /**
     * 增加组盘明细记录
     * @param receiptContainerHeaderId 入库组盘头表id
     * @param receiptDetail 入库详情
     * @param qty 收货数量
     * @param containerCode 容器编码
     */
    @Transactional
    public void receiptContainerDetailAdd(Integer receiptContainerHeaderId, ReceiptDetail receiptDetail, BigDecimal qty, String containerCode, String locationCode){
        LambdaQueryWrapper<ReceiptContainerDetail> lambda = Wrappers.lambdaQuery();
        lambda.eq(ReceiptContainerDetail::getReceiptContainerId, receiptContainerHeaderId)
                .eq(ReceiptContainerDetail::getReceiptId, receiptDetail.getReceiptId())
                .eq(ReceiptContainerDetail::getReceiptDetailId, receiptDetail.getId())
                .last("Limit 1");
        ReceiptContainerDetail receiptContainerDetail = receiptContainerDetailService.getOne(lambda);

        if (receiptContainerDetail == null){
            //查询入库头表
            LambdaQueryWrapper<ReceiptHeader> receiptHeaderLambda = Wrappers.lambdaQuery();
            receiptHeaderLambda.eq(ReceiptHeader::getId, receiptDetail.getReceiptId())
                    .eq(ReceiptHeader::getCode, receiptDetail.getReceiptCode());
            ReceiptHeader receiptHeader = receiptHeaderService.getOne(receiptHeaderLambda);

            //查询容器
            LambdaQueryWrapper<Container> containerLambda = Wrappers.lambdaQuery();
            containerLambda.eq(Container::getCode, containerCode);
            Container container = containerService.getOne(containerLambda);

            receiptContainerDetail = new ReceiptContainerDetail();
            receiptContainerDetail.setReceiptContainerId(receiptContainerHeaderId);
            receiptContainerDetail.setWarehouseCode(ShiroUtils.getWarehouseCode());
            receiptContainerDetail.setReceiptId(receiptDetail.getReceiptId());
            receiptContainerDetail.setReceiptDetailId(receiptDetail.getId());
            receiptContainerDetail.setReceiptCode(receiptDetail.getReceiptCode());
            receiptContainerDetail.setReceiptType(receiptHeader.getReceiptType());
            receiptContainerDetail.setLocationCode(locationCode);
            receiptContainerDetail.setContainerCode(container.getCode());
            receiptContainerDetail.setContainerType(container.getContainerType());
            receiptContainerDetail.setCompanyCode(receiptDetail.getCompanyCode());
            receiptContainerDetail.setMaterialCode(receiptDetail.getMaterialCode());
            receiptContainerDetail.setMaterialName(receiptDetail.getMaterialName());
            receiptContainerDetail.setMaterialSpec(receiptDetail.getMaterialSpec());
            receiptContainerDetail.setMaterialUnit(receiptDetail.getMaterialUnit());
            receiptContainerDetail.setQty(qty);
            receiptContainerDetail.setSupplierCode(receiptDetail.getSupplierCode());
            receiptContainerDetail.setBatch(receiptDetail.getBatch());
            receiptContainerDetail.setLot(receiptDetail.getLot());
            receiptContainerDetail.setProjectNo(receiptDetail.getProjectNo());
            receiptContainerDetail.setManufactureDate(receiptDetail.getManufactureDate());
            receiptContainerDetail.setExpirationDate(receiptDetail.getExpirationDate());
            receiptContainerDetail.setAgingDate(receiptDetail.getAgingDate());
            receiptContainerDetail.setInventorySts(receiptDetail.getInventorySts());
            receiptContainerDetail.setCreatedBy(ShiroUtils.getLoginName());
            receiptContainerDetail.setLastUpdatedBy(ShiroUtils.getLoginName());
            if (!receiptContainerDetailService.save(receiptContainerDetail)){
                throw new ServiceException("保存入库组盘详情失败");
            }
        } else {
            receiptContainerDetail.setQty(receiptContainerDetail.getQty().add(qty));
            if (!receiptContainerDetailService.updateById(receiptContainerDetail)){
                throw new ServiceException("更新入库组盘详情失败");
            }
        }

    }


    /**
     * 自动生成容器编码
     * @return 容器编码
     */
    @Transactional
    public String createContainer(){
        String code = MessageFormat.format("{0}{1}",
                "LS",
                String.format("%d", Calendar.getInstance().getTimeInMillis()));
        Container container = new Container();
        container.setCode(code);
        container.setWarehouseCode(ShiroUtils.getWarehouseCode());
        container.setCompanyCode(ShiroUtils.getCompanyCodeList().get(0));
        container.setContainerType("LS");
        container.setCreatedBy(ShiroUtils.getLoginName());
        container.setLastUpdated(new Date());
        container.setLastUpdatedBy(ShiroUtils.getLoginName());
        container.setEnable(true);
        container.setStatus("empty");
        if (!containerService.save(container)){
            throw new ServiceException("新增容器失败");
        }
        return code;
    }

    @Override
    @Transactional
    public int insertTodayReceiptContainerHeader(ReceiptBill receiptBill, String receiptCode) {
        String receiptContainerCode = receiptBill.getReceiptContainerCode();
        String locationCode = receiptBill.getLocationCode();
        String companyCode = receiptBill.getCompanyCode();
        ReceiptContainerHeader recorder = new ReceiptContainerHeader();
        recorder.setContainerCode(receiptContainerCode);
        recorder.setWarehouseCode(ShiroUtils.getWarehouseCode());
        recorder.setCompanyCode(companyCode);
        recorder.setTaskType(String.valueOf(QuantityConstant.TASK_TYPE_WHOLERECEIPT));
        recorder.setStatus(QuantityConstant.RECEIPT_CONTAINER_BUILD);
        recorder.setCreatedBy(ShiroUtils.getLoginName());
        recorder.setLastUpdatedBy(ShiroUtils.getLoginName());

        LambdaQueryWrapper<ReceiptContainerHeader> receiptContainerHeaderLambada = Wrappers.lambdaQuery();
        receiptContainerHeaderLambada.eq(ReceiptContainerHeader::getContainerCode, receiptContainerCode)
                .eq(ReceiptContainerHeader::getCompanyCode, companyCode)
                .eq(ReceiptContainerHeader::getTaskType, String.valueOf(QuantityConstant.TASK_TYPE_WHOLERECEIPT))
                .eq(ReceiptContainerHeader::getStatus, 0);

        ReceiptContainerHeader receiptContainerHeader = getOne(receiptContainerHeaderLambada);
        if(receiptContainerHeader == null) {
            save(recorder);
        } else {
            return receiptContainerHeader.getId();
        }

        locationService.updateStatus(locationCode, "lock");
        containerService.updateLocationCodeAndStatus(receiptContainerCode, locationCode, "some");
        return recorder.getId();
    }

    /**
     * 取消入库任务
     * @param id 入库组盘头id
     * @return
     */
    @Override
    public AjaxResult cancelReceipt(Integer id) {
        /**
         * 回滚组盘主表状态
         */
        ReceiptContainerHeader receiptContainerHeader = new ReceiptContainerHeader();
        receiptContainerHeader.setStatus(QuantityConstant.RECEIPT_CONTAINER_BUILD);
        receiptContainerHeader.setId(id);
        if (!updateById(receiptContainerHeader)){
            throw new ServiceException("回滚入库组盘头表失败");
        }

        /**
         * 回滚组盘明细状态
         */
        LambdaQueryWrapper<ReceiptContainerDetail> lambdaQueryWrapper = Wrappers.lambdaQuery();
        lambdaQueryWrapper.eq(ReceiptContainerDetail::getReceiptContainerId, id);
        List<ReceiptContainerDetail> containerDetailList = receiptContainerDetailService.list(lambdaQueryWrapper);
        for (ReceiptContainerDetail containerDetail : containerDetailList) {
            containerDetail.setStatus(QuantityConstant.RECEIPT_CONTAINER_BUILD.intValue());
        }
        if (!receiptContainerDetailService.updateBatchById(containerDetailList)) {
            throw new ServiceException("回滚入库组盘明细失败");
        }

        /**
         * 回滚入库单头表、入库单明细状态
         */
        for (ReceiptContainerDetail containerDetail : containerDetailList) {
            ReceiptHeader receiptHeader = receiptHeaderService.getById(containerDetail.getReceiptId());
            receiptHeader.setLastStatus(QuantityConstant.RECEIPT_HEADER_WAIT);
            ReceiptDetail receiptDetail = receiptDetailService.getById(containerDetail.getReceiptDetailId());
            receiptDetail.setProcessStamp(String.valueOf(QuantityConstant.RECEIPT_HEADER_WAIT));
            if (!receiptHeaderService.updateById(receiptHeader)) {
                throw new ServiceException("回滚入库单头表失败");
            }
            if (!receiptDetailService.updateById(receiptDetail)) {
                throw new ServiceException("回滚入库单明细失败");
            }
        }
        return AjaxResult.success("成功");
    }
}