ReceiptApiService.java 15.2 KB
package com.huaheng.api.general.service;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.huaheng.api.general.domain.ReceiptDomain;
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.FilterConfigDetail.service.FilterConfigDetailService;
import com.huaheng.pc.config.company.service.CompanyService;
import com.huaheng.pc.config.material.domain.Material;
import com.huaheng.pc.config.material.service.MaterialService;
import com.huaheng.pc.config.receiptType.domain.ReceiptType;
import com.huaheng.pc.config.receiptType.service.ReceiptTypeService;
import com.huaheng.pc.config.statusFlow.service.StatusFlowHeaderService;
import com.huaheng.pc.config.supplier.service.SupplierService;
import com.huaheng.pc.config.warehouse.service.WarehouseService;
import com.huaheng.pc.receipt.receiptDetail.domain.ReceiptDetail;
import com.huaheng.pc.receipt.receiptDetail.service.ReceiptDetailService;
import com.huaheng.pc.receipt.receiptDetailHistory.domain.ReceiptDetailHistory;
import com.huaheng.pc.receipt.receiptDetailHistory.service.ReceiptDetailHistoryService;
import com.huaheng.pc.receipt.receiptHeader.domain.ReceiptHeader;
import com.huaheng.pc.receipt.receiptHeader.service.ReceiptHeaderService;
import com.huaheng.pc.receipt.receiptHeaderHistory.domain.ReceiptHeaderHistory;
import com.huaheng.pc.receipt.receiptHeaderHistory.service.ReceiptHeaderHistoryService;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;

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

@Component
@Transactional
public class ReceiptApiService {
    @Resource
    private ReceiptHeaderService receiptHeaderService;
    @Resource
    private ReceiptDetailService receiptDetailService;
    @Resource
    private ReceiptTypeService receiptTypeService;
    @Resource
    private WarehouseService warehouseService;
    @Resource
    private CompanyService companyService;
    @Resource
    private MaterialService materialService;
    @Resource
    private SupplierService supplierService;
    @Resource
    private FilterConfigDetailService filterConfigDetailService;
    @Resource
    private StatusFlowHeaderService statusFlowHeaderService;
    @Resource
    private ReceiptHeaderHistoryService receiptHeaderHistoryService;
    @Resource
    private ReceiptDetailHistoryService receiptDetailHistoryService;

    /**
     * 入库单下发
     *
     * @param receipt 入库单
     * @return 是否下发成功
     */
    @Transactional(rollbackFor = Exception.class)
    public AjaxResult receipt(ReceiptDomain receipt) {

        /* 0.step 获取入库头表,获取入库明细*/
        ReceiptHeader receiptHeader = receipt.getReceiptHeader();
        List<ReceiptDetail> receiptDetails = receipt.getReceiptDetails();
        /* 1.step 校验入库单是否为空*/
        if (receiptHeader == null || receiptDetails == null) {
            return AjaxResult.error("入库主单或入库子单为空");
        }
        if(receiptDetails.isEmpty()) {
            return AjaxResult.error("入库子单为空");
        }
        //String receiptCode = receiptHeaderService.createCode(receiptHeader.getReceiptType());
        receiptHeader.setCode(receiptHeader.getReferCode());
        String name="";
        if (receiptHeader.getCreatedBy().trim().length()!=0) {
            name=":"+receiptHeader.getCreatedBy();
        }
        receiptHeader.setCreatedBy(QuantityConstant.PLATFORM_ERP+name);//ERP
        receiptHeader.setFirstStatus(QuantityConstant.RECEIPT_HEADER_BUILD);//新建
        receiptHeader.setLastStatus(QuantityConstant.RECEIPT_HEADER_BUILD);//新建

        // todo 供应商   ,是否管控用String?
        if (StringUtils.isNotEmpty(receiptHeader.getReceiptNote())) {
            receiptHeader.setReceiptNote(receiptHeader.getReceiptNote());
        }
        if (StringUtils.isNotEmpty(receiptHeader.getContainerCode())) {
            receiptHeader.setContainerCode(receiptHeader.getContainerCode());
        }
        if (StringUtils.isNotEmpty(receiptHeader.getManage())) {
            receiptHeader.setManage(receiptHeader.getManage());
        }
        if (StringUtils.isNotEmpty(receiptHeader.getSupplierCode())) {
            receiptHeader.setSupplierCode(receiptHeader.getSupplierCode());
        }

        receiptHeader.setWarehouseCode("CS0001");
        receiptHeader.setCompanyCode("BHF");
        /* 2.step 检查入库头表合法性*/
        AjaxResult ajaxResult = checkReceiptHeader(receiptHeader);
        if (ajaxResult.hasErr()) {
            return AjaxResult.error(ajaxResult.getMsg());
        }
        /* 3.step 检查入库明细合法性*/
        AjaxResult checkReceiptDetailResult = checkReceiptDetail(receiptDetails);
        if (checkReceiptDetailResult.hasErr()) {
            return AjaxResult.error(checkReceiptDetailResult.getMsg());
        }

        /* 4.step 计算入库明细总行数、总数量*/
        BigDecimal totalQty = new BigDecimal(0);
        for (ReceiptDetail receiptDetail : receiptDetails) {
            totalQty = totalQty.add(receiptDetail.getQty());
        }
        receiptHeader.setTotalLines(receiptDetails.size());
        receiptHeader.setTotalQty(totalQty);

        try {
            receiptHeaderService.save(receiptHeader);
        } catch (Exception e) {
            return AjaxResult.error(e.getMessage());
        }

        /* 6.step 保存入库明细*/
        receiptHeader = receiptHeaderService.getOne(new LambdaQueryWrapper<ReceiptHeader>().eq(ReceiptHeader::getCode, receiptHeader.getCode()));
        List<ReceiptDetail> receiptDetailList = new ArrayList<>();
        for (ReceiptDetail receiptDetail : receiptDetails) {
            receiptDetail.setReceiptId(receiptHeader.getId());
            receiptDetail.setReceiptCode(receiptHeader.getCode());
            receiptDetail.setWarehouseCode("CS0001");
            receiptDetail.setCompanyCode("BHF");
            if (StringUtils.isNotEmpty((receiptDetail.getBatch()))) {
                receiptDetail.setBatch(receiptDetail.getBatch());
            }
            if (StringUtils.isNotEmpty((receiptDetail.getLabelCode()))) {
                receiptDetail.setBatch(receiptDetail.getLabelCode());
            }
            Material material = materialService.getOne(new LambdaQueryWrapper<Material>().eq(Material::getCode,receiptDetail.getMaterialCode()));
            receiptDetail.setMaterialName(material.getName());
            receiptDetail.setMaterialSpec(material.getSpec());
            receiptDetail.setMaterialUnit(material.getUnit());
            receiptDetail.setMaterialCode(material.getCode());
            if (!receiptDetailService.save(receiptDetail)) {
                throw new ServiceException("保存入库明细失败");
            }
            receiptDetailList.add(receiptDetail);
        }
        /* 7.step回传入库单和入库明细单 */
        ReceiptDomain receiptDomain = new ReceiptDomain();
        receiptDomain.setReceiptHeader(receiptHeader);
        receiptDomain.setReceiptDetails(receiptDetailList);
        //return AjaxResult.success(receiptDomain);
        return AjaxResult.success();
    }

    /**
     * 检查入库头表合法性
     *
     * @param receiptHeader 入库头表
     * @return 检查结果
     */
    private AjaxResult checkReceiptHeader(ReceiptHeader receiptHeader) {
        /* 0.step 必填项是否为空*/
        if (StringUtils.isEmpty(receiptHeader.getReferCode()) ||  StringUtils.isEmpty(receiptHeader.getReceiptType())) {
            return AjaxResult.error("入库单号或入库单类型为空");
        }

        /* 1.step 查询该单据编码是否已存在*/
        if (receiptHeaderService.getOne(new LambdaQueryWrapper<ReceiptHeader>().eq(ReceiptHeader::getReferCode, receiptHeader.getReferCode()))!= null) {
            return AjaxResult.error("该单据已存在:" + receiptHeader.getReferCode());
        }

        /* 2.step 判断入库类型是否匹配*/
        if (receiptTypeService.getOne(new LambdaQueryWrapper<ReceiptType>().eq(ReceiptType::getCode, receiptHeader.getReceiptType())) == null) {
            return AjaxResult.error("没有对应的入库单类型");
        }

        /* 3.step 判断仓库是否存在*/
        //LambdaQueryWrapper<Warehouse> warehouseLambda = Wrappers.lambdaQuery();
        //warehouseLambda.eq(Warehouse::getCode, receiptHeader.getWarehouseCode());
        //if (warehouseService.getOne(warehouseLambda) == null) {
        //    return AjaxResult.error("该仓库不存在");
        //}

        /* 4.step 判断货主是否存在*/
        //LambdaQueryWrapper<Company> companyLambda = Wrappers.lambdaQuery();
        //companyLambda.eq(Company::getCode, receiptHeader.getCompanyCode());
        //if (companyService.getOne(companyLambda) == null) {
        //    return AjaxResult.error("该货主不存在");
        //}

        return AjaxResult.success("");
    }

    /**
     * 检查入库明细合法性
     *
     * @param receiptDetails 入库明细
     * @return 检查结果
     */
    private AjaxResult checkReceiptDetail(List<ReceiptDetail> receiptDetails) {

        for (ReceiptDetail receiptDetail : receiptDetails) {
            /* 0.step 判断必填字段是否为空且总数量不能为0*/
            if (receiptDetail.getMaterialCode() == null ||
                    new BigDecimal(0).compareTo(receiptDetail.getQty() != null ?
                            receiptDetail.getQty() : new BigDecimal(0)) == 0) {
                return AjaxResult.error("入库明细字段有误,MaterialCode或qty");
            }

            /* 1.step 判断供应商是否存在*/
            //if (StringUtils.isNotEmpty(receiptDetail.getSupplierCode())) {
            //    LambdaQueryWrapper<Supplier> supplierLambda = Wrappers.lambdaQuery();
            //    supplierLambda.eq(Supplier::getCode, receiptDetail.getSupplierCode());
            //    if (supplierService.getOne(supplierLambda) == null) {
            //        return AjaxResult.error("供应商不存在");
            //    }
            //}

            String materialCode = receiptDetail.getMaterialCode();
            if(materialService.getOne(new LambdaQueryWrapper<Material>().eq(Material::getCode,materialCode)) == null) {
                return AjaxResult.error(materialCode + "WMS不存在此物料:",materialCode);
            }
        }

        return AjaxResult.success("");
    }


    @Transactional
    public AjaxResult remove(List<String> receiptCodeList) {
        LambdaQueryWrapper<ReceiptHeader> headerQueryWrapper;
        for (String receiptCode : receiptCodeList) {
            headerQueryWrapper = Wrappers.lambdaQuery();
            headerQueryWrapper.eq(ReceiptHeader::getCode,receiptCode);
            ReceiptHeader receiptHeader = receiptHeaderService.getOne(headerQueryWrapper);
            if (receiptHeader == null) {
                return AjaxResult.success("");
            }
            if ((receiptHeader.getFirstStatus() >= QuantityConstant.RECEIPT_HEADER_POSTING && receiptHeader.getLastStatus() >= QuantityConstant.RECEIPT_HEADER_POSTING) ||
                    (receiptHeader.getFirstStatus() < QuantityConstant.RECEIPT_HEADER_POOL & receiptHeader.getLastStatus() < QuantityConstant.RECEIPT_HEADER_POOL)) {
                ReceiptHeaderHistory receiptHeaderHistory = new ReceiptHeaderHistory();
                List<ReceiptDetailHistory> receiptDetailHistoryList = new ArrayList<>();
                //查询入库单明细
                LambdaQueryWrapper<ReceiptDetail> lambdaQueryWrapper = Wrappers.lambdaQuery();
                lambdaQueryWrapper.eq(ReceiptDetail::getReceiptCode, receiptCode);
                List<ReceiptDetail> list = receiptDetailService.list(lambdaQueryWrapper);

                //复制到入库历史实体
                com.huaheng.common.utils.bean.BeanUtils.copyBeanProp(receiptHeaderHistory, receiptHeader);
                for (ReceiptDetail receiptDetail : list) {
                    ReceiptDetailHistory receiptDetailHistory = new ReceiptDetailHistory();
                    com.huaheng.common.utils.bean.BeanUtils.copyBeanProp(receiptDetailHistory, receiptDetail);
                    receiptDetailHistoryList.add(receiptDetailHistory);
                }


                receiptHeaderHistory.setLastUpdatedBy(ShiroUtils.getName());
                if (!receiptHeaderService.removeById(receiptHeader.getId())) {
                    throw new ServiceException("删除头表失败");
                }
                if (!receiptHeaderHistoryService.save(receiptHeaderHistory)) {
                    throw new ServiceException("新增历史入库单失败");
                }
                // 当存在明细时删除
                if (list.size() != 0) {
                    //删除入库明细
                    List<Integer> receiptDetailIds = new ArrayList<>();
                    for (int i = 0; i < receiptDetailHistoryList.size(); i++) {
                        receiptDetailHistoryList.get(i).setLastUpdatedBy(ShiroUtils.getName());
                        receiptDetailHistoryList.get(i).setReceiptId(receiptHeaderHistory.getId());
                        receiptDetailIds.add(receiptDetailHistoryList.get(i).getId());
                    }
                    if (!receiptDetailService.removeByIds(receiptDetailIds)) {
                        throw new ServiceException("删除明细表失败");
                    }
                    if (!receiptDetailHistoryService.saveBatch(receiptDetailHistoryList)) {
                        throw new ServiceException("新增明细失败");
                    }
                }
            } else {
                return AjaxResult.success("入库单没有完成,无法删除");
            }
        }
        return AjaxResult.success("删除成功");
    }

    public AjaxResult search(String receiptCode, String companyCode, String warehouseCode) {
        if (companyCode == null) {
            return AjaxResult.error("货主编码不能为空");
        }
        if (warehouseCode == null) {
            return AjaxResult.error("仓库编码不能为空");
        }
        ReceiptDomain receiptDomain = new ReceiptDomain();
        LambdaQueryWrapper<ReceiptHeader> headerLambdaQuery = Wrappers.lambdaQuery();
        LambdaQueryWrapper<ReceiptDetail> detailLambdaQuery = Wrappers.lambdaQuery();
        headerLambdaQuery.eq(ReceiptHeader::getWarehouseCode, warehouseCode)
                .eq(ReceiptHeader::getCompanyCode, companyCode)
                .eq(ReceiptHeader::getCode, receiptCode);
        detailLambdaQuery.eq(ReceiptDetail::getWarehouseCode, warehouseCode)
                .eq(ReceiptDetail::getCompanyCode, companyCode)
                .eq(ReceiptDetail::getReceiptCode, receiptCode);
        ReceiptHeader receiptHeader = receiptHeaderService.getOne(headerLambdaQuery);
        List<ReceiptDetail> receiptDetailList = receiptDetailService.list(detailLambdaQuery);
        receiptDomain.setReceiptHeader(receiptHeader);
        receiptDomain.setReceiptDetails(receiptDetailList);
        return AjaxResult.success("查询成功", receiptDomain);
    }
}