WcsServiceImpl.java 19.5 KB
package com.huaheng.api.wcs.service;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.huaheng.api.wcs.domain.WcsTask;
import com.huaheng.api.wcs.service.warecellAllocation.LocationAllocationService;
import com.huaheng.common.constant.QuantityConstant;
import com.huaheng.common.exception.service.ServiceException;
import com.huaheng.common.utils.StringUtils;
import com.huaheng.framework.web.domain.AjaxResult;
import com.huaheng.framework.web.service.ConfigService;
import com.huaheng.pc.config.container.domain.Container;
import com.huaheng.pc.config.container.service.ContainerService;
import com.huaheng.pc.config.containerType.domain.ContainerType;
import com.huaheng.pc.config.containerType.service.ContainerTypeService;
import com.huaheng.pc.config.location.domain.Location;
import com.huaheng.pc.config.location.service.LocationService;
import com.huaheng.pc.config.locationType.domain.LocationType;
import com.huaheng.pc.config.locationType.service.LocationTypeService;
import com.huaheng.pc.config.material.domain.Material;
import com.huaheng.pc.config.material.service.MaterialService;
import com.huaheng.pc.config.zone.domain.Zone;
import com.huaheng.pc.config.zone.service.ZoneService;
import com.huaheng.pc.inventory.inventoryCacheDetail.domain.InventoryCacheDetail;
import com.huaheng.pc.inventory.inventoryCacheDetail.service.InventoryCacheDetailService;
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.inventory.inventoryTransaction.domain.InventoryTransaction;
import com.huaheng.pc.inventory.inventoryTransaction.service.InventoryTransactionService;
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.service.ReceiptContainerHeaderService;
import com.huaheng.pc.receipt.receiptHeader.domain.ReceiptHeader;
import com.huaheng.pc.shipment.shipmentDetail.domain.ShipmentDetail;
import com.huaheng.pc.shipment.shipmentDetail.service.ShipmentDetailService;
import com.huaheng.pc.task.taskDetail.domain.TaskDetail;
import com.huaheng.pc.task.taskDetail.service.TaskDetailService;
import com.huaheng.pc.task.taskHeader.domain.TaskHeader;
import com.huaheng.pc.task.taskHeader.service.ReceiptTaskService;
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.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

import static java.util.stream.Collectors.toList;

/**
 * @author 游杰
 */
@Service
public class WcsServiceImpl implements WcsService {

    @Resource
    private TaskHeaderService taskheaderService;
    @Resource
    private InventoryDetailService inventoryDetailService;
    @Resource
    private InventoryHeaderService inventoryHeaderService;
    @Resource
    private InventoryTransactionService inventoryTransactionService;
    @Resource
    private InventoryCacheDetailService inventoryCacheDetailService;
    @Resource
    private TaskHeaderService taskHeaderService;
    @Resource
    private TaskDetailService taskDetailService;
    @Resource
    private MaterialService materialService;
    @Resource
    private ShipmentDetailService shipmentDetailService;
    @Resource
    private ReceiptContainerHeaderService receiptContainerHeaderService;
    @Resource
    private ReceiptContainerDetailService receiptContainerDetailService;
    @Resource
    private ReceiptTaskService receiptTaskService;

    /**
     *
     * @param wcsTask
     * @return
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public AjaxResult innerBack(WcsTask wcsTask) {
        String containerCode = wcsTask.getContainerCode();
        LambdaQueryWrapper<TaskHeader> taskHeaderLambdaQueryWrapper = Wrappers.lambdaQuery();
        //根据容器号查找
        taskHeaderLambdaQueryWrapper.eq(TaskHeader::getContainerCode, containerCode);
        taskHeaderLambdaQueryWrapper.lt(TaskHeader::getStatus, QuantityConstant.TASK_STATUS_COMPLETED);
        TaskHeader taskHeader = taskheaderService.getOne(taskHeaderLambdaQueryWrapper);
        if(taskHeader == null) {
            return AjaxResult.error("没有找到任务,不允许回库");
        }
        int back = taskHeader.getBack();
        LambdaQueryWrapper<InventoryDetail> inventoryDetailLambdaQueryWrapper = Wrappers.lambdaQuery();;
        inventoryDetailLambdaQueryWrapper.eq(InventoryDetail::getContainerCode, containerCode);
        List<InventoryDetail> inventoryDetailList =
                inventoryDetailService.list(inventoryDetailLambdaQueryWrapper);
        int flag = 0;
        int size = inventoryDetailList.size();
        if(size > 0) {
            flag = 1;
        }
        if(back == 1) {
            return AjaxResult.success("允许回库").setData(flag);
        }
        return AjaxResult.error("任务ID:" + taskHeader.getId() + "不允许回库");
    }

    @Override
    @Transactional(rollbackFor = Exception.class)
    public AjaxResult calculateWeight(String taskNo, String weight1) {
        BigDecimal bigDecimal = new BigDecimal(weight1);
        TaskHeader taskHeader = taskHeaderService.getById(taskNo);
        if(taskHeader == null) {
            return AjaxResult.error("没有找到对应任务:" + taskNo);
        }
        String materialCode = taskHeader.getMaterialCode();
        if(StringUtils.isEmpty(materialCode)) {
            return AjaxResult.error("物料信息为空");
        }
        String warehouseCode = taskHeader.getWarehouseCode();
        LambdaQueryWrapper<TaskDetail> taskDetailLambdaQueryWrapper = Wrappers.lambdaQuery();
        taskDetailLambdaQueryWrapper.eq(TaskDetail::getTaskId, taskNo);
        List<TaskDetail> taskDetailList = taskDetailService.list(taskDetailLambdaQueryWrapper);
        int qty = taskDetailList.size();
        Material material = materialService.getMaterialByCode(materialCode, warehouseCode);
        BigDecimal pieceWeight = material.getPieceWeight();
        // 四舍五入
        BigDecimal totalQty = bigDecimal.divide(pieceWeight, BigDecimal.ROUND_HALF_UP);
        int abs = totalQty.intValue() - qty;
        if(abs == 0) {
            return AjaxResult.success("称重符合数量");
        }
        return AjaxResult.error("称重数量为" + totalQty + "   系统数量为" + qty);
    }

    @Override
    @Transactional(rollbackFor = Exception.class)
    public AjaxResult decreaseInventory(String containerCode, String boxCode) {
        LambdaQueryWrapper<TaskHeader> taskHeaderLambdaQueryWrapper = Wrappers.lambdaQuery();
        taskHeaderLambdaQueryWrapper.eq(TaskHeader::getTaskType, QuantityConstant.TASK_TYPE_SORTINGSHIPMENT)
                                    .eq(TaskHeader::getContainerCode, containerCode)
                                    .lt(TaskHeader::getStatus, QuantityConstant.TASK_STATUS_COMPLETED);
        TaskHeader taskHeader = taskHeaderService.getOne(taskHeaderLambdaQueryWrapper);
        if(taskHeader == null) {
            return AjaxResult.error("扣减库存 没有找到出库任务,托盘号" + containerCode);
        }
        String shipmentCode = taskHeader.getShipmentCode();
        LambdaQueryWrapper<InventoryDetail> inventoryDetailLambdaQueryWrapper = Wrappers.lambdaQuery();
        inventoryDetailLambdaQueryWrapper.eq(InventoryDetail::getContainerCode, containerCode)
                                        .eq(InventoryDetail::getBoxCode, boxCode);
        List<InventoryDetail> inventoryDetailList = inventoryDetailService.list(inventoryDetailLambdaQueryWrapper);
        if(inventoryDetailList.size() == 0) {
            return AjaxResult.error("扣减库存 没有找到对应库存,托盘号" + containerCode + "箱码" + boxCode);
        }

        List<InventoryCacheDetail> inventoryCacheDetailList = new ArrayList<>();
        List<Integer> ids =  inventoryDetailList.stream().
                map(InventoryDetail::getId).collect(Collectors.toList());
        inventoryDetailService.removeByIds(ids);
        BigDecimal shipQty = BigDecimal.ZERO;
        List<InventoryTransaction> inventoryTransactionList = new ArrayList<>();
        for(InventoryDetail inventoryDetail : inventoryDetailList) {
            InventoryTransaction inventoryTransaction = new InventoryTransaction();
            inventoryTransaction.setTransactionType(QuantityConstant.INVENTORY_TRANSACTION_SHIPMENT);
            inventoryTransaction.setWarehouseCode(inventoryDetail.getWarehouseCode());
            inventoryTransaction.setCompanyCode(inventoryDetail.getCompanyCode());
            inventoryTransaction.setLocationCode(inventoryDetail.getLocationCode());
            inventoryTransaction.setContainerCode(inventoryDetail.getContainerCode());
            inventoryTransaction.setMaterialCode(inventoryDetail.getMaterialCode());
            inventoryTransaction.setZoneCode(inventoryDetail.getZoneCode());
            inventoryTransaction.setMaterialName(inventoryDetail.getMaterialName());
            inventoryTransaction.setMaterialSpec(inventoryDetail.getMaterialSpec());
            inventoryTransaction.setMaterialUnit(inventoryDetail.getMaterialUnit());
            inventoryTransaction.setChipCode(inventoryDetail.getChipCode());
            inventoryTransaction.setLevel(inventoryDetail.getLevel());
            inventoryTransaction.setColor(inventoryDetail.getColor());
            inventoryTransaction.setBoxCode(inventoryDetail.getBoxCode());
            inventoryTransaction.setBoxPosition(inventoryDetail.getBoxPosition());
            inventoryTransaction.setBillCode(shipmentCode);
            inventoryTransaction.setBatch(inventoryDetail.getBatch());
            inventoryTransaction.setLot(inventoryDetail.getLot());
            inventoryTransaction.setInventorySts(inventoryDetail.getInventorySts());
            inventoryTransaction.setTaskQty(inventoryDetail.getQty());
            shipQty = shipQty.add(inventoryDetail.getQty());
            inventoryTransactionList.add(inventoryTransaction);

            InventoryCacheDetail inventoryCacheDetail = new InventoryCacheDetail();
            inventoryCacheDetail.setWarehouseCode(inventoryDetail.getWarehouseCode());
            inventoryCacheDetail.setCompanyCode(inventoryDetail.getCompanyCode());
            inventoryCacheDetail.setZoneCode(inventoryDetail.getZoneCode());
            inventoryCacheDetail.setLocationCode(inventoryDetail.getLocationCode());
            inventoryCacheDetail.setContainerCode(inventoryDetail.getContainerCode());
            inventoryCacheDetail.setMaterialCode(inventoryDetail.getMaterialCode());
            inventoryCacheDetail.setMaterialName(inventoryDetail.getMaterialName());
            inventoryCacheDetail.setMaterialSpec(inventoryDetail.getMaterialSpec());
            inventoryCacheDetail.setMaterialUnit(inventoryDetail.getMaterialUnit());
            inventoryCacheDetail.setQty(inventoryDetail.getQty());
            inventoryCacheDetail.setInventorySts(inventoryDetail.getInventorySts());
            inventoryCacheDetail.setSupplierCode(inventoryDetail.getSupplierCode());
            inventoryCacheDetail.setBatch(inventoryDetail.getBatch());
            inventoryCacheDetail.setBoxCode(inventoryDetail.getBoxCode());
            inventoryCacheDetail.setChipCode(inventoryDetail.getChipCode());
            inventoryCacheDetail.setLevel(inventoryDetail.getLevel());
            inventoryCacheDetail.setColor(inventoryDetail.getColor());
            inventoryCacheDetailList.add(inventoryCacheDetail);
        }
        if (!inventoryTransactionService.saveBatch(inventoryTransactionList)) {
            throw new ServiceException("新增库存记录失败");
        }
        if (!inventoryCacheDetailService.saveBatch(inventoryCacheDetailList)) {
            throw new ServiceException("新增缓存库存记录失败");
        }

        String materialCode = taskHeader.getMaterialCode();
        LambdaQueryWrapper<ShipmentDetail> shipmentDetailLambdaQueryWrapper = Wrappers.lambdaQuery();
        shipmentDetailLambdaQueryWrapper.eq(ShipmentDetail::getMaterialCode, materialCode)
                                        .eq(ShipmentDetail::getShipmentCode, shipmentCode);
        ShipmentDetail shipmentDetail = shipmentDetailService.getOne(shipmentDetailLambdaQueryWrapper);
        BigDecimal taskQty = shipmentDetail.getTaskQty().add(shipQty);
        shipmentDetail.setTaskQty(taskQty);
        shipmentDetailService.updateById(shipmentDetail);
        LambdaQueryWrapper<InventoryDetail> inventoryDetailLambdaQueryWrapper1 = Wrappers.lambdaQuery();
        inventoryDetailLambdaQueryWrapper1.eq(InventoryDetail::getContainerCode, containerCode);
        List<InventoryDetail> leaveInventoryDetailList =
                inventoryDetailService.list(inventoryDetailLambdaQueryWrapper1);
        if(leaveInventoryDetailList.size() == 0) {
//            LambdaQueryWrapper<InventoryHeader> inventoryHeaderLambdaQueryWrapper = Wrappers.lambdaQuery();
//            inventoryHeaderLambdaQueryWrapper.eq(InventoryHeader::getContainerCode, containerCode);
//            inventoryHeaderService.remove(inventoryHeaderLambdaQueryWrapper);
            taskHeader.setBack(1);
            taskHeaderService.updateById(taskHeader);
        }
        return AjaxResult.success("扣减库存成功");
    }

    @Override
    @Transactional(rollbackFor = Exception.class)
    public AjaxResult receiptContainer(String boxCode, String port, String stack, int finish) {
        LambdaQueryWrapper<InventoryCacheDetail> inventoryCacheDetailLambdaQueryWrapper = Wrappers.lambdaQuery();
        inventoryCacheDetailLambdaQueryWrapper.eq(InventoryCacheDetail::getBoxCode, boxCode);
        List<InventoryCacheDetail> inventoryCacheDetailList =
                inventoryCacheDetailService.list(inventoryCacheDetailLambdaQueryWrapper);
        if(inventoryCacheDetailList.size() == 0) {
            return AjaxResult.error("没有找到砖码");
        }
        String warehouseCode = inventoryCacheDetailList.get(0).getWarehouseCode();
        String materialCode = inventoryCacheDetailList.get(0).getMaterialCode();
        LambdaQueryWrapper<ReceiptContainerHeader> receipttContainerHeaderLambdaQueryWrapper = Wrappers.lambdaQuery();
        receipttContainerHeaderLambdaQueryWrapper.eq(ReceiptContainerHeader::getPort, port)
                                                .eq(ReceiptContainerHeader::getStatus, QuantityConstant.RECEIPT_CONTAINER_BUILD);
        ReceiptContainerHeader receiptContainerHeader =
                receiptContainerHeaderService.getOne(receipttContainerHeaderLambdaQueryWrapper);
        String containerCode = null;
        if(receiptContainerHeader == null) {
            receiptContainerHeader = new ReceiptContainerHeader();
            containerCode = receiptTaskService.createContainer();
            receiptContainerHeader.setPort(port);
            receiptContainerHeader.setContainerCode(containerCode);
            receiptContainerHeader.setWarehouseCode(warehouseCode);
            receiptContainerHeader.setCompanyCode("JY");
            receiptContainerHeader.setContainerCode(containerCode);
            receiptContainerHeader.setMaterialCode(materialCode);//物料编码
            receiptContainerHeader.setTaskType(QuantityConstant.TASK_TYPE_WHOLERECEIPT);
            receiptContainerHeader.setStatus(QuantityConstant.RECEIPT_CONTAINER_BUILD);
            receiptContainerHeader.setCreatedBy("赋码系统");
            receiptContainerHeader.setLastUpdatedBy("赋码系统");
            boolean result = receiptContainerHeaderService.save(receiptContainerHeader);
            if(!result) {
                return AjaxResult.error("保存入库组盘头");
            }
        }
        List<ReceiptContainerDetail> receiptContainerDetailList = new ArrayList<>();
        List<Integer> inventoryCacheIds = new ArrayList<>();
        for(InventoryCacheDetail inventoryCacheDetail : inventoryCacheDetailList) {
            ReceiptContainerDetail receiptContainerDetail = new ReceiptContainerDetail();
            receiptContainerDetail.setContainerCode(inventoryCacheDetail.getContainerCode());
            String chipCode = inventoryCacheDetail.getChipCode();
            receiptContainerDetail.setWarehouseCode(warehouseCode);
            receiptContainerDetail.setReceiptContainerId(receiptContainerHeader.getId());
            receiptContainerDetail.setContainerCode(inventoryCacheDetail.getContainerCode());
            receiptContainerDetail.setCompanyCode("JY");
            receiptContainerDetail.setTaskType(QuantityConstant.TASK_TYPE_WHOLERECEIPT);
            receiptContainerDetail.setChipCode(chipCode);
            receiptContainerDetail.setMaterialCode(inventoryCacheDetail.getMaterialCode());
            receiptContainerDetail.setMaterialName(inventoryCacheDetail.getMaterialName());
            receiptContainerDetail.setMaterialSpec(inventoryCacheDetail.getMaterialSpec());
            receiptContainerDetail.setMaterialUnit(inventoryCacheDetail.getMaterialUnit());
            receiptContainerDetail.setProPackaging(inventoryCacheDetail.getMaterialPackage());//包装
            receiptContainerDetail.setProductSchedule(inventoryCacheDetail.getProductSchedule());//排产订单
            receiptContainerDetail.setProductSize(inventoryCacheDetail.getProductSize());//规格
            receiptContainerDetail.setLevel(inventoryCacheDetail.getLevel());//等级
            receiptContainerDetail.setColor(inventoryCacheDetail.getColor());//色号
            receiptContainerDetail.setQty(inventoryCacheDetail.getQty());
            receiptContainerDetail.setBatch(inventoryCacheDetail.getBatch());
            receiptContainerDetail.setReceiptCode(inventoryCacheDetail.getReceiptCode());
            receiptContainerDetail.setBoxCode(boxCode);
            receiptContainerDetail.setReceiptType("SC");
            receiptContainerDetail.setInventorySts("good");
            receiptContainerDetail.setCreatedBy("赋码系统");
            receiptContainerDetail.setLastUpdatedBy("赋码系统");
            receiptContainerDetailList.add(receiptContainerDetail);
            inventoryCacheIds.add(inventoryCacheDetail.getId());
        }
        boolean result = receiptContainerDetailService.saveBatch(receiptContainerDetailList);
        if(!result) {
            return AjaxResult.error("保存入库组盘明细失败");
        }
        result = inventoryCacheDetailService.removeByIds(inventoryCacheIds);
        if(!result) {
            return AjaxResult.error("删除缓存库存失败");
        }
        if(finish == 1) {
            if(containerCode == null) {
                containerCode = receiptTaskService.createContainer();
            }
            TaskHeader taskHeader = new TaskHeader();
            taskHeader.setTaskType(QuantityConstant.TASK_TYPE_OVER_STATION);
            taskHeader.setContainerCode(containerCode);
            taskHeader.setFromPort(port);
            taskHeader.setPortGroup("P7");
            taskHeader.setTie(0);
            taskHeader.setSlider(0);
            taskHeader.setPaper(0);
            taskHeader.setStack(stack);
            taskheaderService.updateById(taskHeader);
        }
        return AjaxResult.success("保存入库组盘成功");
    }
}