ActivationAttributeManagerImpl.java

package com.mycim.server.spec.manager.impl;

import com.mycim.framework.utils.beans.BeanUtils;
import com.mycim.framework.utils.lang.collections.CollectionUtils;
import com.mycim.server.spec.dao.ActivationAttributeDao;
import com.mycim.server.spec.manager.*;
import com.mycim.valueobject.Pair;
import com.mycim.valueobject.prp.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.lang.Override;
import java.util.ArrayList;
import java.util.List;

/**
 * @author Qiansheng.Wang
 * @since 2020-10-26
 */
@Service
@Transactional
public class ActivationAttributeManagerImpl implements ActivationAttributeManager {

    @Autowired
    ActivationAttributeDao activationAttributeDao;

    @Autowired
    ProductSpecInfoManager productSpecInfoManager;

    @Autowired
    ProcessSpecItemManager processSpecItemManager;

    @Autowired
    ProductAttributeItemManager productAttributeItemManager;

    /**
     * 更新PRO_CONTEXT_ACTIVE_DTL中间表内容
     * @param processRrn
     * @param processVersion
     */
    @Override
    public void saveActivationAttributes(Long processRrn, Integer processVersion) {
        List<ProductSpecInfo> productSpecInfos = productSpecInfoManager.getProductSpecInfos(processRrn, processVersion);
        List<ProcessSpecItem> processSpecItems = processSpecItemManager.getProcessSpecItems(processRrn, processVersion);
        List<ProductAttributeItem> productAttributeItems = productAttributeItemManager
                .getProductAttributeItems(processRrn, processVersion);

        List<ProductSpecItem> activationAttributes = new ArrayList<>();

        for (ProductSpecInfo productSpecInfo : productSpecInfos) {
            for (ProcessSpecItem processSpecItem : processSpecItems) {
                activationAttributes
                        .add(buildActivationAttribute(productSpecInfo, processSpecItem, productAttributeItems));
            }
        }

        activationAttributeDao.delete(productSpecInfos);
        activationAttributeDao.insert(activationAttributes);
    }

    @Override
    public List<ProductSpecItem> getActiveProductSpec(Long productRrn, Integer productVersion, Long processRrn,
                                                      Integer processVersion) {
        ProductSpecItem productSpecItem = new ProductSpecItem();

        productSpecItem.setProductRrn(productRrn);
        productSpecItem.setProductVersion(productVersion);
        productSpecItem.setProcessRrn(processRrn);
        productSpecItem.setProcessVersion(processVersion);

        return getActiveProductSpec(productSpecItem);
    }

    @Override
    public List<ProductSpecItem> getActiveProductSpec(Long processRrn, Integer processVersion) {
        ProductSpecItem productSpecItem = new ProductSpecItem();

        productSpecItem.setProcessRrn(processRrn);
        productSpecItem.setProcessVersion(processVersion);

        return getActiveProductSpec(productSpecItem);
    }

    private List<ProductSpecItem> getActiveProductSpec(ProductSpecItem productSpecItem) {
        List<ProductSpecItem> productSpecItems = activationAttributeDao.getActiveProductSpec(productSpecItem);
        if (CollectionUtils.isEmpty(productSpecItems)) {
            return new ArrayList<>();
        }
        return productSpecItems;
    }

    private ProductSpecItem buildActivationAttribute(ProductSpecInfo productSpecInfo, ProcessSpecItem processSpecItem,
                                                     List<ProductAttributeItem> productAttributeItems) {
        ProductSpecItem productSpecItem = new ProductSpecItem();

        BeanUtils.copyProperties(processSpecItem, productSpecItem);

        productSpecItem.setProductRrn(productSpecInfo.getProductRrn());
        productSpecItem.setProductId(productSpecInfo.getProductId());
        productSpecItem.setProductVersion(productSpecInfo.getProductVersion());

        Pair<Long, String> pair = getAttributeRrnAndNamePair(productAttributeItems, productSpecItem,
                                                             processSpecItem.getRecipeRrn(),
                                                             processSpecItem.getRecipeId());

        productSpecItem.setRecipeRrn(pair.getKey());
        productSpecItem.setRecipeId(pair.getValue());

        pair = getAttributeRrnAndNamePair(productAttributeItems, productSpecItem, processSpecItem.getReticleFamilyRrn(),
                                          processSpecItem.getReticleFamilyId());

        productSpecItem.setReticleFamilyId(pair.getValue());
        productSpecItem.setReticleFamilyRrn(pair.getKey());

        pair = getAttributeRrnAndNamePair(productAttributeItems, productSpecItem, processSpecItem.getParameterSetRrn(),
                                          processSpecItem.getParameterSetId());

        productSpecItem.setParameterSetId(pair.getValue());
        productSpecItem.setParameterSetRrn(pair.getKey());

        return productSpecItem;
    }

    /**
     * Use check logic to get attribute RRN and ID (name)
     *
     * @param productAttributeItems Source value
     * @param productSpecItem       target value
     * @param attributeNameRrn      instance RRN
     * @param attributeName         instance ID
     * @return One pair, the key is the instance RRN, and the value is the instance ID
     */
    private Pair<Long, String> getAttributeRrnAndNamePair(List<ProductAttributeItem> productAttributeItems,
                                                          ProductSpecItem productSpecItem, Long attributeNameRrn,
                                                          String attributeName) {
        Pair<Long, String> pair = new Pair<>(attributeNameRrn, attributeName);

        if (attributeNameRrn != null && attributeNameRrn > 0 && ProductVariableEnum.isVariable(attributeName)) {
            ProductAttributeItem productAttributeItem = new ProductAttributeItem();

            BeanUtils.copyProperties(productSpecItem, productAttributeItem);

            productAttributeItem.setAttributeName(attributeName);
            productAttributeItem.setAttributeNameRrn(attributeNameRrn);

            String attributeValue = null;
            Long attributeValueRrn = null;

            int index = productAttributeItems.indexOf(productAttributeItem);
            if (index >= 0) {
                productAttributeItem = productAttributeItems.get(index);
                attributeValue = productAttributeItem.getAttributeValue();
                attributeValueRrn = productAttributeItem.getAttributeValueRrn();
            }

            pair = new Pair<>(attributeValueRrn, attributeValue);
        }
        return pair;
    }

}