ReceiptApiService.java 19.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.support.Convert;
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.location.service.LocationService;
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.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.controller.ReceiptContainerHeaderController;
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.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 com.huaheng.pc.task.taskDetail.service.TaskDetailService;
import com.huaheng.pc.task.taskHeader.controller.TaskHeaderController;
import com.huaheng.pc.task.taskHeader.domain.TaskHeader;
import com.huaheng.pc.task.taskHeader.service.ReceiptTaskService;
import com.huaheng.pc.task.taskHeader.service.TaskHeaderService;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.collections.Transformer;
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.Arrays;
import java.util.List;
import java.util.stream.Collectors;

@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;
    @Resource
    private ReceiptApiService receiptApiService;
    @Resource
    private ReceiptContainerDetailService receiptContainerDetailService;
    @Resource
    private ReceiptService receiptService;
    @Resource
    private LocationService locationService;
    @Resource
    private InventoryDetailService inventoryDetailService;
    @Resource
    private TaskHeaderService taskHeaderService;
    @Resource
    private ReceiptContainerHeaderService receiptContainerHeaderService;
    @Resource
    private ReceiptTaskService receiptTaskService;
    @Resource
    private TaskDetailService taskDetailService;
    @Resource
    private TaskHeaderController taskHeaderController;
    @Resource
    private ReceiptContainerHeaderController receiptContainerHeaderController;


    /**
     * 入库单下发
     *
     * @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());
        receiptHeader.setCreatedBy(QuantityConstant.PLATFORM_MES);//MES
        receiptHeader.setFirstStatus(QuantityConstant.RECEIPT_HEADER_BUILD);//新建
        receiptHeader.setLastStatus(QuantityConstant.RECEIPT_HEADER_BUILD);//新建

        if (StringUtils.isNotEmpty(receiptHeader.getContainerCode())) {
            receiptHeader.setContainerCode(receiptHeader.getContainerCode());
        }
        if (StringUtils.isNotEmpty(receiptHeader.getLine())) {
            receiptHeader.setLine(receiptHeader.getLine());
        }
        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());
        }

        /* 5.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");
            receiptDetail.setManage(receiptDetail.getManage());

            if (StringUtils.isNotEmpty(receiptDetail.getLabelCode())) {
                receiptDetail.setLabelCode(receiptDetail.getLabelCode());
            }
            if (StringUtils.isNotEmpty((receiptDetail.getBatch()))) {
                receiptDetail.setBatch(receiptDetail.getBatch());
            }

            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());
            receiptDetail.setInventorySts(QuantityConstant.GOOD);
            if (!receiptDetailService.save(receiptDetail)) {
                throw new ServiceException("保存入库明细失败");
            }
            receiptDetailList.add(receiptDetail);
        }

        /* 6.step 保存入库组盘*/
        for (ReceiptDetail detail : receiptDetails) {
            AjaxResult result = receiptContainerHeaderService.saveContainer(
                    receiptHeader.getCode(), receiptHeader.getContainerCode(),
                    detail.getId(), "", detail.getQty(), "");
            if (result.hasErr()) {
                return AjaxResult.error(result.getMsg());
            }
        }

        for (ReceiptDetail receiptDetail : receiptDetails) {
            //根据单据明细查到组盘明细
            ReceiptContainerDetail receiptContainerDetailOne = receiptContainerDetailService.getOne(new LambdaQueryWrapper<ReceiptContainerDetail>()
                    .eq(ReceiptContainerDetail::getReceiptDetailId, receiptDetail.getId()));

            //根据组盘明细的托盘,查到组盘头,且状态为0的
            LambdaQueryWrapper<ReceiptContainerHeader> receiptContainerHeaderLam = Wrappers.lambdaQuery();
            receiptContainerHeaderLam
                    .eq(ReceiptContainerHeader::getContainerCode, receiptContainerDetailOne.getContainerCode())
                    .eq(ReceiptContainerHeader::getStatus, 0);
            ReceiptContainerHeader receiptContainerHeaderOne = receiptContainerHeaderService.getOne(receiptContainerHeaderLam);
            if (receiptContainerHeaderOne == null) {
                continue;
            }
            List<ReceiptContainerHeader> list = receiptContainerHeaderService.list(receiptContainerHeaderLam);
            for (int j = 0; j < list.size(); j++) {
                /* 7.step 任务*/
                List<Integer> idList = Arrays.asList(Convert.toIntArray("" + list.get(j).getId()));
                List<Integer> idsList = idList.stream().distinct().collect(Collectors.toList());
                AjaxResult receiptTask = receiptTaskService.createReceiptTask(idsList);
                List<String> ids = (List<String>) receiptTask.getData();
                List<Integer> integerList = new ArrayList<>();
                CollectionUtils.collect(ids, new Transformer() {
                    @Override
                    public Object transform(Object o) {
                        return Integer.parseInt(o.toString());
                    }
                }, integerList);

                TaskHeader taskHeader = taskHeaderService.getById(integerList.toArray(new Integer[0])[0]);
                taskHeaderService.updateById(taskHeader);
                //taskHeaderService.sendTaskToWcs(integerList.toArray(new Integer[0]));
            }
        }

        /* 8.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);
    }
}