ShipmentContainerAdviceService.java 14 KB
package com.huaheng.pc.shipment.shipmentContainerAdvice.service;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.huaheng.common.constant.QuantityConstant;
import com.huaheng.common.exception.service.ServiceException;
import com.huaheng.framework.web.domain.AjaxResult;
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.inventory.inventoryHeader.domain.InventoryHeader;
import com.huaheng.pc.inventory.inventoryHeader.service.InventoryHeaderService;
import com.huaheng.pc.shipment.shipmentContainerAdvice.domain.ShipmentContainerAdvice;
import com.huaheng.pc.shipment.shipmentContainerAdvice.mapper.ShipmentContainerAdviceMapper;
import com.huaheng.pc.shipment.shipmentContainerHeader.domain.ShipmentCombinationModel;
import com.huaheng.pc.shipment.shipmentContainerHeader.domain.ShipmentContainerHeader;
import com.huaheng.pc.shipment.shipmentContainerHeader.service.ShipmentContainerHeaderService;
import com.huaheng.pc.shipment.shipmentDetail.domain.ShipmentDetail;
import com.huaheng.pc.shipment.shipmentDetail.service.ShipmentDetailService;
import com.huaheng.pc.task.taskHeader.domain.TaskHeader;
import com.huaheng.pc.task.taskHeader.service.TaskHeaderService;
import org.springframework.stereotype.Service;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;


@Service
public class ShipmentContainerAdviceService extends ServiceImpl<ShipmentContainerAdviceMapper, ShipmentContainerAdvice> {

    @Resource
    private ShipmentContainerHeaderService shipmentContainerHeaderService;
    @Resource
    private LocationService locationService;
    @Resource
    private ContainerService containerService;
    @Resource
    private TaskHeaderService taskHeaderService;
    @Resource
    private InventoryHeaderService inventoryHeaderService;
    @Resource
    private InventoryDetailService inventoryDetailService;
    @Resource
    private ShipmentDetailService shipmentDetailService;
    @Resource
    private MaterialService materialService;

    public boolean updateTaskQtyById(BigDecimal qty, int id) {
        ShipmentContainerAdvice shipmentContainerAdvice = new ShipmentContainerAdvice();
        shipmentContainerAdvice.setTaskQty(qty);
        shipmentContainerAdvice.setId(id);
        boolean success = updateById(shipmentContainerAdvice);
        return success;
    }


    public List<ShipmentContainerAdvice> getShipmentContainerAdviceListByShipmentCode(String shipmentCode, String warehouseCode) {
        LambdaQueryWrapper<ShipmentContainerAdvice> shipmentContainerAdviceLambdaQueryWrapper = Wrappers.lambdaQuery();
        shipmentContainerAdviceLambdaQueryWrapper.eq(ShipmentContainerAdvice::getShipmentCode, shipmentCode)
                .eq(ShipmentContainerAdvice::getWarehouseCode, warehouseCode).lt(ShipmentContainerAdvice::getStatus, QuantityConstant.SHIPMENT_CONTAINER_FINISHED);
        List<ShipmentContainerAdvice> shipmentContainerAdviceList = list(shipmentContainerAdviceLambdaQueryWrapper);
        return shipmentContainerAdviceList;
    }

    @Transactional(rollbackFor = Exception.class)
    public AjaxResult createCallShipmentTask(ShipmentContainerHeader shipmentContainerHeader, String warehouseCode, long shipmentOrder, int sequence,
                                             int sequenceNumber) {
        Integer preTaskNo = 0;
        if (shipmentContainerHeader == null) {
            return AjaxResult.error("生成出库任务时, 出库组盘头" + "未找到,操作中止");
        }
        shipmentContainerHeader = shipmentContainerHeaderService.getById(shipmentContainerHeader.getId());
        if (shipmentContainerHeader.getStatus() >= QuantityConstant.SHIPMENT_CONTAINER_TASK) {
            return AjaxResult.error("生成出库任务时, 出库组盘头" + shipmentContainerHeader.getId() + "已经生成任务,请不要重复生成,操作中止");
        }
        if (!shipmentContainerHeader.getWarehouseCode().equals(warehouseCode)) {
            return AjaxResult.error("生成出库任务时, 出库组盘头" + shipmentContainerHeader.getId() + "仓库编码和登录的仓库编码不一致");
        }
        String fromLocationCode = shipmentContainerHeader.getLocationCode();
        String containerCode = shipmentContainerHeader.getContainerCode();
        if (StringUtils.isEmpty(fromLocationCode)) {
            return AjaxResult.error("生成出库任务时, 出库组盘头没有起始库位号");
        }
        Location location = locationService.getLocationByCode(fromLocationCode, warehouseCode);
        if (location == null) {
            return AjaxResult.error("生成出库任务时, 库位号" + fromLocationCode + "没有找到库位");
        }
        if (location.getRowFlag() == QuantityConstant.ROW_OUT) {
            Location location1 = locationService.getNear(location);
            if (location1 != null) {
                String locationCode = location1.getCode();
                TaskHeader taskHeader = taskHeaderService.getUnCompleteTaskByToLocationCode(locationCode, warehouseCode);
                if (taskHeader != null) {
                    preTaskNo = taskHeader.getPreTaskNo();
                }
            }
        }
        Container container = containerService.getContainerByCode(containerCode, warehouseCode);
        if (container == null) {
            return AjaxResult.error("生成出库任务时, 托盘不存在" + containerCode);
        }
        if (container.getStatus().equals(QuantityConstant.STATUS_CONTAINER_LOCK)) {
            return AjaxResult.error("生成出库任务时, 托盘已经锁定,containerCode:" + containerCode);
        }
        container.setStatus(QuantityConstant.STATUS_CONTAINER_LOCK);
        boolean success = containerService.updateById(container);
        if (!success) {
            throw new ServiceException("生成出库任务时, 更新容器失败,containerCode:" + containerCode);
        }
        locationService.updateStatus(fromLocationCode, QuantityConstant.STATUS_LOCATION_LOCK, warehouseCode);
        if (!success) {
            throw new ServiceException("生成出库任务时, 更新库位失败,fromLocationCode:" + fromLocationCode);
        }
        int taskType = QuantityConstant.TASK_TYPE_SORTINGSHIPMENT;
        String zoneCode = location.getZoneCode();
        TaskHeader taskHeader = new TaskHeader();
        taskHeader.setPreTaskNo(preTaskNo);
        taskHeader.setTaskType(taskType);
        taskHeader.setInternalTaskType(QuantityConstant.TASK_INTENERTYPE_SHIPMENT);
        taskHeader.setZoneCode(zoneCode);
//        taskHeader.setShipmentOrder(shipmentOrder);
//        taskHeader.setSequence(sequence);
//        taskHeader.setSequenceNumber(sequenceNumber);
        taskHeader.setWarehouseCode(warehouseCode);
        taskHeader.setStatus(QuantityConstant.TASK_STATUS_BUILD);
        taskHeader.setContainerCode(containerCode);
//        taskHeader.setPort(shipmentContainerHeader.getPort());
        taskHeader.setFromLocation(fromLocationCode);
        taskHeader.setAllocationHeadId(shipmentContainerHeader.getId());
        success = taskHeaderService.save(taskHeader);
        if (!success) {
            throw new ServiceException("生成出库任务时, 创建任务失败");
        }
        ShipmentContainerHeader shipmentContainerHeader1 = new ShipmentContainerHeader();
        shipmentContainerHeader1.setId(shipmentContainerHeader.getId());
        shipmentContainerHeader1.setTaskType(taskType);
        shipmentContainerHeader1.setStatus(QuantityConstant.SHIPMENT_CONTAINER_TASK);
        success = shipmentContainerHeaderService.updateById(shipmentContainerHeader1);
        if (!success) {
            throw new ServiceException("生成出库任务时, 更新出库组盘头失败");
        }
        success = this.updateInventoryContainerStatusByContainerCode(containerCode, warehouseCode);
        if (!success) {
            throw new ServiceException("生成出库任务时, 更新库存头失败");
        }
        return AjaxResult.success("生成出库任务成功", taskHeader);
    }
    @Transactional
    public boolean updateInventoryContainerStatusByContainerCode(String containerCode, String warehouseCode) {
        Container container = containerService.getContainerByCode(containerCode, warehouseCode);
        if (container == null) {
            return false;
        }
        InventoryHeader inventoryHeader = inventoryHeaderService.getInventoryHeaderByContainerCode(containerCode, warehouseCode);
        if (inventoryHeader == null) {
            return true;
        }
        if (!inventoryHeaderService.updateContainerStatusById(container.getStatus(), inventoryHeader.getId())) {
            throw new ServiceException("更新库存头表状态失败");
        }
        List<InventoryDetail> inventoryDetailList = inventoryDetailService.getInventoryDetailListByContainerCode(containerCode, warehouseCode);
        List<InventoryDetail> updateInventoryDetailList = new ArrayList<>();
        if (inventoryDetailList.size() > 0) {
            for (InventoryDetail inventoryDetail : inventoryDetailList) {
                InventoryDetail updateInventoryDetail = new InventoryDetail();
                updateInventoryDetail.setId(inventoryDetail.getId());
                updateInventoryDetailList.add(updateInventoryDetail);
            }
            if (!inventoryDetailService.updateBatchById(updateInventoryDetailList)) {
                throw new ServiceException("更新库存明细表状态失败");
            }
        }
        return true;
    }
    public boolean updateQtyById(BigDecimal qty, int id) {
        ShipmentContainerAdvice shipmentContainerAdvice = new ShipmentContainerAdvice();
        shipmentContainerAdvice.setQty(qty);
        shipmentContainerAdvice.setId(id);
        boolean success = updateById(shipmentContainerAdvice);
        return success;
    }

    @Transactional(rollbackFor = Exception.class)
    public ShipmentContainerAdvice addShipmentContainerAdvice(ShipmentContainerHeader shipmentContainerHeader, ShipmentCombinationModel combinationModel) {
        boolean success = false;
        BigDecimal shipmentQty = combinationModel.getShipQty();
        Integer shipmentDetailId = combinationModel.getShipmentDetailId();
        Integer inventoryDetailId = combinationModel.getInventoryDetailId();
        ShipmentDetail shipmentDetail = shipmentDetailService.getById(shipmentDetailId);
        InventoryDetail inventoryDetail = inventoryDetailService.getById(inventoryDetailId);
        String warehouseCode = inventoryDetail.getWarehouseCode();
        String materialCode = inventoryDetail.getMaterialCode();
        LambdaQueryWrapper<ShipmentContainerAdvice> shipmentContainerAdviceLambdaQueryWrapper = Wrappers.lambdaQuery();
        shipmentContainerAdviceLambdaQueryWrapper.eq(ShipmentContainerAdvice::getShipmentContainerId, shipmentContainerHeader.getId())
                .eq(ShipmentContainerAdvice::getMaterialCode, materialCode).eq(ShipmentContainerAdvice::getShipmentDetailId, shipmentDetail.getId())
                .eq(ShipmentContainerAdvice::getWarehouseCode, warehouseCode);
        ShipmentContainerAdvice shipmentContainerAdvice = this.getOne(shipmentContainerAdviceLambdaQueryWrapper);
        if (shipmentContainerAdvice != null) {
            BigDecimal qty = shipmentContainerAdvice.getQty().add(combinationModel.getShipQty());
            shipmentContainerAdvice.setQty(qty);
            success = this.updateQtyById(qty, shipmentContainerAdvice.getId());
            if (!success) {
                throw new ServiceException("更新出库组盘详情失败");
            }
        } else {
            Material material = materialService.getMaterialByCode(materialCode);
            if (material == null) {
                throw new ServiceException("出库单(" + shipmentDetail.getShipmentCode() + ")的物料(" + materialCode + ")不存在!");
            }
            shipmentContainerAdvice = new ShipmentContainerAdvice();
            shipmentContainerAdvice.setWarehouseCode(shipmentContainerHeader.getWarehouseCode());
            shipmentContainerAdvice.setCompanyCode(shipmentDetail.getCompanyCode());
            shipmentContainerAdvice.setContainerCode(shipmentContainerHeader.getContainerCode());
//            shipmentContainerAdvice.setInventoryDetailId(inventoryDetail.getId());
            shipmentContainerAdvice.setShipmentCode(shipmentDetail.getShipmentCode());
            shipmentContainerAdvice.setShipmentId(shipmentDetail.getShipmentId());
            shipmentContainerAdvice.setShipmentDetailId(shipmentDetail.getId());
            shipmentContainerAdvice.setShipmentContainerId(shipmentContainerHeader.getId());
            shipmentContainerAdvice.setMaterialCode(shipmentDetail.getMaterialCode());
            shipmentContainerAdvice.setMaterialName(shipmentDetail.getMaterialName());
            shipmentContainerAdvice.setMaterialSpec(shipmentDetail.getMaterialSpec());
            shipmentContainerAdvice.setMaterialUnit(shipmentDetail.getMaterialUnit());
            shipmentContainerAdvice.setQty(shipmentQty);
            shipmentContainerAdvice.setBatch(shipmentDetail.getBatch());
            shipmentContainerAdvice.setStatus(QuantityConstant.SHIPMENT_CONTAINER_BUILD);
            success = this.save(shipmentContainerAdvice);
            if (!success) {
                throw new ServiceException("新建预配盘明细失败,sql错误");
            }
        }
        return shipmentContainerAdvice;
    }

}