ShipmentContainerHeaderServiceImpl.java 12.7 KB
package com.huaheng.pc.shipment.shipmentContainerHeader.service;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.huaheng.common.exception.service.ServiceException;
import com.huaheng.common.utils.security.ShiroUtils;
import com.huaheng.framework.web.domain.AjaxResult;
import com.huaheng.pc.general.location.domain.Location;
import com.huaheng.pc.general.location.service.LocationService;
import com.huaheng.pc.general.material.domain.Material;
import com.huaheng.pc.general.material.service.MaterialService;
import com.huaheng.pc.inventory.inventoryDetail.domain.InventoryDetail;
import com.huaheng.pc.inventory.inventoryDetail.service.InventoryDetailService;
import com.huaheng.pc.shipment.shipmentContainerDetail.domain.ShipmentContainerDetail;
import com.huaheng.pc.shipment.shipmentContainerDetail.service.ShipmentContainerDetailService;
import com.huaheng.pc.shipment.shipmentContainerHeader.domain.ShipmentCombinationModel;
import com.huaheng.pc.shipment.shipmentDetail.domain.ShipmentDetail;
import com.huaheng.pc.shipment.shipmentDetail.service.ShipmentDetailService;
import com.huaheng.pc.shipment.shipmentHeader.domain.ShipmentHeader;
import com.huaheng.pc.shipment.shipmentHeader.service.ShipmentHeaderService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.util.List;
import java.util.Map;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.huaheng.pc.shipment.shipmentContainerHeader.domain.ShipmentContainerHeader;
import com.huaheng.pc.shipment.shipmentContainerHeader.mapper.ShipmentContainerHeaderMapper;
import com.huaheng.pc.shipment.shipmentContainerHeader.service.ShipmentContainerHeaderService;
import org.springframework.transaction.annotation.Transactional;

@Service
public class ShipmentContainerHeaderServiceImpl extends ServiceImpl<ShipmentContainerHeaderMapper, ShipmentContainerHeader> implements ShipmentContainerHeaderService{

    @Autowired
    private ShipmentDetailService shipmentDetailService;
    @Autowired
    private InventoryDetailService inventoryDetailService;
    @Autowired
    private LocationService locationService;
    @Autowired
    private ShipmentHeaderService shipmentHeaderService;
    @Resource
    private ShipmentContainerHeaderMapper shipmentContainerHeaderMapper;
    @Autowired
    private ShipmentContainerDetailService shipmentContainerDetailService;
    @Autowired
    private MaterialService materialService;


    @Override
    public Map<String, Integer> getShipmentContainerMaxAndMinStatusByShipmentID(int shipmentId) {
        return shipmentContainerHeaderMapper.getShipmentContainerMaxAndMinStatusByShipmentID(shipmentId);
    }



    /**
     * 出库组盘单条保存
     * @param shipmentCombinationModel
     * @return
     */
    @Transactional
    @Override
    public AjaxResult combination(ShipmentCombinationModel shipmentCombinationModel) {

        //校验
        if(shipmentCombinationModel.getShipQty().compareTo(new BigDecimal("0")) <= 0){
            return AjaxResult.error("出库数量必须大于0");
        }
        ShipmentDetail shipmentDetail = shipmentDetailService.getById(shipmentCombinationModel.getShipmentDetailId());
        if(shipmentDetail==null){
            return AjaxResult.error("出库明细未找到");
        }
        InventoryDetail inventoryDetail = inventoryDetailService.getById((shipmentCombinationModel.getInventoryDetailId()));
        if(inventoryDetail==null){
            return AjaxResult.error("库存未找到");
        }
        //校验数量是否超出
        if((shipmentDetail.getShipQty().subtract(shipmentDetail.getRequestQty())).compareTo(shipmentCombinationModel.getShipQty())<0){
            return AjaxResult.error("录入数量超出明细待出数量");
        }
        //校验库存可用数量
        if(inventoryDetail.getQty().subtract(inventoryDetail.getTaskQty()).subtract(inventoryDetail.getLockedQty()).compareTo(shipmentCombinationModel.getShipQty())<0){
            return AjaxResult.error("录入数量超出可出数量");
        }
        if(!shipmentDetail.getMaterialCode().equals(inventoryDetail.getMaterialCode())){
            return AjaxResult.error("配盘物料不一致");
        }
        //库位
        LambdaQueryWrapper<Location> lambdaQueryWrapper= Wrappers.lambdaQuery();
        lambdaQueryWrapper.eq(Location::getWarehouseCode,inventoryDetail.getWarehouseCode())
                .eq(Location::getCode,inventoryDetail.getLocationCode());
        Location location = locationService.getOne(lambdaQueryWrapper);
        if (location == null)
            return AjaxResult.error("库位 "+ inventoryDetail.getLocationCode() +" 不存在");
        if (location.getStatus().equals("lock"))    {
            //如果库位状态是锁定的话,就查找出库组盘表,如果存在未下发
            LambdaQueryWrapper<ShipmentContainerHeader> lam=Wrappers.lambdaQuery();
            lam.eq(ShipmentContainerHeader::getWarehouseCode,ShiroUtils.getWarehouseCode())
                    .eq(ShipmentContainerHeader::getContainerCode,location.getContainerCode())
                    .eq(ShipmentContainerHeader::getTaskCreated,0);
            ShipmentContainerHeader shipmentContainerHeader = this.getOne(lam);
            if (shipmentContainerHeader == null)    {
                return AjaxResult.error("库位已经锁定不能使用");
            }
        }

        //更新库存分配数
        inventoryDetail.setTaskQty(inventoryDetail.getTaskQty().add(shipmentCombinationModel.getShipQty()));
        inventoryDetailService.saveOrUpdate(inventoryDetail);
        //获取库位,然后锁定
        location.setStatus("lock");
        locationService.saveOrUpdate(location);
        //更新单据明细的已出库数量
        shipmentDetail.setRequestQty(shipmentDetail.getRequestQty().add(shipmentCombinationModel.getShipQty()));
        int i = shipmentDetail.getShipQty().compareTo(shipmentDetail.getRequestQty());
        if(i > 0){
            shipmentDetail.setStatus(200);
        }else if(i == 0){
            shipmentDetail.setStatus(300);
        }else if(i < 0){
            throw new ServiceException("出库数量不能大于单据数量!");
        }
        shipmentDetailService.saveOrUpdate(shipmentDetail);

        //自动判定出库任务状态,根据库存数量减去预定库存相等就是整盘出--预计任务状态
        BigDecimal inventoryQty = inventoryDetail.getQty().subtract(inventoryDetail.getTaskQty());
        if(inventoryQty.compareTo(new BigDecimal(0)) <= 0) {
            shipmentCombinationModel.setTaskType(300);
        } else {
            shipmentCombinationModel.setTaskType(400);
        }

        //增加出库组盘头
        ShipmentContainerHeader shipmentContainerHeader = ShipmentContainerHeaderAdd(location, shipmentDetail, shipmentCombinationModel);
        //增加出库组盘明细
        ShipmentContainerDetail shipmentContainerDetail = ShipmentContainerDetailAdd(shipmentDetail, shipmentContainerHeader, shipmentCombinationModel);
        //更新单据状态
        shipmentHeaderService.updateShipmentStatus(shipmentDetail.getShipmentId());

        return  AjaxResult.success("成功");
    }

    /**
     * 在组盘表中查找任务状态小于20的容器,如果状态为0就合并出库明细,状态大于0就提示不能组盘。如果找不到就新增一条组盘表头
     * @param location
     * @param shipmentCombination
     * @return
     */
    private ShipmentContainerHeader ShipmentContainerHeaderAdd(Location location,
                                                               ShipmentDetail shipmentDetail,
                                                               ShipmentCombinationModel shipmentCombination) {
        LambdaQueryWrapper<ShipmentContainerHeader> lambdaQueryWrapper=Wrappers.lambdaQuery();
        lambdaQueryWrapper.eq(ShipmentContainerHeader::getContainerCode,location.getContainerCode())
                .eq(ShipmentContainerHeader::getWarehouseCode,ShiroUtils.getWarehouseCode())
                .eq(ShipmentContainerHeader::getTaskCreated,1)
                .eq(ShipmentContainerHeader::getEnable,10);
        ShipmentContainerHeader shipmentContainerHeader = this.getOne(lambdaQueryWrapper);
        if(shipmentContainerHeader != null)  {
            throw new ServiceException("容器"+location.getContainerCode()+"已经生成任务,不能再添加明细;操作中止;");
        }
        else {
            LambdaQueryWrapper<ShipmentContainerHeader> lam=Wrappers.lambdaQuery();
            lam.eq(ShipmentContainerHeader::getContainerCode,location.getContainerCode())
                    .eq(ShipmentContainerHeader::getWarehouseCode,ShiroUtils.getWarehouseCode())
                    .eq(ShipmentContainerHeader::getTaskCreated,0)
                    .eq(ShipmentContainerHeader::getEnable,0);
            shipmentContainerHeader = this.getOne(lam);
            if (shipmentContainerHeader == null) {
                shipmentContainerHeader = new ShipmentContainerHeader();
                shipmentContainerHeader.setContainerCode(location.getContainerCode());
                shipmentContainerHeader.setWarehouseCode(ShiroUtils.getWarehouseCode());
                //赋值u8仓库
                shipmentContainerHeader.setCompanyCode(shipmentDetail.getCompanyCode());
                shipmentContainerHeader.setEnable(0);
                shipmentContainerHeader.setCreatedBy(ShiroUtils.getLoginName());
                shipmentContainerHeader.setCreated(null);
//            Material material=new Material();
//            material.setCode(shipmentDetail.getMaterialCode());
//            shipmentContainerHeader.setZoneCode(materialService.selectFirstEntity(material).getZoneCode());
                this.save(shipmentContainerHeader);
            }
        }
        return shipmentContainerHeader;
    }

    /**
     * 查询 容器编码、库存Id、出库明细Id 一致的组盘明细,如果存在则增加组盘数量,如果不存在就新增一条组盘明细
     * @param shipmentDetail
     * @param shipmentContainerHeader
     * @param shipmentCombinationModel
     * @return
     */
    private ShipmentContainerDetail ShipmentContainerDetailAdd(ShipmentDetail shipmentDetail,
                                                               ShipmentContainerHeader shipmentContainerHeader,
                                                               ShipmentCombinationModel shipmentCombinationModel) {
        LambdaQueryWrapper<ShipmentContainerDetail> lambdaQueryWrapper=Wrappers.lambdaQuery();
        lambdaQueryWrapper.eq(ShipmentContainerDetail::getShippingContainerId,shipmentContainerHeader.getId())
                .eq(ShipmentContainerDetail::getShipmentDetailId,shipmentCombinationModel.getShipmentDetailId())
                .eq(ShipmentContainerDetail::getWarehouseCode,ShiroUtils.getWarehouseCode());
        ShipmentContainerDetail shipmentContainerDetail = shipmentContainerDetailService.getOne(lambdaQueryWrapper);
        if(shipmentContainerDetail != null)    {
            shipmentContainerDetail.setQty(shipmentContainerDetail.getQty().add(shipmentCombinationModel.getShipQty()));
            shipmentContainerDetailService.saveOrUpdate(shipmentContainerDetail);
        }
        else    {
            //构建明细

            LambdaQueryWrapper<Material> lam=Wrappers.lambdaQuery();
            lam.eq(Material::getCode,shipmentDetail.getMaterialCode())
                    .eq(Material::getWarehouseCode,ShiroUtils.getWarehouseCode());
            Material material = materialService.getOne(lam);
            if (material == null)
                throw new ServiceException("出库单(" + shipmentDetail.getShipmentCode() + ")的物料("+ shipmentDetail.getMaterialCode() +")不存在!");
            shipmentContainerDetail = new ShipmentContainerDetail();
            shipmentContainerDetail.setShippingContainerId(shipmentContainerHeader.getId());
            shipmentContainerDetail.setShipmentCode(shipmentDetail.getShipmentCode());
            shipmentContainerDetail.setShipmentId(shipmentDetail.getShipmentId());
            shipmentContainerDetail.setShipmentDetailId(shipmentCombinationModel.getShipmentDetailId());
            shipmentContainerDetail.setMaterialCode(material.getCode());
            shipmentContainerDetail.setMaterialName(material.getName());
            shipmentContainerDetail.setQty(shipmentCombinationModel.getShipQty());
            shipmentContainerDetail.setCreated(null);
            shipmentContainerDetail.setCreatedBy(ShiroUtils.getLoginName());
            shipmentContainerDetailService.save(shipmentContainerDetail);
        }
        return shipmentContainerDetail;
    }

}