package com.hw.mes.service.impl;

import java.util.List;
import com.hw.common.core.utils.DateUtils;
import com.hw.common.core.utils.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.hw.mes.mapper.MesMaterialBomMapper;
import com.hw.mes.domain.MesMaterialBom;
import com.hw.mes.service.IMesMaterialBomService;

/**
 * 物料BOM信息Service业务层处理
 *
 * @author Yinq
 * @date 2024-01-30
 */
@Service
public class MesMaterialBomServiceImpl implements IMesMaterialBomService
{
    @Autowired
    private MesMaterialBomMapper mesMaterialBomMapper;

    /**
     * 查询物料BOM信息
     *
     * @param materialBomId 物料BOM信息主键
     * @return 物料BOM信息
     */
    @Override
    public MesMaterialBom selectMesMaterialBomByMaterialBomId(Long materialBomId)
    {
        return mesMaterialBomMapper.selectMesMaterialBomByMaterialBomId(materialBomId);
    }

    /**
     * 查询物料BOM信息列表
     *
     * @param mesMaterialBom 物料BOM信息
     * @return 物料BOM信息
     */
    @Override
    public List<MesMaterialBom> selectMesMaterialBomList(MesMaterialBom mesMaterialBom)
    {
        return mesMaterialBomMapper.selectMesMaterialBomList(mesMaterialBom);
    }

    /**
     * 新增物料BOM信息
     *
     * @param mesMaterialBom 物料BOM信息
     * @return 结果
     */
    @Override
    public int insertMesMaterialBom(MesMaterialBom mesMaterialBom)
    {
        isTopFlag(mesMaterialBom);
        mesMaterialBom.setCreateTime(DateUtils.getNowDate());
        MesMaterialBom info = mesMaterialBomMapper.selectMesMaterialBomByMaterialBomId(mesMaterialBom.getParentId());
        if (StringUtils.isNull(info)){
            mesMaterialBom.setAncestors(mesMaterialBom.getParentId().toString());
        }else {
            mesMaterialBom.setAncestors(info.getAncestors() + "," + mesMaterialBom.getParentId());
        }
        return mesMaterialBomMapper.insertMesMaterialBom(mesMaterialBom);
    }

    /**
     * 修改物料BOM信息
     *
     * @param mesMaterialBom 物料BOM信息
     * @return 结果
     */
    @Override
    public int updateMesMaterialBom(MesMaterialBom mesMaterialBom)
    {
        isTopFlag(mesMaterialBom);
        mesMaterialBom.setUpdateTime(DateUtils.getNowDate());
        return mesMaterialBomMapper.updateMesMaterialBom(mesMaterialBom);
    }

    /**
     * 批量删除物料BOM信息
     *
     * @param materialBomIds 需要删除的物料BOM信息主键
     * @return 结果
     */
    @Override
    public int deleteMesMaterialBomByMaterialBomIds(Long[] materialBomIds)
    {
        //遍历删除子集物料BOM
        MesMaterialBom materialBom = new MesMaterialBom();
        materialBom.setAncestors(String.valueOf(materialBomIds[0]));
        List<MesMaterialBom> materialBomList = mesMaterialBomMapper.selectMesMaterialBomList(materialBom);
        for (MesMaterialBom bom : materialBomList) {
            mesMaterialBomMapper.deleteMesMaterialBomByMaterialBomId(bom.getMaterialBomId());
        }
        return mesMaterialBomMapper.deleteMesMaterialBomByMaterialBomIds(materialBomIds);
    }

    /**
     * 删除物料BOM信息信息
     *
     * @param materialBomId 物料BOM信息主键
     * @return 结果
     */
    @Override
    public int deleteMesMaterialBomByMaterialBomId(Long materialBomId)
    {
        return mesMaterialBomMapper.deleteMesMaterialBomByMaterialBomId(materialBomId);
    }

    /**
     * 查询物料BOM信息列表,Join material
     *
     * @param mesMaterialBom 物料BOM信息
     * @return 物料BOM信息
     */
    @Override
    public List<MesMaterialBom> selectMesMaterialBomJoinList(MesMaterialBom mesMaterialBom)
    {
        return mesMaterialBomMapper.selectMesMaterialBomJoinList(mesMaterialBom);
    }

    /**
     * 查询物料BOM版本列表
     * @param materialId
     * @return
     */
    @Override
    public List<MesMaterialBom> getMaterialVisionList(Long materialId) {
        MesMaterialBom materialBom = new MesMaterialBom();
        materialBom.setMaterialId(materialId);
        return mesMaterialBomMapper.selectMesMaterialBomList(materialBom);
    }

    /**
     * 查询物料顶级BOM信息
     * @param materialBomId 物料BOM信息主键
     * @return
     */
    @Override
    public MesMaterialBom selectTopMaterialBomByMaterialBomId(Long materialBomId) {
        MesMaterialBom mesMaterialBom = mesMaterialBomMapper.selectMesMaterialBomByMaterialBomId(materialBomId);
        return recursionSelectTopMaterialBom(mesMaterialBom);
    }

    /**
     * 递归查询顶级BOM
     * @param mesMaterialBom
     * @return
     */
    public MesMaterialBom recursionSelectTopMaterialBom(MesMaterialBom mesMaterialBom) {
        if (StringUtils.isNull(mesMaterialBom) || mesMaterialBom.getTopFlag() == 1L){
            //返回顶级BOM信息
            return mesMaterialBom;
        }
        MesMaterialBom materialBom = mesMaterialBomMapper.selectMesMaterialBomByMaterialBomId(mesMaterialBom.getParentId());
        return recursionSelectTopMaterialBom(materialBom);
    }

    /**
     * SET顶级标识
     * 判断是否顶级BOM
     * @param mesMaterialBom
     */
    private void isTopFlag(MesMaterialBom mesMaterialBom){
        // 顶级标识1=是，0=否
        if (StringUtils.isNull(mesMaterialBom.getParentId()) || mesMaterialBom.getParentId() == 0L){
            mesMaterialBom.setTopFlag(1L);
        }else {
            mesMaterialBom.setTopFlag(0L);
        }
    }

}
