package org.jeecg.modules.basedata.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import org.apache.commons.lang.StringUtils;
import org.jeecg.modules.basedata.entity.FdMilestoneTemplateItem;
import org.jeecg.modules.basedata.mapper.FdMilestoneTemplateItemMapper;
import org.jeecg.modules.basedata.service.IFdMilestoneTemplateItemService;
import org.springframework.stereotype.Service;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;

import javax.annotation.Resource;
import java.math.BigDecimal;
import java.util.List;

import static org.jeecg.common.util.oConvertUtils.isEmpty;

/**
 * @Description: 里程碑模板项目
 * @author： jeecg-boot
 * @date：   2019-05-14
 * @version： V1.0
 */
@Service
public class FdMilestoneTemplateItemServiceImpl extends ServiceImpl<FdMilestoneTemplateItemMapper, FdMilestoneTemplateItem> implements IFdMilestoneTemplateItemService {

    @Resource
    FdMilestoneTemplateItemMapper fdMilestoneTemplateItemMapper;

    @Override
    public boolean verificationWeight(FdMilestoneTemplateItem fdMilestoneTemplateItem) {
        boolean isVerificationWeight=true;//结果
        //查询父级对象
        FdMilestoneTemplateItem fdMilestoneTemplateItemP=fdMilestoneTemplateItemMapper.selectById(fdMilestoneTemplateItem.getParentId());
        //判断父级的举重是否为空
        if(StringUtils.isNotBlank(fdMilestoneTemplateItemP.getWeight())){
            //判断父级的举重是否为数字
            if(isNumber(fdMilestoneTemplateItemP.getWeight())){
                //父级举重
                Double weightP=Double.parseDouble(fdMilestoneTemplateItemP.getWeight());
                //子集数据
                LambdaQueryWrapper<FdMilestoneTemplateItem> fdMilestoneTemplateItemLambdaQueryWrapper=new LambdaQueryWrapper<>();
                fdMilestoneTemplateItemLambdaQueryWrapper.eq(FdMilestoneTemplateItem::getDelFlag,"0");
                fdMilestoneTemplateItemLambdaQueryWrapper.eq(FdMilestoneTemplateItem::getParentId,fdMilestoneTemplateItem.getParentId());
                List<FdMilestoneTemplateItem> fdMilestoneTemplateItemList=fdMilestoneTemplateItemMapper.selectList(fdMilestoneTemplateItemLambdaQueryWrapper);
                //子集举重总和
                Double weightC=weightChild(fdMilestoneTemplateItemList);
                //判断子集全部累加举重是否大于父级举重
                if(weightC>weightP){
                    return false;
                }
            }
        }else{//顶级
            LambdaQueryWrapper<FdMilestoneTemplateItem> fdMilestoneTemplateItemLambdaQueryWrapper=new LambdaQueryWrapper<>();
            fdMilestoneTemplateItemLambdaQueryWrapper.eq(FdMilestoneTemplateItem::getDelFlag,"0");
            fdMilestoneTemplateItemLambdaQueryWrapper.isNull(FdMilestoneTemplateItem::getParentId);
            List<FdMilestoneTemplateItem> fdMilestoneTemplateItemList=fdMilestoneTemplateItemMapper.selectList(fdMilestoneTemplateItemLambdaQueryWrapper);
            //子集举重总和
            Double weightC=weightChild(fdMilestoneTemplateItemList);
            //不能大于百分百
            if(weightC>100.0){
                return false;
            }
        }
        return isVerificationWeight;
    }

    public Double weightChild(List<FdMilestoneTemplateItem> fdMilestoneTemplateItemList){
        BigDecimal weightC=new BigDecimal(0.0);//子集举重累加
        //是否为空
        if(fdMilestoneTemplateItemList!=null&&fdMilestoneTemplateItemList.size()>0){
            //循环子集
            for(FdMilestoneTemplateItem itemC:fdMilestoneTemplateItemList){
                //获取子集举重
                if(isNumber(itemC.getWeight())){
                    weightC=weightC.add(getDecimal(Double.parseDouble(itemC.getWeight())));
                }
            }
        }
        return weightC.doubleValue();
    }

    private boolean isNumber(String str){
        if(isEmpty(str)){
            return false;
        }
        String reg = "\\d+(\\.\\d+)?";
        return str.matches(reg);

    }

    public BigDecimal getDecimal(Double d){
        BigDecimal decimal= new BigDecimal(d);
        return decimal;
    }


    public static String formatDouble5(double d) {
        return String.format("%.2f", d);
    }

}
