MesServiceImpl.java 17.5 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.dto.Detail;
import com.huaheng.api.mes.dto.Header;
import com.huaheng.api.mes.dto.ReceiptDTO;
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.domain.RetCode;
import com.huaheng.pc.config.material.domain.Material;
import com.huaheng.pc.config.material.service.MaterialService;
import com.huaheng.pc.inventory.inventoryDetail.service.InventoryDetailService;
import com.huaheng.pc.inventory.inventoryTransaction.service.InventoryTransactionService;
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.taskDetail.service.TaskDetailService;
import org.apache.poi.ss.formula.functions.T;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

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

@Service
public class MesServiceImpl implements IMesService {

    @Resource
    private ReceiptHeaderService receiptHeaderService;

    @Resource
    private ReceiptDetailService receiptDetailService;

    @Resource
    private ShipmentHeaderService shipmentHeaderService;

    @Resource
    private ShipmentDetailService shipmentDetailService;

    @Resource
    private InventoryDetailService inventoryDetailService;

    @Resource
    private TaskDetailService taskDetailService;

    @Resource
    private InventoryTransactionService inventoryTransactionService;

    @Resource
    private MaterialService materialService;

    @Override
    @Transactional(rollbackFor = Exception.class)
    public AjaxResult receipt(ReceiptDTO receiptDTO) {
        Header header = receiptDTO.getShipmentHeader();
        List<Detail> details = receiptDTO.getShipemtnDetails();

        AjaxResult ajaxResult = new AjaxResult();
        boolean isNull = enterIsNull(ajaxResult, header, details);
        if (isNull){
            return ajaxResult;
        }

        ReceiptHeader receiptHeader = new ReceiptHeader();
        if(StringUtils.isNotEmpty(header.getMOMID())){
            receiptHeader.setMOMID(header.getMOMID());
        }
        receiptHeader.setCode(header.getReferCode());
        // 入库类型--需要保持一致
        receiptHeader.setReceiptType(header.getRefeCodeType());
        // receiptHeader.setReceiptType("CS");
        receiptHeader.setTotalQty(header.getTotalQty());
        receiptHeader.setTotalLines(details.size());
        // TAID MOM目标类型 // FAID MOM来源类型
        receiptHeader.setTAID(header.getTAID());
        receiptHeader.setFAID(header.getFAID());
        receiptHeader.setProductionWorker(header.getProductionWorker());
        receiptHeader.setWarehouse(header.getWarehouse());
        receiptHeader.setFirstStatus(QuantityConstant.RECEIPT_HEADER_BUILD);
        receiptHeader.setLastStatus(QuantityConstant.RECEIPT_HEADER_BUILD);
        receiptHeader.setWarehouseCode("CS0001");
        receiptHeader.setCompanyCode("BHF");
        receiptHeader.setCreatedBy("MOM");

        boolean success = receiptHeaderService.save(receiptHeader);
        if(!success) {
            throw new ServiceException("生成入库单头失败");
        }
        List<ReceiptDetail> shipemtnDetailList = new ArrayList<>();
        for(Detail detail : details) {
            ReceiptDetail receiptDetail = new ReceiptDetail();
            // 查询入库单据表头
            LambdaQueryWrapper<Material> materialQueryWrapper = Wrappers.lambdaQuery();
            materialQueryWrapper.eq(Material::getCode, detail.getMaterialCode());
            Material material = materialService.getOne(materialQueryWrapper);
            if(StringUtils.isNotEmpty(detail.getDetailID())){
                receiptDetail.setMOMID(detail.getDetailID());
            }
            receiptDetail.setIsVirtualBom(detail.getIsVirtual());
            receiptDetail.setMaterialCode(detail.getMaterialCode());
            receiptDetail.setMaterialName(detail.getMaterialName());
            receiptDetail.setMaterialSpec(material == null ? null : material.getSpec());
            receiptDetail.setQty(detail.getQty());
            receiptDetail.setIsUrgent(detail.getIsUrgent());
            receiptDetail.setNoticeNo(detail.getNoticeNo());
            receiptDetail.setSNNO(detail.getSNNO());
            receiptDetail.setReceiptBarcode(detail.getReceiptBarcode());
            receiptDetail.setReceiptId(receiptHeader.getId());
            receiptDetail.setReceiptCode(receiptHeader.getCode());
            receiptDetail.setStatusFlowCode("2");
            receiptDetail.setWarehouseCode("CS0001");
            receiptDetail.setCompanyCode("BHF");
            receiptDetail.setInventorySts("good");
            receiptDetail.setCreatedBy("MOM");
            shipemtnDetailList.add(receiptDetail);
        }
        success = receiptDetailService.saveBatch(shipemtnDetailList);
        if(!success) {
            throw new ServiceException("生成入库单详情失败");
        }
        return AjaxResult.success(receiptDTO);
    }

    @Override
    @Transactional(rollbackFor = Exception.class)
    public AjaxResult shipment(ReceiptDTO receiptDTO) {
        Header header = receiptDTO.getShipmentHeader();
        List<Detail> details = receiptDTO.getShipemtnDetails();

        AjaxResult ajaxResult = new AjaxResult();
        boolean inNull = enterIsNull(ajaxResult, header, details);
        if (inNull){
            return ajaxResult;
        }

        ShipmentHeader shipmentHeader = new ShipmentHeader();
        // shipmentHeader.setId(header.getId());
        if(StringUtils.isNotEmpty(header.getMOMID())) {
            shipmentHeader.setMOMID(header.getMOMID());
        }
        shipmentHeader.setCode(header.getReferCode());
        // 出库类型--需要保持一致
        shipmentHeader.setShipmentType(header.getRefeCodeType());
        shipmentHeader.setTotalQty(header.getTotalQty());
        // TAID MOM目标类型 // FAID MOM来源类型
        shipmentHeader.setTAID(header.getTAID());
        shipmentHeader.setFAID(header.getFAID());
        shipmentHeader.setNoticeNo(details.get(0).getNoticeNo());
        shipmentHeader.setWorkshop(header.getWorkshop());
        shipmentHeader.setWarehouse(header.getWarehouse());
        shipmentHeader.setSuperiorCode(header.getSuperiorCode());
        shipmentHeader.setSuperiorName(header.getSuperiorName());
        shipmentHeader.setRequestedDeliveryDate(header.getRequestedDeliveryDate());
        shipmentHeader.setFirstStatus(QuantityConstant.SHIPMENT_CONTAINER_BUILD);
        shipmentHeader.setLastStatus(QuantityConstant.SHIPMENT_CONTAINER_BUILD);
        shipmentHeader.setTotalLines(details.size());
        shipmentHeader.setWarehouseCode("CS0001");
        shipmentHeader.setCompanyCode("BHF");
        shipmentHeader.setCreatedBy("MOM");
        boolean success = shipmentHeaderService.save(shipmentHeader);
        if(!success) {
            throw new ServiceException("生成出库单头失败");
        }
        List<ShipmentDetail> shipmentDetailList = new ArrayList<>();
        details.forEach(detail->{
            ShipmentDetail shipmentDetail = new ShipmentDetail();
            if(StringUtils.isNotEmpty(detail.getDetailID())){
                shipmentDetail.setMOMID(detail.getDetailID());
            }
            shipmentDetail.setMaterialCode(detail.getMaterialCode());
            shipmentDetail.setMaterialName(detail.getMaterialName());
            shipmentDetail.setPort(detail.getEndSation());
            shipmentDetail.setQty(detail.getQty());
            shipmentDetail.setIsUrgent(detail.getIsUrgent());
            shipmentDetail.setNoticeNo(detail.getNoticeNo());
            shipmentDetail.setSNNO(detail.getSNNO());

            shipmentDetail.setShipmentId(shipmentHeader.getId());
            shipmentDetail.setShipmentCode(shipmentHeader.getCode());
            shipmentDetail.setCompanyCode("BHF");
            shipmentDetail.setWarehouseCode("CS0001");
            shipmentDetail.setInventorySts("good");
            shipmentDetail.setStatus(QuantityConstant.TASK_STATUS_BUILD);
            shipmentDetail.setCreatedBy("MOM");
            shipmentDetailList.add(shipmentDetail);
        });
        success = shipmentDetailService.saveBatch(shipmentDetailList);
        if(!success) {
            throw new ServiceException("生成出库单详情失败");
        }
        return AjaxResult.success(receiptDTO);
    }

    @Override
    @Transactional(rollbackFor = Exception.class)
    public AjaxResult cancelEnterWarehouse(ReceiptDTO receiptDTO) {
        Header header = receiptDTO.getShipmentHeader();
        List<Detail> details = receiptDTO.getShipemtnDetails();

        if (StringUtils.isEmpty(header.getReferCode())){
            return AjaxResult.error().setMsg("单据单号不能为空!!!");
        }
        for (Detail detailIsNull:details){
            if(StringUtils.isEmpty(detailIsNull.getDetailID())){
                return AjaxResult.error().setMsg("单据明细ID不能为空!!!");
            }
        }

        // 查询入库单据表头
        LambdaQueryWrapper<ReceiptHeader> receiptHeaderWrapper = Wrappers.lambdaQuery();
        receiptHeaderWrapper.eq(ReceiptHeader::getId, header.getId());
        ReceiptHeader receiptHeader = receiptHeaderService.getById(receiptHeaderWrapper);
        if (receiptHeader == null) {
            return AjaxResult.error().setMsg("没有找到对应单据!!!");
        }
        // 查询入库单据明细
        LambdaQueryWrapper<ReceiptDetail> receiptDetailWrapper = Wrappers.lambdaQuery();
        receiptDetailWrapper.eq(ReceiptDetail::getReceiptId, receiptHeader.getId());

        List<ReceiptDetail> receiptDetailList = receiptDetailService.list(receiptDetailWrapper);
        if (receiptDetailList == null) {
            return AjaxResult.error().setMsg("没有找到对应单据明细!!!");
        }
        // 获取删除明细
        List<ReceiptDetail> removeReceiptDetails = new ArrayList<>();
        receiptDetailList.forEach(receiptDetail-> details.forEach(detail->{
            if (detail.getDetailID().equals(receiptDetail.getMOMID())){
                removeReceiptDetails.add(receiptDetail);
            }
        }));
        ArrayList<Integer> ids = new ArrayList<>();
        if (removeReceiptDetails.size() > 0){
            removeReceiptDetails.forEach(receiptDetail->{
                ids.add(receiptDetail.getId());
            });
        }
        if (ids.size() < 1 || removeReceiptDetails.size() < 1){
            return AjaxResult.error().setMsg("没有匹配到对应要取消的入库单单据明细!!!");
        }
        boolean success = receiptDetailService.removeByIds(ids);
        if(!success) {
            throw new ServiceException("删除入库单详情失败");
        }
        // 出库单明细数量和要删除的明细数量一致,则删除主表
        boolean isRemove = removeReceiptDetails.size() == receiptDetailList.size();
        if (isRemove){
            success = receiptHeaderService.removeById(receiptHeader.getId());
            if(!success) {
                throw new ServiceException("删除入库单失败");
            }
        }
        return AjaxResult.success("取消入库单成功");
    }

    @Override
    @Transactional(rollbackFor = Exception.class)
    public AjaxResult cancelOutWarehouse(ReceiptDTO receiptDTO) {
        Header header = receiptDTO.getShipmentHeader();
        List<Detail> details = receiptDTO.getShipemtnDetails();

        AjaxResult ajaxResult = isNull(header, details);
        if (StringUtils.isNotEmpty(ajaxResult.getMsg())){
            return ajaxResult;
        }

        // 查询出库单据表头
        LambdaQueryWrapper<ShipmentHeader> shipmentHeaderWrapper = Wrappers.lambdaQuery();
        shipmentHeaderWrapper.eq(ShipmentHeader::getCode, header.getSuperiorCode());
        ShipmentHeader shipmentHeader = shipmentHeaderService.getOne(shipmentHeaderWrapper);
        if (shipmentHeader == null) {
            return ajaxResult.setCode(RetCode.FAIL).setMsg("没有找到对应单据!!!");
        }
        // 查询出库单据明细
        LambdaQueryWrapper<ShipmentDetail> shipmentDetailWrapper = Wrappers.lambdaQuery();
        shipmentDetailWrapper.eq(ShipmentDetail::getShipmentId, header.getId());
        List<ShipmentDetail> shipmentDetailList = shipmentDetailService.list(shipmentDetailWrapper);
        if (shipmentDetailList == null) {
            return ajaxResult.setCode(RetCode.FAIL).setMsg("没有找到对应单据明细!!!");
        }
        // 获取删除明细
        List<ShipmentDetail> removeShipmentDetails = new ArrayList<>();
        shipmentDetailList.forEach(shipmentDetai-> details.forEach(detail->{
            if (detail.getMaterialCode().equals(shipmentDetai.getMaterialCode()) && detail.getTotalQty().intValue() == (shipmentDetai.getTaskQty().intValue())){
                removeShipmentDetails.add(shipmentDetai);
            }
        }));
        if (removeShipmentDetails.size() > 0){
            ArrayList<Integer> ids = new ArrayList<>();
            removeShipmentDetails.forEach(shipmentDetail-> ids.add(shipmentDetail.getId()));
            shipmentDetailService.removeByIds(ids);
        }else {
            return ajaxResult.setCode(RetCode.FAIL).setMsg("没有匹配到对应要取消的出库单单据明细!!!");
        }
        // 出库单明细数量和要删除的明细数量一致,则删除主表
        boolean isRemove = removeShipmentDetails.size() == shipmentDetailList.size();
        if (isRemove){
            shipmentHeaderService.removeById(shipmentHeader);
        }
        return AjaxResult.success("取消出库单成功");
    }


    /**
     * 出库单参数_判空处理
     * @param ajaxResult
     * @param shipmentHeader
     * @param shipemtnDetails
     */
    private boolean outIsNull (AjaxResult ajaxResult, Header shipmentHeader, List<Detail> shipemtnDetails){
        if (isNullData(ajaxResult, shipmentHeader, shipemtnDetails)){
            return true;
        }

        if (StringUtils.isEmpty(shipmentHeader.getReferCode())) {
            ajaxResult.setCode(RetCode.FAIL).setMsg("单据单号不能为空!!!");
            return true;
        }

        shipemtnDetails.forEach(shipemtnDetail->{
            if (StringUtils.isEmpty(shipemtnDetail.getMaterialCode())) {
                ajaxResult.setCode(RetCode.FAIL).setMsg("物料编码不能为空!!!");
            }
        });
        return StringUtils.isNotEmpty(ajaxResult.getMsg());
    }

    private AjaxResult isNull(Header header, List<Detail> details) {
        AjaxResult ajaxResult = new AjaxResult();
        boolean isNull = outIsNull(ajaxResult, header, details);
        details.forEach(detail -> {
            if (detail.getTotalQty() == null || detail.getTotalQty().intValue() <= 0) {
                ajaxResult.setCode(RetCode.FAIL).setMsg("总数量不能为空!!!");
            }
        });
        if (isNull || StringUtils.isNotEmpty(ajaxResult.getMsg())){
            return ajaxResult;
        }
        return ajaxResult;
    }

    /**
     * 入库单参数_判空处理
     * @param ajaxResult
     * @param shipmentHeader
     * @param shipemtnDetails
     */
    private boolean enterIsNull(AjaxResult ajaxResult, Header shipmentHeader, List<Detail> shipemtnDetails){

        if (isNullData(ajaxResult, shipmentHeader, shipemtnDetails)){
            return true;
        }

        if (StringUtils.isEmpty(shipmentHeader.getRefeCodeType())) {
            ajaxResult.setCode(RetCode.FAIL).setMsg("单据类型不能为空!!!");
            return true;
        } else if (StringUtils.isEmpty(shipmentHeader.getReferCode())) {
            ajaxResult.setCode(RetCode.FAIL).setMsg("单据单号不能为空!!!");
            return true;
        }else if (shipmentHeader.getTotalQty() == null || shipmentHeader.getTotalQty().intValue() <= 0) {
            ajaxResult.setCode(RetCode.FAIL).setMsg("数量不能为空!!!");
        }

        shipemtnDetails.forEach(shipemtnDetail->{
            if (StringUtils.isEmpty(shipemtnDetail.getMaterialCode())) {
                ajaxResult.setCode(RetCode.FAIL).setMsg("物料编码不能为空!!!");
            } else if (shipemtnDetail.getTotalQty() == null || shipemtnDetail.getQty().intValue() <= 0) {
                ajaxResult.setCode(RetCode.FAIL).setMsg("数量不能为空!!!");
            }
        });
        return StringUtils.isNotEmpty(ajaxResult.getMsg());
    }

    /**
     * 判空处理
     */
    private boolean isNullData(AjaxResult ajaxResult, Header shipmentHeader, List<Detail> shipemtnDetails) {
        if (shipmentHeader == null) {
            ajaxResult.setCode(RetCode.FAIL).setMsg("出库单头表不能为空!!!");
            return true;
        } else if (shipemtnDetails == null || shipemtnDetails.size() < 1) {
            ajaxResult.setCode(RetCode.FAIL).setMsg("出库单明细表集不能为空!!!");
            return true;
        }
        return false;
    }
}