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

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import org.jeecg.common.constant.CommonConstant;
import org.jeecg.common.util.oConvertUtils;
import org.jeecg.modules.projectManagement.entity.FdProjectQuotationTemplate;
import org.jeecg.modules.projectManagement.entity.FdProjectQuotationTemplateItem;
import org.jeecg.modules.projectManagement.entity.FdProjectQuotationTemplateItemTree;
import org.jeecg.modules.projectManagement.mapper.FdProjectQuotationTemplateMapper;
import org.jeecg.modules.projectManagement.service.IFdProjectQuotationTemplateItemService;
import org.jeecg.modules.projectManagement.service.IFdProjectQuotationTemplateService;
import org.springframework.stereotype.Service;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * @Description: 项目报价选择的模板对照表
 * @author： gurui
 * @date： 2019-05-20
 * @version： V1.0
 */
@Service
@Transactional
public class FdProjectQuotationTemplateServiceImpl extends ServiceImpl<FdProjectQuotationTemplateMapper, FdProjectQuotationTemplate> implements IFdProjectQuotationTemplateService {

    @Resource
    private IFdProjectQuotationTemplateService fdProjectQuotationTemplateService;

    @Resource
    private IFdProjectQuotationTemplateItemService fdProjectQuotationTemplateItemService;

    @Resource
    FdProjectQuotationTemplateMapper fdProjectQuotationTemplateMapper;

    /**
     * @return void
     * @Author gurui
     * @Description //TODO 添加 项目报价选择的模板对照表 同时添加项目报价模板对照明细
     * @Date 10:23 2019/5/21
     * @Param [fdProjectQuotationTemplate]
     **/
    @Override
    public void saveProjectQuotationTemplate(FdProjectQuotationTemplate fdProjectQuotationTemplate) {
        fdProjectQuotationTemplateService.save(fdProjectQuotationTemplate);
        if (fdProjectQuotationTemplate.getTemplateItemList() != null) {
            for (FdProjectQuotationTemplateItem fdProjectQuotationTemplateItem : fdProjectQuotationTemplate.getTemplateItemList()) {
                fdProjectQuotationTemplateItem.setProjectQuotationTemplateId(fdProjectQuotationTemplate.getQuotationTemplateId());
                fdProjectQuotationTemplateItemService.save(fdProjectQuotationTemplateItem);
            }
        }

    }

    /**
     * @return void
     * @Author gurui
     * @Description //TODO 修改 项目报价选择的模板对照表 同时修改 项目报价模板对照明细
     * @Date 10:23 2019/5/21
     * @Param [fdProjectQuotationTemplate]
     **/
    @Override
    public void updateProjectQuotationTemplate(FdProjectQuotationTemplate fdProjectQuotationTemplate) {
        fdProjectQuotationTemplateService.updateById(fdProjectQuotationTemplate);
        //根据项目报价单模板id查询项目报价模板对照明细
        LambdaQueryWrapper<FdProjectQuotationTemplateItem> quotationTemplateItem = new LambdaQueryWrapper<>();
        quotationTemplateItem.eq(FdProjectQuotationTemplateItem::getProjectQuotationTemplateId, fdProjectQuotationTemplate.getQuotationTemplateId()).eq(FdProjectQuotationTemplateItem::getDelFlag, "0");
        List<FdProjectQuotationTemplateItem> templateItemList = fdProjectQuotationTemplateItemService.list(quotationTemplateItem);
        if (fdProjectQuotationTemplate.getTemplateItemList() != null) {
            for (FdProjectQuotationTemplateItem fdProjectQuotationTemplateItem : templateItemList) {
                for (FdProjectQuotationTemplateItem fdProjectQuotationTemplateItem1 : fdProjectQuotationTemplate.getTemplateItemList()) {
                    //将查询出来的ID赋给传入值,根据ID修改
                    fdProjectQuotationTemplateItem1.setId(fdProjectQuotationTemplateItem.getId());
                    fdProjectQuotationTemplateItemService.updateById(fdProjectQuotationTemplateItem1);
                }
            }
        }
    }

    /**
     * @return void
     * @Author gurui
     * @Description //TODO 删除 项目报价选择的模板对照表 同时删除 项目报价模板对照明细
     * @Date 10:24 2019/5/21
     * @Param [ids]
     **/
    @Override
    public void deleteProjectQuotationTemplate(String ids) {
        //  获得要删除的ids , 根据逗号提取
        List list = Arrays.asList(ids.split(","));
        FdProjectQuotationTemplate fdProjectQuotationTemplate = null;
        for (int i = 0; i < list.size(); i++) {
            fdProjectQuotationTemplate = new FdProjectQuotationTemplate();
            fdProjectQuotationTemplate.setId(list().get(i).toString());
            //  删除项目报价模板对照明细
            LambdaQueryWrapper<FdProjectQuotationTemplateItem> quotationTemplateItem = new LambdaQueryWrapper<>();
            quotationTemplateItem.eq(FdProjectQuotationTemplateItem::getProjectQuotationTemplateId, fdProjectQuotationTemplate.getQuotationTemplateId());
            List<FdProjectQuotationTemplateItem> templateItemList = fdProjectQuotationTemplateItemService.list(quotationTemplateItem);
            for (FdProjectQuotationTemplateItem templateItem : templateItemList) {
                templateItem.setDelFlag(CommonConstant.DEL_FLAG_1.toString());
                fdProjectQuotationTemplateItemService.updateById(templateItem);
            }
            //  删除项目报价选择的模板对照表
            fdProjectQuotationTemplate.setDelFlag(CommonConstant.DEL_FLAG_1.toString());
            fdProjectQuotationTemplateService.updateById(fdProjectQuotationTemplate);
        }
    }

    @Override
    public List<FdProjectQuotationTemplate> getByQuotationId(String quotationId) {
        return fdProjectQuotationTemplateMapper.getByQuotationId(quotationId);
    }

    @Override
    public List<FdProjectQuotationTemplate> getByQuotationId1(String quotationId) {
        return fdProjectQuotationTemplateMapper.getByQuotationId1(quotationId);
    }

    @Override
    public List<FdProjectQuotationTemplate> getTemplateAndItemsByQuotationId(String quotationId){

        //报价选择的模板数据
        List<FdProjectQuotationTemplate> fdProjectQuotationTemplateList=fdProjectQuotationTemplateMapper.getByQuotationId(quotationId);

        //报价下的全部模板明细
        LambdaQueryWrapper<FdProjectQuotationTemplateItem> lambdaQueryWrapper =new LambdaQueryWrapper<>();
        lambdaQueryWrapper.eq(FdProjectQuotationTemplateItem::getQuotationId,quotationId);
        List<FdProjectQuotationTemplateItem> list = fdProjectQuotationTemplateItemService.listOrderByCode(quotationId,null);
        //对应好模板下的明细项
        getTemplateChildItems(fdProjectQuotationTemplateList,list);
        return fdProjectQuotationTemplateList;
    }

    /***
     * @Title:根据模板id获取下面的模板项目
            * @Description:TODO
            * @param fdProjectQuotationTemplateList, fdProjectQuotationTemplateItemList]
            * @return void
            * @exception
            * @author 陈创
            * @date 2019/9/20 11:50
            * @updatehistory:
     *   2019/9/20 11:50 新增
            */
    public void getTemplateChildItems(List<FdProjectQuotationTemplate> fdProjectQuotationTemplateList,List<FdProjectQuotationTemplateItem> fdProjectQuotationTemplateItemList){
        for(FdProjectQuotationTemplate fdProjectQuotationTemplate:fdProjectQuotationTemplateList){
            //模板id
            String tempId=fdProjectQuotationTemplate.getId();
            //存取模板明细项
            List<FdProjectQuotationTemplateItem> addItems=new ArrayList<>();
            //获取对应的模板项
            for(FdProjectQuotationTemplateItem fdProjectQuotationTemplateItem:fdProjectQuotationTemplateItemList){
                if(tempId.equals(fdProjectQuotationTemplateItem.getProjectQuotationTemplateId())){
                    addItems.add(fdProjectQuotationTemplateItem);
                }
            }
            //获取树形json
            List<FdProjectQuotationTemplateItemTree> treeLists = new ArrayList<>();
            getTreeList(treeLists,addItems,null);
            findLeaf(treeLists);
            fdProjectQuotationTemplate.setFdProjectQuotationTemplateItemTreeList(treeLists);
        }
    }


    private void getTreeList(List<FdProjectQuotationTemplateItemTree> treeList, List<FdProjectQuotationTemplateItem> fdlist , FdProjectQuotationTemplateItemTree temp){
        for (FdProjectQuotationTemplateItem fdQuotationTemplateItem: fdlist){
            String tempPid = fdQuotationTemplateItem.getParentId();
            FdProjectQuotationTemplateItemTree tree = new FdProjectQuotationTemplateItemTree(fdQuotationTemplateItem);
            if (temp == null && oConvertUtils.isEmpty(tempPid)){
                treeList.add(tree);
                if (!tree.getIsLeaf()){
                    getTreeList(treeList,fdlist,tree);
                }
            }else  if (temp!=null&&tempPid!=null&&tempPid.equals(temp.getId())){
                temp.getChildren().add(tree);
                if (!tree.getIsLeaf()){
                    getTreeList(treeList,fdlist,tree);
                }
            }

        }
    }

    private void findLeaf(List<FdProjectQuotationTemplateItemTree> treeList) {
        for (FdProjectQuotationTemplateItemTree fdQuotationTemplateItemTree : treeList) {
            if (fdQuotationTemplateItemTree.getChildren().isEmpty()) {
                fdQuotationTemplateItemTree.setIsLeaf(true);
                fdQuotationTemplateItemTree.setChildren(null);
            } else {
                findLeaf(fdQuotationTemplateItemTree.getChildren());
            }
        }
    }

}
