CodingServiceImpl.java 17.8 KB
package com.huaheng.api.erp.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.api.erp.domain.BoxInfo;
import com.huaheng.api.erp.domain.ChipInfos;
import com.huaheng.api.erp.domain.ShipmentRecord;
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.containerType.domain.ContainerType;
import com.huaheng.pc.config.containerType.service.ContainerTypeService;
import com.huaheng.pc.config.material.domain.Material;
import com.huaheng.pc.config.material.service.MaterialService;
import com.huaheng.pc.config.proPackaging.domain.ProPackaging;
import com.huaheng.pc.config.proPackaging.service.IProPackagingService;
import com.huaheng.pc.inventory.InventoryHistoryDetail.domain.InventoryHistoryDetail;
import com.huaheng.pc.inventory.InventoryHistoryDetail.service.IInventoryHistoryDetailService;
import com.huaheng.pc.inventory.inventoryHistoryHeader.domain.InventoryHistoryHeader;
import com.huaheng.pc.inventory.inventoryHistoryHeader.service.IInventoryHistoryHeaderService;
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.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.agvTask.domain.AgvTask;
import com.huaheng.pc.task.agvTask.service.AgvTaskService;
import com.huaheng.pc.task.taskHeader.service.ReceiptTaskService;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

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

@Service
public class CodingServiceImpl implements CodingService {


    @Resource
    private IInventoryHistoryDetailService inventoryHistoryDetailService;
    @Resource
    private IInventoryHistoryHeaderService inventoryHistoryHeaderService;
    @Resource
    private ContainerService containerService;
    @Resource
    private ContainerTypeService containerTypeService;
    @Resource
    private ReceiptContainerHeaderService receiptContainerHeaderService;
    @Resource
    private ReceiptHeaderService receiptHeaderService;
    @Resource
    private MaterialService materialService;
    @Resource
    private IProPackagingService proPackagingService;
    @Resource
    private ReceiptDetailService receiptDetailService;
    @Resource
    private ReceiptContainerDetailService receiptContainerDetailService;
    @Resource
    private ReceiptTaskService receiptTaskService;
    @Resource
    private AgvTaskService agvTaskService;

    @Override
    @Transactional(rollbackFor = Exception.class)
    public AjaxResult innerReceipt(String containerCode, String position,String proSchedule, String orderCode,
                                   String orderName, List<BoxInfo> boxInfoList,
                                   String stack, int qc,int orderFinish) {
        String warehouseCode = "CS0001";
        boolean result = false;
        Container container = containerService.getContainerByCode(containerCode, warehouseCode);
        if(container == null) {
            return AjaxResult.error("根据托盘号:" + containerCode + "没有找到匹配的容器");
        }
        String locationCode = container.getLocationCode();
        if(StringUtils.isNotEmpty(locationCode)) {
            return AjaxResult.error("这个容器在库位上,不能用来入库, 托盘号:" + containerCode);
        }
        String containerTypeCode = container.getContainerType();
        if(containerTypeCode == null) {
            return AjaxResult.error("容器类型编码为空");
        }
        ContainerType containerType = containerTypeService.getContainerTypeByCode(containerTypeCode, warehouseCode);
        if(containerType == null) {
            return AjaxResult.error("容器类型为空");
        }
        if(boxInfoList == null || boxInfoList.size() == 0) {
            return AjaxResult.error("箱信息为空");
        }

        List<ReceiptContainerDetail> receiptContainerDetailList = new ArrayList<>();
        LambdaQueryWrapper<ReceiptContainerHeader> receiptContainerHeaderLambdaQueryWrapper = Wrappers.lambdaQuery();
        receiptContainerHeaderLambdaQueryWrapper.eq(ReceiptContainerHeader::getContainerCode, containerCode)
                .lt(ReceiptContainerHeader::getStatus, QuantityConstant.RECEIPT_CONTAINER_FINISHED);
        ReceiptContainerHeader receiptContainerHeader =
                receiptContainerHeaderService.getOne(receiptContainerHeaderLambdaQueryWrapper);
        if(receiptContainerHeader != null) {
            return AjaxResult.error("容器已经有组盘信息,容器号:" + containerCode);
        }

        LambdaQueryWrapper<ReceiptHeader> receiptHeaderLambdaQueryWrapper = Wrappers.lambdaQuery();
        receiptHeaderLambdaQueryWrapper.eq(ReceiptHeader::getCode, orderCode);
        ReceiptHeader receiptHeader = receiptHeaderService.getOne(receiptHeaderLambdaQueryWrapper);
        if(receiptHeader == null) {
            receiptHeader = new ReceiptHeader();
            receiptHeader.setCode(orderCode);
            receiptHeader.setReceiptType("SC");
            receiptHeader.setWarehouseCode(warehouseCode);
            receiptHeader.setCompanyCode("JY");
            receiptHeader.setReferType("01");
            receiptHeader.setTotalLines(0);
            receiptHeader.setTotalQty(BigDecimal.ZERO);
            receiptHeader.setFirstStatus(200);
            receiptHeader.setLastStatus(200);
            receiptHeader.setOrderFinish(false);
            receiptHeader.setCreatedBy("赋码系统");
            receiptHeader.setLastUpdatedBy("赋码系统");
            result = receiptHeaderService.save(receiptHeader);
            if(!result) {
                throw new ServiceException("保存入库单失败");
            }
        }

        BigDecimal totalQty = new BigDecimal(0);
        String materialCode1 = null, batch1 = null, level1=null,color1=null,materialPackage1=null,productSize=null;
        Integer boxQty = 0;//每箱数量
        Integer box = 0;//箱数
        for(BoxInfo boxInfo : boxInfoList) {
            String boxCode = boxInfo.getBoxCode();
            String boxPosition = boxInfo.getBoxPosition();
            List<ChipInfos> chipInfoList = boxInfo.getChipInfos();
            materialCode1 = boxInfo.getMaterialCode();
            materialPackage1 = boxInfo.getMaterialPackage();
            level1 = boxInfo.getLevel();
            color1 = boxInfo.getColor();
            productSize = boxInfo.getProductSize();
            BigDecimal qty = boxInfo.getQty();
            batch1 = boxInfo.getBatch();
            totalQty = totalQty.add(qty);
        }

        ReceiptDetail receiptDetail = new ReceiptDetail();
        receiptDetail.setWarehouseCode(warehouseCode);
        receiptDetail.setCompanyCode("JY");
        receiptDetail.setMaterialCode(materialCode1);
        receiptDetail.setMaterialUnit("1001");

        LambdaQueryWrapper<Material> queryWrapper = Wrappers.lambdaQuery();
        queryWrapper.eq(Material::getCode,materialCode1)
                .eq(Material::getWarehouseCode,"CS0001");
        Material material1 = materialService.getOne(queryWrapper);
        receiptDetail.setMaterialName(material1.getName());
        receiptDetail.setColor(color1);
        receiptDetail.setLevel(level1);
        receiptDetail.setProPackaging(materialPackage1);
        receiptDetail.setProductSchedule(proSchedule);
        receiptDetail.setProductSize(productSize);
        receiptDetail.setQty(totalQty);

        LambdaQueryWrapper<ProPackaging> queryWrapper2 = Wrappers.lambdaQuery();
        queryWrapper2.eq(ProPackaging::getNumber,materialPackage1);
        ProPackaging proPackaging = proPackagingService.getOne(queryWrapper2);
        if(proPackaging==null) {
            return AjaxResult.error("没有该产品包装");
        }
        //每箱数量
        int pieceBox = proPackaging.getPieceBox();

        //箱数
        box = totalQty.divide(BigDecimal.valueOf(pieceBox), RoundingMode.DOWN).intValue();
        receiptDetail.setBox(box);
        receiptDetail.setTaskQty(totalQty);
        receiptDetail.setBatch(batch1);
        receiptDetail.setProjectNo(orderCode);
        receiptDetail.setReceiptCode(orderCode);
        receiptDetail.setQcCheck(qc+"");//是否质检
        receiptDetail.setCreatedBy("赋码系统");
        receiptDetail.setLastUpdatedBy("赋码系统");
        receiptDetail.setReceiptId(receiptHeader.getId());
        result = receiptDetailService.save(receiptDetail);
        if(!result) {
            throw new ServiceException("保存入库单详情失败");
        }
        receiptHeader.setTotalLines(receiptHeader.getTotalLines()+1);
        receiptHeader.setTotalQty(receiptHeader.getTotalQty().add(totalQty));
        //判断是否完成的标志
        boolean result1 = orderFinish == 1 ? true:false;
        receiptHeader.setOrderFinish(result1);//设值
        result = receiptHeaderService.updateById(receiptHeader);
        if(!result) {
            throw new ServiceException("更新入库单失败");
        }
        ReceiptContainerHeader receiptContainerHeader1 = new ReceiptContainerHeader();
        receiptContainerHeader1.setWarehouseCode(warehouseCode);
        receiptContainerHeader1.setCompanyCode("JY");
        receiptContainerHeader1.setContainerCode(containerCode);
        receiptContainerHeader1.setPosition(position);
//        receiptContainerHeader1.setStockId(stockId);//生产车间
        receiptContainerHeader1.setOrderCode(orderCode);//订单编号
        receiptContainerHeader1.setOrderName(orderName);//订单名称
        receiptContainerHeader1.setBatch(batch1);//批次
        receiptContainerHeader1.setMaterialCode(materialCode1);//物料编码
        receiptContainerHeader1.setContainerType(containerTypeCode);
        receiptContainerHeader1.setTaskType(QuantityConstant.TASK_TYPE_WHOLERECEIPT);
        receiptContainerHeader1.setStatus(QuantityConstant.RECEIPT_CONTAINER_BUILD);
        receiptContainerHeader1.setStack(stack);//设置垛型
        receiptContainerHeader1.setCreatedBy("赋码系统");
        receiptContainerHeader1.setLastUpdatedBy("赋码系统");
        result = receiptContainerHeaderService.save(receiptContainerHeader1);
        if(!result) {
            throw new ServiceException("保存入库组盘头失败");
        }
        for(BoxInfo boxInfo : boxInfoList) {
            String boxCode = boxInfo.getBoxCode();
            String boxPosition = boxInfo.getBoxPosition();
            List<ChipInfos> chipInfoList = boxInfo.getChipInfos();
            String materialCode = boxInfo.getMaterialCode();
            Material material = materialService.getMaterialByCode(materialCode, warehouseCode);
            String level = boxInfo.getLevel();
            String materialPackage = boxInfo.getMaterialPackage();
            String productSize1 = boxInfo.getProductSize();
            String color = boxInfo.getColor();
            String batch = boxInfo.getBatch();
            for(ChipInfos chipInfos : chipInfoList) {
                ReceiptContainerDetail receiptContainerDetail = new ReceiptContainerDetail();
                String chipCode = chipInfos.getChipBarcode();
                receiptContainerDetail.setWarehouseCode(warehouseCode);
                receiptContainerDetail.setContainerCode(containerCode);
                receiptContainerDetail.setContainerType(containerTypeCode);
                receiptContainerDetail.setCompanyCode("JY");
                receiptContainerDetail.setTaskType(QuantityConstant.TASK_TYPE_WHOLERECEIPT);
                receiptContainerDetail.setChipCode(chipCode);
                receiptContainerDetail.setMaterialCode(receiptDetail.getMaterialCode());
                receiptContainerDetail.setMaterialName(receiptDetail.getMaterialName());
                receiptContainerDetail.setMaterialSpec(receiptDetail.getMaterialSpec());
                receiptContainerDetail.setMaterialUnit(receiptDetail.getMaterialUnit());
                receiptContainerDetail.setProPackaging(materialPackage);//包装
                receiptContainerDetail.setProductSchedule(proSchedule);//排产订单
                receiptContainerDetail.setProductSize(productSize1);//等级
                receiptContainerDetail.setLevel(level);//等级
                receiptContainerDetail.setColor(color);//色号
                receiptContainerDetail.setQty(BigDecimal.ONE);
                receiptContainerDetail.setBatch(batch);
                receiptContainerDetail.setReceiptCode(orderCode);
                receiptContainerDetail.setBoxCode(boxCode);
                receiptContainerDetail.setReceiptType("SC");
                receiptContainerDetail.setInventorySts("good");
                receiptContainerDetail.setCreatedBy("赋码系统");
                receiptContainerDetail.setLastUpdatedBy("赋码系统");
                receiptContainerDetail.setBoxPosition(boxPosition);
                receiptContainerDetail.setReceiptId(receiptHeader.getId());
                receiptContainerDetail.setReceiptDetailId(receiptDetail.getId());
                receiptContainerDetail.setReceiptContainerId(receiptContainerHeader1.getId());
                receiptContainerDetailList.add(receiptContainerDetail);
            }
        }
        result = receiptContainerDetailService.saveBatch(receiptContainerDetailList);
        if(!result) {
            throw new ServiceException("保存入库组盘详情失败");
        }
        Integer id = receiptContainerHeader1.getId();
        result = receiptTaskService.createReceiptTask(id, warehouseCode);
        if(!result) {
            throw new ServiceException("生产任务失败");
        }

        if(qc == 1) {
            agvTaskAndReceiptQcStream(position, receiptHeader, warehouseCode);
        }else {
            //生成AGV取放货任务
            AgvTask agvTask = new AgvTask();
            agvTask.setType(QuantityConstant.AGV_TYPE_TAKE_AND_RELEASE);
            agvTask.setStatus(QuantityConstant.AGV_TASK_STATUS_BUILD);
            agvTask.setWarehouseCode(warehouseCode);
            agvTask.setPriority(10);
            agvTask.setFromPort(position);
            agvTask.setToPort("5");
            agvTask.setCreatedBy("赋码系统");
            result = agvTaskService.save(agvTask);
            if(!result) {
                throw new ServiceException("生成AGV任务失败");
            }
        }
        return AjaxResult.success("保存入库组盘信息成功");
    }

    @Override
    public AjaxResult findShipmentRecord(String boxCode) {
        //查询符合条件的历史库存明细
        LambdaQueryWrapper<InventoryHistoryDetail> inventoryHistoryDetailLambdaQueryWrapper= Wrappers.lambdaQuery();
        inventoryHistoryDetailLambdaQueryWrapper.eq(InventoryHistoryDetail::getBoxCode,boxCode);
        List<InventoryHistoryDetail> inventoryHistorysDetailList = inventoryHistoryDetailService.list(inventoryHistoryDetailLambdaQueryWrapper);

        LambdaQueryWrapper<InventoryHistoryHeader> inventoryHistoryHeaderLambdaQueryWrapper= Wrappers.lambdaQuery();
        inventoryHistoryHeaderLambdaQueryWrapper.eq(InventoryHistoryHeader::getId,inventoryHistorysDetailList.get(0).getInventoryHistoryHeaderId());
        InventoryHistoryHeader inventoryHistoryHeader = inventoryHistoryHeaderService.getOne(inventoryHistoryHeaderLambdaQueryWrapper);

        List<ShipmentRecord> list=new ArrayList<>();
        for(InventoryHistoryDetail inventoryHistoryDetail:inventoryHistorysDetailList){
            //设置shipmentRecord属性,
            ShipmentRecord shipmentRecord=new ShipmentRecord();
            shipmentRecord.setMaterialCode(inventoryHistoryDetail.getMaterialCode());
            shipmentRecord.setMaterialName(inventoryHistoryDetail.getMaterialName());
            shipmentRecord.setColor(inventoryHistoryDetail.getColor());
            shipmentRecord.setBoxCode(boxCode);
            shipmentRecord.setLevel(inventoryHistoryDetail.getLevel());
            shipmentRecord.setBatch(inventoryHistoryDetail.getBatch());
            shipmentRecord.setTime(inventoryHistoryDetail.getCreated());
            shipmentRecord.setChipCode(inventoryHistoryDetail.getChipCode());
            shipmentRecord.setOrderCode(inventoryHistoryHeader.getOrderCode());
            shipmentRecord.setOrderName(inventoryHistoryHeader.getOrderName());
            list.add(shipmentRecord);
        }
        return AjaxResult.success().setData(list);

    }


    private Boolean agvTaskAndReceiptQcStream(String position, ReceiptHeader receiptHeader,String warehouseCode){
        //生成AGV取放货任务
        AgvTask agvTask = new AgvTask();
        agvTask.setType(QuantityConstant.AGV_TYPE_TAKE_AND_RELEASE);
        agvTask.setStatus(QuantityConstant.AGV_TASK_STATUS_BUILD);
        agvTask.setWarehouseCode(warehouseCode);
        agvTask.setPriority(10);
        agvTask.setFromPort(position);
        agvTask.setToPort("质检点位");
        agvTask.setCreatedBy("质检点位");
        Boolean result = agvTaskService.save(agvTask);
        if(!result) {
            throw new ServiceException("生成AGV任务失败");
        }
        //生成入库质检单
        receiptHeaderService.check(receiptHeader.getId());
        return Boolean.TRUE;
    }
}