MesServiceImpl.java 10.3 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.framework.web.domain.AjaxResult;
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.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;

    @Override
    @Transactional(rollbackFor = Exception.class)
    public AjaxResult receiptOrder(MesOrder mesOrder) {
        String orderCode = mesOrder.getOrderNo();
        String materialCode = mesOrder.getMaterialCode();
        String taskNo = mesOrder.getTaskNo();
        BigDecimal orderQty = mesOrder.getOrderQty();

        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.setReceiptType(receiptType);
        receiptHeader.setLastStatus(QuantityConstant.RECEIPT_HEADER_BUILD);
        receiptHeader.setLastStatus(QuantityConstant.RECEIPT_HEADER_BUILD);
        receiptHeader.setCreatedBy("MES");
        receiptHeader.setReferCode(orderCode);
        receiptHeader.setUserDef1(taskNo);
        boolean success = receiptHeaderService.save(receiptHeader);
        if(!success) {
            throw new ServiceException("保存入库单失败");
        }
        Material material = materialService.getMaterialByCode(materialCode, QuantityConstant.DEFAULT_WAREHOUSE);
        if(material == null) {
            throw new ServiceException("根据物料编码" + materialCode + " 没有找到对应物料信息");
        }
        ReceiptDetail receiptDetail = new ReceiptDetail();
        receiptDetail.setReceiptId(receiptHeader.getId());
        receiptDetail.setReceiptCode(receiptCode);
        receiptDetail.setWarehouseCode(QuantityConstant.DEFAULT_WAREHOUSE);
        receiptDetail.setQty(orderQty);
        receiptDetail.setMaterialCode(materialCode);
        receiptDetail.setMaterialName(material.getName());
        receiptDetail.setMaterialSpec(material.getSpec());
        receiptDetail.setMaterialUnit(material.getUnit());
        receiptDetail.setCreatedBy("MES");
        success = receiptDetailService.save(receiptDetail);
        if(!success) {
            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) {

        return null;
    }

    @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);
    }


}