MesServiceImpl.java 20.2 KB
package com.huaheng.api.mes.service;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.huaheng.api.mes.domain.*;
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.pc.config.container.domain.Container;
import com.huaheng.pc.config.container.service.ContainerService;
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.service.ReceiptContainerHeaderService;
import com.huaheng.pc.receipt.receiptContainerHeader.service.ReceiptContainerHeaderServiceImpl;
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.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 com.huaheng.pc.task.taskHeader.service.WorkTaskService;
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;

/**
 * @author 游杰
 */
@Service
public class MesServiceImpl implements MesService {

    @Resource
    private ReceiptHeaderService receiptHeaderService;
    @Resource
    private ReceiptDetailService receiptDetailService;
    @Resource
    private ShipmentHeaderService shipmentHeaderService;
    @Resource
    private ShipmentDetailService shipmentDetailService;
    @Resource
    private MaterialService materialService;
    @Resource
    private WorkTaskService workTaskService;
    @Resource
    private InventoryDetailService inventoryDetailService;
    @Resource
    private ReceiptContainerHeaderService receiptContainerHeaderService;
    @Resource
    private ContainerService containerService;
    @Resource
    private ReceiptContainerDetailService receiptContainerDetailService;

    @Override
    @Transactional(rollbackFor = Exception.class)
    public AjaxResult receiptOrder(MesOrder mesOrder) {
        String orderCode = mesOrder.getOrderCode();
        String taskNo = mesOrder.getTaskNo();
        List<MesOrderMaterial> list = mesOrder.getMesOrderMaterial();
        List<ReceiptDetail> lst = new ArrayList<>();
        LambdaQueryWrapper<ReceiptHeader> receiptHeaderLambdaQueryWrapper = Wrappers.lambdaQuery();
        receiptHeaderLambdaQueryWrapper.eq(ReceiptHeader::getReferCode, orderCode);
        ReceiptHeader receiptHeader = receiptHeaderService.getOne(receiptHeaderLambdaQueryWrapper);
        if(receiptHeader != null) {
            throw new ServiceException("入库单,工单" + orderCode + ", 已经存在");
        }

        //采购入库单
        String receiptType = "CG";
        String receiptCode = receiptHeaderService.createCode(receiptType);
        receiptHeader = new ReceiptHeader();
        receiptHeader.setCode(receiptCode);
        receiptHeader.setWarehouseCode(QuantityConstant.DEFAULT_WAREHOUSE);
        receiptHeader.setCompanyCode(QuantityConstant.DEFAULT_COMPANY_CODE);
        receiptHeader.setReceiptType(receiptType);
        receiptHeader.setLastStatus(QuantityConstant.RECEIPT_HEADER_BUILD);
        receiptHeader.setLastStatus(QuantityConstant.RECEIPT_HEADER_BUILD);
        receiptHeader.setCreatedBy("MES");
        receiptHeader.setReferCode(orderCode);
        receiptHeader.setUserDef1(taskNo);
        receiptHeader.setTotalLines(list.size());
        receiptHeader.setTotalQty(list.stream().map(MesOrderMaterial::getShipmentReferQty).reduce(BigDecimal.ZERO,BigDecimal::add));
        boolean success = receiptHeaderService.save(receiptHeader);
        if(!success) {
            throw new ServiceException("保存入库单头表失败");
        }
        for (MesOrderMaterial mesOrderMaterial : list) {
            Material material = materialService.getMaterialByCode(mesOrderMaterial.getMaterialCode(), QuantityConstant.DEFAULT_WAREHOUSE);
            if(material == null) {
                throw new ServiceException("根据物料编码" + mesOrderMaterial.getMaterialCode() + " 没有找到对应物料信息");
            }
            ReceiptDetail receiptDetail = new ReceiptDetail();
            receiptDetail.setReceiptId(receiptHeader.getId());
            receiptDetail.setReceiptCode(receiptCode);
            receiptDetail.setWarehouseCode(QuantityConstant.DEFAULT_WAREHOUSE);
            receiptDetail.setCompanyCode(QuantityConstant.DEFAULT_COMPANY_CODE);
            receiptDetail.setQty(mesOrderMaterial.getShipmentReferQty());
            receiptDetail.setMaterialCode(mesOrderMaterial.getMaterialCode());
            receiptDetail.setMaterialName(material.getName());
            receiptDetail.setMaterialSpec(material.getSpec());
            receiptDetail.setMaterialUnit(material.getUnit());
            receiptDetail.setCreatedBy("MES");
            lst.add(receiptDetail);
        }
        if(!receiptDetailService.saveBatch(lst)) {
            throw new ServiceException("保存入库单明细表失败");
        }
        return AjaxResult.success("创建入库单成功");
    }

    @Override
    @Transactional(rollbackFor = Exception.class)
    public AjaxResult shipmentOrder(MesShipmentOrder mesOrder) {
        String orderCode = mesOrder.getOrderCode();
        String taskNo = mesOrder.getTaskNo();
        String shipmentReferStatus = mesOrder.getShipmentReferStatus();
        String shipmentReferCode = mesOrder.getShipmentReferCode();
        BigDecimal orderQty = mesOrder.getOrderQty();
        List<MesOrderMaterial> list = mesOrder.getMesOrderMaterial();

        LambdaQueryWrapper<ShipmentHeader> shipmentHeaderLambdaQueryWrapper = Wrappers.lambdaQuery();
        shipmentHeaderLambdaQueryWrapper.eq(ShipmentHeader::getReferCode, shipmentReferCode);
        ShipmentHeader shipmentHeader = shipmentHeaderService.getOne(shipmentHeaderLambdaQueryWrapper);
        if(shipmentHeader != null) {
            throw new ServiceException("出库单,领料单" + shipmentReferCode + ", 已经存在");
        }

        //工单领料单
        String shipmentType = "OTF";
        String shipmentCode = shipmentHeaderService.createCode(shipmentType);
        shipmentHeader = new ShipmentHeader();
        shipmentHeader.setCode(shipmentCode);
        shipmentHeader.setWarehouseCode(QuantityConstant.DEFAULT_WAREHOUSE);
        shipmentHeader.setCompanyCode(QuantityConstant.DEFAULT_COMPANY_CODE);
        shipmentHeader.setShipmentType(shipmentType);
        shipmentHeader.setLastStatus(QuantityConstant.RECEIPT_HEADER_BUILD);
        shipmentHeader.setLastStatus(QuantityConstant.RECEIPT_HEADER_BUILD);
        shipmentHeader.setCreatedBy("MES");
        shipmentHeader.setReferCode(shipmentReferCode);
        shipmentHeader.setTaskNo(taskNo);
        shipmentHeader.setOrderCode(orderCode);
        shipmentHeader.setOrderQty(orderQty);
        shipmentHeader.setShipmentReferStatus(shipmentReferStatus);
        shipmentHeader.setTotalLines(list.size());
        shipmentHeader.setTotalQty(list.stream().map(MesOrderMaterial::getShipmentReferQty).reduce(BigDecimal.ZERO,BigDecimal::add));
        if(!shipmentHeaderService.save(shipmentHeader)) {
            throw new ServiceException("保存出库单失败");
        }
        List<ShipmentDetail> lst = new ArrayList<>();
        for (MesOrderMaterial materialCode : list) {
            LambdaQueryWrapper<InventoryDetail> wrapper = Wrappers.lambdaQuery();
            wrapper.eq(InventoryDetail::getMaterialCode, materialCode.getMaterialCode())
                   .isNull(InventoryDetail::getReferCode);
            InventoryDetail inv = inventoryDetailService.getOne(wrapper);
            if (inv == null){
                throw new ServiceException("未找到编码为"+materialCode.getMaterialCode()+"的库存");
            }
            BigDecimal availableQty = inv.getQty().subtract(inv.getTaskQty());
            if (availableQty.compareTo(BigDecimal.ZERO) <= -1 || availableQty.compareTo(materialCode.getShipmentReferQty()) <= -1){
                throw new ServiceException("可用数量不足");
            }
            inv.setReferCode(shipmentReferCode);
            if (!inventoryDetailService.updateById(inv)) {
                throw new ServiceException("更新库存头表失败");
            }
            ShipmentDetail shipmentDetail = new ShipmentDetail();
            shipmentDetail.setShipmentId(shipmentHeader.getId());
            shipmentDetail.setShipmentCode(shipmentCode);
            shipmentDetail.setWarehouseCode(QuantityConstant.DEFAULT_WAREHOUSE);
            shipmentDetail.setCompanyCode(QuantityConstant.DEFAULT_COMPANY_CODE);
            shipmentDetail.setQty(materialCode.getShipmentReferQty());
            shipmentDetail.setMaterialCode(materialCode.getMaterialCode());
            shipmentDetail.setMaterialName(inv.getMaterialName());
            shipmentDetail.setMaterialSpec(inv.getMaterialSpec());
            shipmentDetail.setMaterialUnit(inv.getMaterialUnit());
            shipmentDetail.setInventorySts(QuantityConstant.GOOD);
            shipmentDetail.setCreatedBy("MES");
            lst.add(shipmentDetail);
        }
        if(!shipmentDetailService.saveBatch(lst)) {
            throw new ServiceException("保存出库单失败");
        }

        return AjaxResult.success("创建出库单成功");
    }

    @Override
    @Transactional(rollbackFor = Exception.class)
    public AjaxResult shipmentProduct(MesShipmentProduct mesShipmentProduct) {
        String taskNo = mesShipmentProduct.getTaskNo();
        String containerCode = mesShipmentProduct.getContainerCode();
        String fromPort = mesShipmentProduct.getFromPort();
        String toPort = mesShipmentProduct.getToPort();

        AjaxResult ajaxResult = workTaskService.createOverStation(containerCode, fromPort, toPort, taskNo);
        return ajaxResult;
    }

    @Override
    public AjaxResult receipt(MesReceipt mesReceipt) {
        /* 新建保存组盘头表记录*/
        //根据容器编码查询组盘表头记录
        LambdaQueryWrapper<ReceiptContainerHeader> lambda = Wrappers.lambdaQuery();
        lambda.eq(ReceiptContainerHeader::getContainerCode, mesReceipt.getContainerCode())
                .eq(ReceiptContainerHeader::getStatus, QuantityConstant.RECEIPT_CONTAINER_BUILD);
        List<ReceiptContainerHeader> list = receiptContainerHeaderService.list(lambda);

        ReceiptContainerHeader receiptContainerHeader = new ReceiptContainerHeader();
        //当size大于等于1表示容器已经有组盘了
        if (list.size() < 1){
            receiptContainerHeader.setWarehouseCode(ShiroUtils.getWarehouseCode());
            receiptContainerHeader.setCompanyCode(QuantityConstant.DEFAULT_COMPANY_CODE);
            receiptContainerHeader.setContainerCode(mesReceipt.getContainerCode());
            receiptContainerHeader.setContainerType(mesReceipt.getContainerCodeTypeNo());
            receiptContainerHeader.setTaskType(QuantityConstant.TASK_TYPE_WHOLERECEIPT);
//            receiptContainerHeader.setToLocation(locationCode);
            receiptContainerHeader.setCreatedBy(ShiroUtils.getLoginName());
            receiptContainerHeader.setLastUpdatedBy(ShiroUtils.getLoginName());
            receiptContainerHeader.setTaskNo(mesReceipt.getTaskNo());
            receiptContainerHeader.setToPort(mesReceipt.getToPort());
            receiptContainerHeader.setOrderCode(mesReceipt.getOrderCode());
            receiptContainerHeader.setVehicleTypeCode(mesReceipt.getVehicleTypeCode());
            receiptContainerHeader.setVehicleCode(mesReceipt.getVehicleCode());
            if (!receiptContainerHeaderService.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 = receiptContainerHeaderService.list(lambda);
        List<MaterialData> materialData = mesReceipt.getMaterialData();
        if (!mesReceipt.getOrderCode().isEmpty()){
            /* 更新入库单详情的收货数量*/
            //通过工单查询入库单
            LambdaQueryWrapper<ReceiptHeader> wrapper = Wrappers.lambdaQuery();
            wrapper.eq(ReceiptHeader::getReferCode, mesReceipt.getOrderCode());
            ReceiptHeader receiptHeader = receiptHeaderService.getOne(wrapper);
            //入库单ID查询入库单详情
            LambdaQueryWrapper<ReceiptDetail> wrapper1 = Wrappers.lambdaQuery();
            wrapper1.eq(ReceiptDetail::getReceiptId, receiptHeader.getId());
            List<ReceiptDetail> receiptDetailList = receiptDetailService.list(wrapper1);
            //入库单详情的物料条码比较物料入库的物料条码
            for (ReceiptDetail receiptDetail : receiptDetailList) {
                for (MaterialData materialDatum : materialData) {
                    if (materialDatum.getMaterialCode().equals(receiptDetail.getMaterialCode())){
                        receiptDetail.setTaskQty(receiptDetail.getQty().add(receiptDetail.getTaskQty()));
                        //更新入库单详情的收货数量
                        if (!receiptDetailService.updateById(receiptDetail)){
                            throw new ServiceException("更新入库单详情失败");
                        }
                        //如果单据数量等于已收数量,更新入库详情状态和入库单状态
                        if (receiptDetail.getQty().compareTo(receiptDetail.getTaskQty()) == 0){
                            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());
                    }
                }
            }
        }
        ReceiptContainerHeader header = receiptContainerHeaders.get(0);
        List<ReceiptContainerDetail> detailList = new ArrayList<>();
        //出库组盘详情
        for (MaterialData data : materialData) {
            Material material = materialService.getMaterialByCode(data.getMaterialCode(), QuantityConstant.DEFAULT_WAREHOUSE);
            ReceiptContainerDetail receiptContainerDetail = new ReceiptContainerDetail();
            receiptContainerDetail.setReceiptContainerId(header.getId());
            receiptContainerDetail.setWarehouseCode(ShiroUtils.getWarehouseCode());
            //物料入库根据orderCode查询入库单详情
            if (!mesReceipt.getOrderCode().isEmpty()){
                LambdaQueryWrapper<ReceiptHeader> receiptHeaderLambda = Wrappers.lambdaQuery();
                receiptHeaderLambda.eq(ReceiptHeader::getReferCode, mesReceipt.getOrderCode());
                ReceiptHeader receiptHeader = receiptHeaderService.getOne(receiptHeaderLambda);
                LambdaQueryWrapper<ReceiptDetail> wrapper = Wrappers.lambdaQuery();
                wrapper.eq(ReceiptDetail::getReceiptId, receiptHeader.getId())
                       .eq(ReceiptDetail::getMaterialCode, data.getMaterialCode());
                ReceiptDetail receiptDetail = receiptDetailService.getOne(wrapper);
                receiptContainerDetail.setReceiptId(receiptDetail.getReceiptId());
                receiptContainerDetail.setReceiptDetailId(receiptDetail.getId());
                receiptContainerDetail.setReceiptCode(receiptDetail.getReceiptCode());
                receiptContainerDetail.setReceiptType(receiptHeader.getReceiptType());
                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.setLocationNoX(data.getLocationNoX());
            receiptContainerDetail.setLocationNoY(data.getLocationNoY());
            receiptContainerDetail.setIsMaterial(data.getIsMaterial());
            receiptContainerDetail.setTracingNo(data.getTracingNo());
            receiptContainerDetail.setQualityStatus(data.getQualityStatus());
            receiptContainerDetail.setTaskType(receiptContainerHeader.getTaskType());
//                receiptContainerDetail.setLocationCode(locationCode);
            receiptContainerDetail.setContainerCode(mesReceipt.getContainerCode());
            receiptContainerDetail.setContainerType(mesReceipt.getContainerCodeTypeNo());
            receiptContainerDetail.setCompanyCode(QuantityConstant.DEFAULT_COMPANY_CODE);
            receiptContainerDetail.setMaterialCode(data.getMaterialCode());
            receiptContainerDetail.setMaterialName(material.getName());
            receiptContainerDetail.setMaterialSpec(material.getSpec());
            receiptContainerDetail.setMaterialUnit(material.getUnit());
            receiptContainerDetail.setQty(data.getQty());
            receiptContainerDetail.setInventorySts(QuantityConstant.GOOD);
            receiptContainerDetail.setCreatedBy(ShiroUtils.getLoginName());
            receiptContainerDetail.setLastUpdatedBy(ShiroUtils.getLoginName());
            detailList.add(receiptContainerDetail);
        }
        if (!receiptContainerDetailService.saveBatch(detailList)) {
            throw new ServiceException("保存入库组盘详情失败");
        }
        return AjaxResult.success("组盘成功");
    }

    @Override
    public AjaxResult searchInventory(MesSearch mesSearch) {
        LambdaQueryWrapper<InventoryDetail> inventoryDetailLambdaQueryWrapper = Wrappers.lambdaQuery();
        inventoryDetailLambdaQueryWrapper.eq(InventoryDetail::getOrderCode, mesSearch.getOrderCode())
//                                        .ne(InventoryDetail::availableQty, BigDecimal.ZERO)
                .eq(InventoryDetail::getMaterialCode, mesSearch.getMaterialCode());
        List<InventoryDetail> inventoryDetailList = inventoryDetailService.list(inventoryDetailLambdaQueryWrapper);
        if(inventoryDetailList.size() == 0) {
            mesSearch.setAvailableQty(BigDecimal.ZERO);
            return AjaxResult.success(mesSearch);
        }
        BigDecimal availableQty = inventoryDetailList.stream()
                .map(InventoryDetail::availableQty).reduce(BigDecimal.ZERO,BigDecimal::add);
        mesSearch.setAvailableQty(availableQty);
        return AjaxResult.success(mesSearch);
    }


}