MaterialManagerImpl.java

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

import com.fa.sesa.threadlocal.LocalContext;
import com.mycim.framework.utils.lang.StringUtils;
import com.mycim.framework.utils.lang.collections.MapUtils;
import com.mycim.framework.utils.lang.math.NumberUtils;
import com.mycim.server.asm.dao.MaterialDAO;
import com.mycim.server.asm.manager.MaterialManager;
import com.mycim.server.base.manager.NamedObjectExtManager;
import com.mycim.server.base.manager.NamedObjectManager;
import com.mycim.server.base.manager.TransactionLogManager;
import com.mycim.valueobject.ObjectList;
import com.mycim.valueobject.bas.NamedObject;
import com.mycim.valueobject.bas.TransactionLog;
import com.mycim.valueobject.consts.TransactionNames;
import com.mycim.valueobject.inv.InventoryTransHistoryDO;
import com.mycim.valueobject.inv.LotStepBomHistoryDO;
import com.mycim.valueobject.inv.MaterialDO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.HashMap;
import java.util.List;

@Service
@Transactional
public class MaterialManagerImpl implements MaterialManager {

    @Autowired
    MaterialDAO materialDAO;

    @Autowired
    TransactionLogManager transactionLogManager;

    @Autowired
    NamedObjectManager namedObjectManager;

    @Autowired
    NamedObjectExtManager namedObjectExtManager;

    @Override
    public long insertMaterial(MaterialDO material) {
        TransactionLog transactionLog = transactionLogManager
                .startTransactionLog(material.getTransPerformedby(), TransactionNames.CREATE_KEY);
        transactionLog.setTransSequence(1L);
        material.setInstanceRrn(namedObjectManager.insertNamedObject(material, transactionLog.getTransRrn()));
        if (ObjectList.BOM_KEY.equals(material.getObjectType()) ) {
            HashMap<String, Object> map = MapUtils.newHashMap();
            if (StringUtils.isNotEmptyTrim(material.getAttribute3())) {
                map.put("ATTRIBUTE_DATA3", material.getAttribute3());
            }
            namedObjectExtManager
                    .insertNamedObjectExt(material.getInstanceRrn(), StringUtils.toString(NumberUtils.INTEGER_ZERO), map);
        }
        materialDAO.insertMaterial(material);
        materialDAO.insertMaterialHistory(material.getInstanceRrn(), transactionLog.getTransRrn(), 1L, 0D);
        //数据同步至新表
        materialDAO.insertMaterial(material, LocalContext.getUserRrn());
        materialDAO.insertMaterialHistory(material, transactionLog);

        transactionLogManager.markTransactionLog(transactionLog);

        return material.getInstanceRrn();
    }

    @Override
    public void deleteMaterial(MaterialDO material) {
        TransactionLog transactionLog = transactionLogManager
                .startTransactionLog(material.getTransPerformedby(), TransactionNames.DELETE_KEY);
        transactionLog.setTransSequence(1L);
        long transRrn = transactionLog.getTransRrn();
        namedObjectManager.deleteNamedObject(material, transRrn);
        materialDAO.insertMaterialHistory(material.getInstanceRrn(), transRrn, 1L, 0D);
        materialDAO.deleteMaterial(material.getInstanceRrn());
        //数据同步至新表
        materialDAO.insertMaterialHistory(material, transactionLog);
        materialDAO.deleteMaterial(material);

        transactionLogManager.markTransactionLog(transactionLog);
    }

    @Override
    public void updateMaterial(MaterialDO material) {
        TransactionLog transactionLog = transactionLogManager
                .startTransactionLog(material.getTransPerformedby(), TransactionNames.MODIFY_KEY);
        transactionLog.setTransSequence(1L);
        long transRrn = transactionLog.getTransRrn();

        namedObjectManager.updateNamedObject(material, transRrn);
        if (ObjectList.BOM_KEY.equals(material.getObjectType()) ) {
            namedObjectExtManager.updateNamedObjectExt(material);
        }
        materialDAO.updateMaterial(material);
        materialDAO.insertMaterialHistory(material.getInstanceRrn(), transRrn, 1L, 0D);

        //数据同步至新表
        materialDAO.updateMaterial(material, LocalContext.getUserRrn());
        materialDAO.insertMaterialHistory(material, transactionLog);

        transactionLogManager.markTransactionLog(transactionLog);

    }

    @Override
    public MaterialDO getMaterial(MaterialDO material) {
        NamedObject namedObject = namedObjectManager.getNamedObject(material);

        if (namedObject == null) {
            return null;
        }

        MaterialDO materialDO = materialDAO.getMaterial(namedObject.getInstanceRrn());

        materialDO.copyNamedObject(namedObject);

        return materialDO;
    }

    @Override
    public boolean isMaterialInUsed(Long materialRrn) {
        List<Long> materialInUsed = materialDAO.getMaterialInWarehouse(materialRrn);
        if (materialInUsed == null || materialInUsed.isEmpty()) {
            materialInUsed = materialDAO.getMaterialInBor(materialRrn);
        }

        return materialInUsed == null || materialInUsed.isEmpty() ? false : true;
    }

    @Override
    public boolean hasMaterialExtNumber(Long materialRrn, String itemExtendNumber) {
        return materialDAO.hasMaterialExtNumber(materialRrn, itemExtendNumber);
    }

    @Override
    public void saveMaterialForReceived(InventoryTransHistoryDO ithd) {

        materialDAO.updateMaterialForReceiptQty(ithd.getItemRrn(), ithd.getTransQty());
        materialDAO.insertMaterialHistory(ithd.getItemRrn(), ithd.getTransRrn(), ithd.getTransSequence(),
                                          ithd.getTransQty());
        //同步数据至新历史表
        MaterialDO md = new MaterialDO();
        md.setInstanceRrn(ithd.getItemRrn());
        materialDAO.insertMaterialHistory(md, new TransactionLog(ithd.getTransRrn(), ithd.getTransId(),
                                                                 ithd.getTransSequence(), ithd.getTransDate()));
    }

    @Override
    public void saveMaterialForConsumed(InventoryTransHistoryDO ithd) {
        materialDAO.updateMaterialForIssueQty(ithd.getItemRrn(), ithd.getTransQty());
        materialDAO.insertMaterialHistory(ithd.getItemRrn(), ithd.getTransRrn(), ithd.getTransSequence(),
                                          ithd.getTransQty());
        //同步数据至新历史表
        MaterialDO md = new MaterialDO();
        md.setInstanceRrn(ithd.getItemRrn());
        materialDAO.insertMaterialHistory(md, new TransactionLog(ithd.getTransRrn(), ithd.getTransId(),
                                                                 ithd.getTransSequence(), ithd.getTransDate()));
    }

    @Override
    public void saveMaterialForStocktake(InventoryTransHistoryDO ithd) {
        materialDAO.updateMaterialForAdjustQty(ithd.getItemRrn(), ithd.getTransQty());
        materialDAO.insertMaterialHistory(ithd.getItemRrn(), ithd.getTransRrn(), ithd.getTransSequence(),
                                          ithd.getTransQty());
        //同步数据至新历史表
        MaterialDO md = new MaterialDO();
        md.setInstanceRrn(ithd.getItemRrn());
        materialDAO.insertMaterialHistory(md, new TransactionLog(ithd.getTransRrn(), ithd.getTransId(),
                                                                 ithd.getTransSequence(), ithd.getTransDate()));
    }

    @Override
    public String getMaterials4lot(Long warehouseRrn, Long productRrn) {
        return materialDAO.getMaterials4lot(warehouseRrn, productRrn);
    }

    @Override
    public int getMaterialTotalQuantity(long materialRrn) {
        return materialRrn > 0 ? materialDAO.getMaterialTotalQuantity(materialRrn) : 0;
    }

    @Override
    public void insertLotStepBomDao(LotStepBomHistoryDO lotStepBomHistoryDO) {
        materialDAO.insertLotStepBomDao(lotStepBomHistoryDO);
    }

}