ComponentManagerImpl.java 6.2 KB
package com.myproject.manager.impl;

import com.google.common.base.Strings;
import com.google.common.collect.Lists;
import com.myproject.bean.search.PageList;
import com.myproject.bean.update.Barcode;
import com.myproject.bean.update.Component;
import com.myproject.bean.update.StoragePos;
import com.myproject.dao.mongo.IBarcodeDao;
import com.myproject.dao.mongo.IBomDao;
import com.myproject.dao.mongo.IComponentDao;
import com.myproject.dao.mongo.IStoragePosDao;
import com.myproject.exception.ValidateException;
import com.myproject.manager.IComponentManager;
import org.apache.commons.lang3.StringUtils;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * Created by kangmor on 2015/9/15.
 */
@Service
public class ComponentManagerImpl implements IComponentManager {

    @Autowired
    private IComponentDao componentDao;
    @Autowired
    private IBomDao bomDao;
    @Autowired
    private IBarcodeDao barcodeDao;

    @Autowired
    private IStoragePosDao storagePosDao;

    protected final transient Logger log = LogManager.getLogger(getClass());

    @Override
    public List findAll() {
        return componentDao.findAll();
    }

    @Override
    public Component findByPartNumber(String partNumber) {
        log.debug("Find component by partNumber " + partNumber);
        if (StringUtils.isEmpty(partNumber))
            return null;
        else return componentDao.findOneByCondition(new String[] {"partNumber"}, new String[] {partNumber});
    }

    @Override
    public Component findByPartNumberAndProvider(String partNumber, String provider){
        if(partNumber == null){
            return null;
        }
        Component component = componentDao.findOneByCondition(new String[] {"partNumber","provider"}, new String[] {partNumber, provider});
        if(provider == null && component == null){
            //再查一下空字符串的
            component = componentDao.findOneByCondition(new String[] {"partNumber","provider"}, new String[] {partNumber, ""});
        }
        return component;
    }

    @Override
    public PageList findByQuery(Query query, PageList pageList)
    {

        log.debug("Search components with Query " + query.toString());
        pageList.setList(componentDao.findByQuery(query, pageList.getPageNumber(), pageList.getObjectsPerPage()));
        pageList.setFullListSize(componentDao.countByQuery(query));
        log.debug("Search returns " + pageList.getFullListSize() + " components");
        return pageList;
    }

    @Override
    public List<Component> findByType(int type){
        return componentDao.findByType(type);
    }

    public Component get(String id) {
        return componentDao.findOneById(id);
    }


    public Component save(Component component) throws ValidateException{
        String partNumber = component.getPartNumber();
        Component dbComponent = findByPartNumberAndProvider(partNumber, component.getProvider());
        boolean needUpdateSize = false;
        if(dbComponent != null){
            //数据库中已存在,但不是更新(要保存的没有 ID,或者有 ID但与数据库中的 ID不一致)
            if(Strings.isNullOrEmpty(component.getId())  || !dbComponent.getId().equals(component.getId()) ){
                throw new ValidateException("component.partNumber.exist");
            }
            int dbW = dbComponent.getPlateSize();
            int dbH = dbComponent.getHeight();
            if(dbW != component.getPlateSize() || dbH != component.getHeight()){
                needUpdateSize = true;
            }
        }
        String name = component.getName();
        if(name == null || name.isEmpty()){
            component.setName(partNumber);
        }
        component = componentDao.save(component);
        if(needUpdateSize){
            //更新条码和库存中的尺寸信息
            int newW = component.getPlateSize();
            int newH = component.getHeight();
            List<Barcode> barcodes = barcodeDao.findListByCondition(new String[]{"partNumber","providerNumber"}, new String[]{component.getPartNumber(),component.getProvider()});
            for (Barcode barcode : barcodes) {
                log.info("更新["+barcode.getBarcode()+"]的尺寸信息["+barcode.getPlateSize()+"x" + barcode.getHeight() +"]为[" + newW + "x" + newH +"]");
                barcode.setPlateSize(newW);
                barcode.setHeight(newH);
                barcodeDao.save(barcode);
            }

            List<StoragePos> poses = storagePosDao.findListByCondition(new String[]{"barcode.partNumber, barcode.providerNumber"}, new String[]{component.getPartNumber(), component.getProvider()});
            for (StoragePos pos : poses) {
                Barcode barcode = pos.getBarcode();
                log.info("更新库位["+pos.getPosName()+"]中条码["+barcode.getBarcode()+"]的尺寸信息["+barcode.getPlateSize()+"x" + barcode.getHeight() +"]为[" + newW + "x" + newH +"]");
                barcode.setPlateSize(newW);
                barcode.setHeight(newH);
                pos.setBarcode(barcode);
                storagePosDao.save(pos);
            }


        }
        return component;
    }

    @Override
    public void delete(Component component) throws ValidateException{
        validateDelete(component);
        componentDao.removeOne(component);
    }

    protected void validateDelete(Component component) throws ValidateException {
        validateBom(component);

    }

    protected void validateBom(Component component) throws ValidateException {
        int count = bomDao.countByCondition(new String[]{"components.componentId"}, new String[]{component.getId()});
        if (count > 0) {
            throw new ValidateException("component.error.bomUsed");
        }
    }

    @Override
    public void validate(Component component, List errors) {

    }


    public void setComponentDao(IComponentDao componentDao) {
        this.componentDao = componentDao;
    }

    public void setBomDao(IBomDao bomDao) {
        this.bomDao = bomDao;
    }
}