package cn.com.countrygarden.bi.main.util;

import cn.com.countrygarden.bi.main.model.performance.PerformanceArea;
import cn.com.countrygarden.bi.main.model.performance.PerformanceEnv;
import cn.com.countrygarden.bi.main.model.twerp.hm.TbSysOrgan;
import cn.com.countrygarden.bi.main.service.performance.PerformanceEnvService;
import cn.com.countrygarden.bi.main.service.performance.common.PerformanceAreaService;
import cn.com.countrygarden.bi.main.service.twerp.hm.TbSysOrganService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Date;
import java.util.List;
import java.util.function.Supplier;
import java.util.stream.Collectors;
import java.util.stream.Stream;

/**
 * 数据同步，将erp数据对比进行批量更新进入performance_env数据库
 *
 * @author Max
 * @version 1.0
 * @since 1.8
 */
@Service
public class SyncErpToPerformanceUtil {

    @Autowired
    private TbSysOrganService tbSysOrganService;

    @Autowired
    private PerformanceEnvService performanceEnvService;

    @Autowired
    private PerformanceAreaService performanceAreaService;

    @Deprecated
    public void sync() {
        //获取erp数据库中的区域
        List<TbSysOrgan> tbSysOrganList = tbSysOrganService.selectPerformanceAllArea();
        //查询performance_env下的区域数据(只存放区域)
        List<PerformanceEnv> performanceEnvList = performanceEnvService.selectAll();
        //转变成流操作
        Supplier<Stream<PerformanceEnv>> streamSupplier = () -> performanceEnvList.stream();
        //遍历erp的数据，更新最新，批量插入
        for (TbSysOrgan tbSysOrgan : tbSysOrganList) {
            //筛选，查看数据库是否有数据，如果是无数据进行删除，有数据进行对比，是否一致，如果不一致进行update
            Stream<PerformanceEnv> performanceEnvStreamTemp = streamSupplier.get().filter(performanceEnv -> tbSysOrgan.getOrganCode().equals(performanceEnv.getHierarchyId()));
            List<PerformanceEnv> temp_pe = performanceEnvStreamTemp.collect(Collectors.toList());//至多1条数据
            if (temp_pe.size() == 0) {//表示无此数据，进行插入
                PerformanceEnv newPe = new PerformanceEnv();
                newPe.setHierarchyId(tbSysOrgan.getOrganCode());//区域id
                newPe.setHierarchyName(tbSysOrgan.getOrganName());    //区域名称
                newPe.setCreatedDate(new Date());//设置插入时间;	//创建日期
                newPe.setIsdelete(tbSysOrgan.getIsdelete());//设置是否删除
                newPe.setIscomp(tbSysOrgan.getIscomp());//设置是否是区域
                //执行插入
                performanceEnvService.insertSelective(newPe);
            } else {//表示有此数据，进行对比，如果对比有不同的，进行update
                PerformanceEnv oldPe = temp_pe.get(0);
                //对比区域名称，是否删除，是否是区域是否更新，如果有更新，进行update操作
                if (!(oldPe.getHierarchyName().equals(tbSysOrgan.getOrganName()) && oldPe.getIsdelete() == tbSysOrgan.getIsdelete() && oldPe.getIscomp() == tbSysOrgan.getIscomp())) {
                    oldPe.setHierarchyName(tbSysOrgan.getOrganName());    //区域名称
                    oldPe.setUpdateDate(new Date());//更新时间
                    oldPe.setIsdelete(tbSysOrgan.getIsdelete());//更新是否删除
                    oldPe.setIscomp(tbSysOrgan.getIscomp());//更新是否是区域
                    //执行更新
                    performanceEnvService.updateByPrimaryKeySelective(oldPe);
                }
            }
        }
    }

    /**
     * 从ERP库中同步area信息，根据区域/城市公司类型
     * @param typeNo
     */
    public void syncByType(String typeNo){
//        1.从erp库中读取所有的区域/城市公司的信息
//        2.查询dup库的performance_area表中所有对应分类的地区信息
//        3.对比筛选，查看数据库是否有数据，如果是无数据进行删除，有数据进行对比，是否一致，如果不一致进行update
//        4.写入excel表格中下载到客户端
        List<TbSysOrgan> tbSysOrganList = tbSysOrganService.selectAllAreaByType(typeNo);
        if(tbSysOrganList.size() == 0)
            throw new RuntimeException("ERP库中无数据!");

        List<PerformanceArea> areaList = performanceAreaService.getAllAreasByType(typeNo);
        //转变成流操作
        Supplier<Stream<PerformanceArea>> streamSupplier = () -> areaList.stream();
        //遍历erp的数据，更新最新，批量插入
        for (TbSysOrgan tbSysOrgan : tbSysOrganList) {

            Stream<PerformanceArea> performanceAreaStreamTemp = streamSupplier.get().filter(PerformanceArea -> tbSysOrgan.getOrganCode().equals(PerformanceArea.getHierachyId()));
            List<PerformanceArea> temp_pe = performanceAreaStreamTemp.collect(Collectors.toList());//至多1条数据
            if (temp_pe.size() == 0) {//表示无此数据，进行插入
                PerformanceArea newPe = new PerformanceArea();
                newPe.setHierachyId(tbSysOrgan.getOrganCode());//地区id
                newPe.setHierachyName(tbSysOrgan.getOrganName());    //地区名称
                newPe.setCreateDate(new Date());//设置插入时间;	//创建日期
                newPe.setIsDelete(tbSysOrgan.getIsdelete());//设置是否删除
                newPe.setTypeNo(typeNo);//设置类型
                //执行插入
                performanceAreaService.addPerformanceArea(newPe);
            } else {//表示有此数据，进行对比，如果对比有不同的，进行update
                PerformanceArea oldPe = temp_pe.get(0);
                //对比区域名称，是否删除，是否是区域是否更新，如果有更新，进行update操作
                if (!(oldPe.getHierachyName().equals(tbSysOrgan.getOrganName()) && oldPe.getIsDelete() == tbSysOrgan.getIsdelete())) {
                    oldPe.setHierachyName(tbSysOrgan.getOrganName());    //区域名称
                    oldPe.setUpdateDate(new Date());//更新时间
                    oldPe.setIsDelete(tbSysOrgan.getIsdelete());//更新是否删除
                    //oldPe.setIscomp(tbSysOrgan.getIscomp());//更新是否是区域
                    //执行更新
                    performanceAreaService.updatePerformanceArea(oldPe);
                }
            }
        }



    }
}
