//package com.engine.salary.formlua.func.find;
//
//import com.alibaba.fastjson.JSON;
//import com.alibaba.fastjson.JSONObject;
//import com.engine.salary.entity.datacollection.DataCollectionEmployee;
//import com.engine.salary.formlua.entity.parameter.DataType;
//import com.engine.salary.formlua.entity.parameter.FuncNames;
//import com.engine.salary.formlua.entity.standard.FormulaFilterData;
//import com.engine.salary.formlua.util.ErrorUtil;
//import com.engine.salary.formlua.util.ExcelParamUtil;
//import com.engine.salary.formlua.util.IgnoreParamFilter;
//import com.weaver.excel.formula.core.rpc.RpcMethod;
//import org.apache.commons.beanutils.BeanUtils;
//import org.apache.commons.compress.utils.Lists;
//import org.apache.commons.lang.ArrayUtils;
//import org.apache.commons.lang.StringUtils;
//import org.slf4j.Logger;
//import org.slf4j.LoggerFactory;
//
//import java.lang.reflect.Array;
//import java.lang.reflect.InvocationTargetException;
//import java.util.List;
//import java.util.Map;
//
//public class FindFuncsServiceImpl implements FindFuncsService{
//    protected final Logger logger = LoggerFactory.getLogger(this.getClass());
//    private ExcelDubboInvoker excelDubboInvoker;
//
//    @Override
//    public Object chooseOne(Object... objects) {
//        DataType chooseResult=new DataType();
//        if(objects != null && objects.length>=2){
//            List<Object> dataList= ExcelParamUtil.getParamContent(objects);
//            Object firstData=dataList.get(0);
//            for (int i=1;i<dataList.size();i++){
//                Object targetCheck=dataList.get(i);
//                if( (firstData+"").equals(targetCheck+"") ){
//                    if(objects[i] instanceof DataType){
//                        DataType targetDataType=(DataType)objects[i];
//                        chooseResult=targetDataType;
//                    }else{
//                        String localtype=objects[i].getClass().getName();
//                        String dataType=ExcelParamUtil.getParamType(localtype).toLowerCase();
//                        chooseResult.setContent(chooseResult);
//                        chooseResult.setDataType(dataType);
//                        chooseResult.setText(dataType);
//                    }
//
//                }
//            }
//        }else {
//            chooseResult.setContent("");
//            chooseResult.setDataType(DataType.STRING);
//        }
//        return chooseResult;
//    }
//
//    @Override
//    public Object choose(Object... objects) {
//        //参数校验
//        String func = FuncNames.CHOOSE.toString();
//        IgnoreParamFilter.commonFilter(func,2,2, null, objects);
//
//        DataType formObj = (DataType)objects[0];
//        DataType conditionObj = objects[1] != null ? (DataType)objects[1]:null;
//
//        Long formId = formObj.getFormId();
//        List<FormulaFilterData> filterDatas = conditionObj != null ? conditionObj.getFormulaFilterDataList(): Lists.newArrayList();
//        DataCollectionEmployee user = formObj.getEmployee();
//
//        Object[] params = {formId, filterDatas, user};
//        return excelDubboInvoker.invokeCommonDubbo(DataType.class,formObj.getModule()+"", RpcMethod.choose, params);
//    }
//
//    @Override
//    public DataType match(Object... objects) {
//        //参数校验
//        String func = FuncNames.MATCH.toString();
//        IgnoreParamFilter.commonFilter(func,2,2, null, objects);
//
//        Object valueObj = objects[0];
//        Object[] arrayObj = null;
//
//        //将第二个参数转数组
//        try{
//            arrayObj = (Object[]) objects[1];
//        }catch (Exception e){
//            Integer number = IgnoreParamFilter.getSetFuncNumber(func);
//            JSONObject errorJson = ErrorUtil.buildError(func,number,number,func+"函数第二个参数必须是数组类型");
//            throw new RuntimeException(errorJson.getString("msg"));
//        }
//
//        //所在下标
//        int index = ArrayUtils.indexOf(arrayObj, valueObj);
//        return new DataType(DataType.NUMBER, index);
//    }
//
//    @Override
//    public Object vlookups(Object... objects) {
//        //参数校验
//        String func = FuncNames.VLOOKUPS.toString();
//        IgnoreParamFilter.commonFilter(func,3,3, null, objects);
//
//        DataType formObj = (DataType)objects[0];
//        DataType conditionObj = objects[1] != null ? (DataType)objects[1] : null;
//        //拿出返回数据
//        Object returnObjs=objects[2];
//        //初始化数组
//        DataType[] rtnCols = null;
//        //判断是否是数组
//        if(returnObjs!=null && returnObjs.getClass().isArray()){
//            logger.info("执行器查找函数返回数据为DataType数组"+JSON.toJSONString(returnObjs));
//            //获取数组长度
//            int len= Array.getLength(returnObjs);
//            rtnCols=new DataType[len];
//            //遍历并转换数据后放入rtnCols
//            for(int i=0;i<len;i++){
//                Object obj=Array.get(returnObjs,i);
//                if(obj instanceof DataType){
//                    rtnCols[i]=(DataType)obj;
//                }
//            }
//
//        }else if(returnObjs!=null && returnObjs instanceof DataType){
//            logger.info("执行器查找函数返回数据为DataType"+JSON.toJSONString(returnObjs));
//            rtnCols=new DataType[1];
//            rtnCols[0]=(DataType)returnObjs;
//        }else{
//            logger.info("查找函数返回字段参数为空");
//        }
//
//
//        //解析fieldId
//        List<String> fieldIds = Lists.newArrayList();
//        if(!ArrayUtils.isEmpty(rtnCols)){
//            for (DataType item : rtnCols) {
//                if(item != null && StringUtils.isNotEmpty(item.getFieldId())) fieldIds.add(item.getFieldId());
//            }
//        }
//
//        Long formId = formObj.getFormId();
//        List<FormulaFilterData> filterDatas = conditionObj != null ? conditionObj.getFormulaFilterDataList() : Lists.newArrayList();
//        DataCollectionEmployee user = formObj.getEmployee();
//
//        Object[] params = {formId+"", filterDatas, fieldIds, null,user};
//
//        DataType[] dataTypes=new DataType[1];
//        Object dubboResult=excelDubboInvoker.invokeCommonDubbo(List.class,formObj.getModule()+"", RpcMethod.vlookups, params);
//        logger.info("返回结果："+JSON.toJSONString(dubboResult));
//
//        if(dubboResult!=null && dubboResult instanceof List){
//            try {
//                List<Object> resultObjectList=(List)dubboResult;
//                dataTypes=new DataType[resultObjectList.size()];
//                for(int i =0;i<resultObjectList.size();i++){
//                    Object resultParam=resultObjectList.get(i);
//                    if(resultParam instanceof Map){
//                        Map map=(Map)resultParam;
//                        Class<?> classa=Class.forName(map.get("class").toString()) ;
//                        Object typeObject=classa.newInstance();
//                        BeanUtils.populate(typeObject,map);
//                        if(typeObject instanceof DataType){
//                            dataTypes[i]=(DataType) typeObject;
//                        }
//                    }else if(resultParam instanceof DataType){
//                        dataTypes[i]=(DataType) resultParam;
//                    }else{
//                        logger.info("Dubbo接口返回异常数据类型："+resultParam.getClass().getName());
//                    }
//                }
//            } catch (ClassNotFoundException e) {
//                e.printStackTrace();
//            } catch (InstantiationException e) {
//                e.printStackTrace();
//            } catch (IllegalAccessException e) {
//                e.printStackTrace();
//            } catch (InvocationTargetException e) {
//                e.printStackTrace();
//            }catch (Exception e){
//                e.printStackTrace();
//            }
//        }else{
//            DataType nomalData=new DataType(DataType.NUMBER, 0);
//            dataTypes[0]=nomalData;
//        }
//        return dataTypes.length==1?dataTypes[0]:dataTypes;
//    }
//}
