package market.Qms.common;

import java.beans.BeanInfo;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.List;
import java.util.Set;
import java.util.UUID;

import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;

import market.Qms.slmord.vo.SlmOrdDesignStsTklgLst;
import market.Slm.OrderManagement.vo.SlmContractProcessPlan;
import sun.misc.BASE64Decoder;
public class DataHelper {
	
	/**
	 * 类之间同字段赋值
	 * @param source 源
	 * @param container 容器
	 * @throws Exception 
	 */
	public static void EntityCopy(Object source, Object container) throws Exception {
		// 获取属性
		BeanInfo sourceBean = Introspector.getBeanInfo(source.getClass(), Object.class);
		PropertyDescriptor[] sourceProperty = sourceBean.getPropertyDescriptors();
		BeanInfo destBean = Introspector.getBeanInfo(container.getClass(), Object.class);
		PropertyDescriptor[] destProperty = destBean.getPropertyDescriptors();
		try {
			for (int i = 0; i < sourceProperty.length; i++) {
				for (int j = 0; j < destProperty.length; j++) {
					if (sourceProperty[i].getName().equals(destProperty[j].getName())
							&& sourceProperty[i].getPropertyType() == destProperty[j].getPropertyType()) {
						// 调用source的getter方法和dest的setter方法
						destProperty[j].getWriteMethod().invoke(container, sourceProperty[i].getReadMethod().invoke(source));
						break;
					}
				}
			}
		} catch (Exception e) {
			throw new Exception("属性复制失败：" + e.getMessage());
		}
	}
	
	
	/**
	 * 判断工序点类型
	 * @param typeCode
	 * @return
	 */
	public static Enum_StationType getStationType(String typeCode){
		switch (typeCode) {
		case "403201":
			return Enum_StationType.Group;
		case "403202":
			return Enum_StationType.Material;
		case "403203":
			return Enum_StationType.Size;
		case "403204":
			return Enum_StationType.Detection;
		case "403206":
			return Enum_StationType.Technics;
		default:
			return Enum_StationType.None;
		}
	}
	/**
	 * 将double转化为字符串
	 */
	
	public static String getDoubleString(Double value) {
		
		if (value==null || "".equals(value)) {
			return null;
		}else {
			return  value.toString();
		}
		
		
		
	}
	
	/**
	 * 检查是否符合标准
	 * @param sign 符号
	 * @param signValue 标准值
	 * @param value 对比值
	 * @return
	 */
	public static boolean checkSignAndValue(String sign,Double signValue,String value){
		if(value==null||value==""){
			return true;
		}
		if(sign==null){
			return true;
		}
		switch(sign){
			case ">":
				return signValue.doubleValue()<Double.parseDouble(value);
			case ">=":
				return signValue.doubleValue()<=Double.parseDouble(value);
			case "<":
				return signValue.doubleValue()>Double.parseDouble(value);
			case "<=":
				return signValue.doubleValue()>=Double.parseDouble(value);
			case "=":
				return signValue.doubleValue()==Double.parseDouble(value);
			default:
				return true;
		}
	}
	
	/**
	 * 装载设计明细状态信息(技术评审中使用)
	 * @param line 合同行、合同头信息
	 * @param lst 设计明细类
	 * @param lstItem 明细项目
	 * @param sts 设计状态
	 * @param stsRs 设计状态原因
	 * @param stsDesc 设计状态结果描述
	 * @param objKey 设计对象Key 值
	 */
	public static void SetDesignStsTklgLst(SlmContractProcessPlan line,SlmOrdDesignStsTklgLst lst,String lstItem,String sts,String stsRs,String stsDesc,String objKey){
		lst.setLst_item(lstItem);
		lst.setMsc(line.getMsc());
		lst.setDesign_sts(sts);
		lst.setDesign_sts_rs(stsRs);
		lst.setDesign_sts_desc(stsDesc);
		lst.setDesign_obj_key(objKey);
		//暂时没有找到管理科室、部门
		//lst.setSection_code(line.get);
		//lst.setSection_name(line.getMsc_unit_desc());
	}
	

	/**
	 * 构建日期
	 * @param filed  数据库字段名
	 * @param start 开始日期
	 * @param end 结束日期
	 * @return
	 */
	public static String CreateSqlConditionDate(String filed,Date start,Date end){
	    Calendar  calendar=new   GregorianCalendar(); 
	    calendar.setTime(end); 
	    calendar.add(Calendar.DATE,1);
	    end=calendar.getTime();
		String condition=filed+" BeTween to_Date('" +DataHelper.GetDateFormatString(start, Enum_DateType.Date_long)+ "','yyyy-MM-dd hh24:mi:ss') "+
				" And to_Date('" + DataHelper.GetDateFormatString(end, Enum_DateType.Date_long) + "','yyyy-MM-dd hh24:mi:ss')";
		return condition;
	}

    
    
	/**
	 * 生成不带 "-" 的UUID 
	 * 
	 * @return
	 */
	public static String getUUID() {
		UUID uuid = UUID.randomUUID();
		String str = uuid.toString();
		String uuidStr = str.replace("-", "");
		return uuidStr;
	}
	
	/** 
     *  两个实体类之间的相同属性赋值
     * @param source 被复制的实体类对象 
     * @param to 复制完后的实体类对象   
     * @throws Exception 
     */  
    public static void CopyEntity(Object source, Object to) throws Exception {    
        // 获取属性    

    	BeanInfo sourceBean = Introspector.getBeanInfo(source.getClass(),java.lang.Object.class);    
        PropertyDescriptor[] sourceProperty = sourceBean.getPropertyDescriptors();    
    
        BeanInfo destBean = Introspector.getBeanInfo(to.getClass(),java.lang.Object.class);    
        PropertyDescriptor[] destProperty = destBean.getPropertyDescriptors();    
        String sourceName="",destName="";
        try {    
            for (int i = 0; i < sourceProperty.length; i++) {    
                for (int j = 0; j < destProperty.length; j++) {    
                	sourceName=sourceProperty[i].getName().replaceAll("_", "").toLowerCase();
                	destName=destProperty[j].getName().replaceAll("_", "").toLowerCase();
                    if (sourceName.equals(destName)) {    
                    	System.out.print(sourceName+"=="+destName);
                        // 调用source的getter方法和dest的setter方法    
                        destProperty[j].getWriteMethod().invoke(to,sourceProperty[i].getReadMethod().invoke(source));    
                        break;    
                    }    
                }    
            }    
        } catch (Exception e) {    
            throw new Exception("属性"+sourceName+"复制失败");    
        }    
    }
	
//	/**
//	 * 自定义赋值
//	 * @param source
//	 * @param to
//	 * @throws Exception
//	 */
//    public static void CopyEntity_custome(Object source, Object to) throws Exception {    
//        // 获取属性    
//
//    	BeanInfo sourceBean = Introspector.getBeanInfo(source.getClass(),java.lang.Object.class);    
//        PropertyDescriptor[] sourceProperty = sourceBean.getPropertyDescriptors();    
//    
//        BeanInfo destBean = Introspector.getBeanInfo(to.getClass(),java.lang.Object.class);    
//        PropertyDescriptor[] destProperty = destBean.getPropertyDescriptors();    
//        String sourceName="",destName="";
//        try {    
//            for (int i = 0; i < sourceProperty.length; i++) {    
//                for (int j = 0; j < destProperty.length; j++) {   
//                	if(sourceProperty[i].getName().contains("slit_id_create") || sourceProperty[i].getName().contains("calc_weight")){
//                		//sourceProperty[i].setValue(attributeName, value);
//                		//String value=(String)sourceProperty[i].getValue(sourceProperty[i].getName());
//                		 // 获取getter方法，反射获取值
//                		String str = (String)sourceProperty[i].getReadMethod().invoke(source);
//                		
//                		if(str!=null || !"".equals(str)){
//                			Integer val=Integer.parseInt(str);
//                			//destProperty[i].setValue(sourceProperty[i].getName(),value);
//                			//获取setter方法，反射赋值
//                			//destProperty[j].getWriteMethod().invoke(to,);  
//                			destProperty[j].getWriteMethod().invoke(to,(Object)val); 
//                			//destProperty[j].getWriteMethod().invoke(to,sourceProperty[i].getReadMethod().invoke(source));  
//                		}
//                		else{
//                			break;
//                		}
//                		//destProperty[j].getWriteMethod().invoke(to,sourceProperty[i].getReadMethod().invoke(source)); 
//                		
//                	}else{
//                		sourceName=sourceProperty[i].getName().replaceAll("_", "").toLowerCase();
//                    	destName=destProperty[j].getName().replaceAll("_", "").toLowerCase();
//                        if (sourceName.equals(destName)) {    
//                        	System.out.print(sourceName+"=="+destName);
//                            // 调用source的getter方法和dest的setter方法    
//                            destProperty[j].getWriteMethod().invoke(to,sourceProperty[i].getReadMethod().invoke(source));    
//                            break;    
//                        }    
//                	}
//                	
//                }    
//            }    
//        } catch (Exception e) {    
//            throw new Exception("属性"+sourceName+"复制失败");    
//        }    
//    }
    
    
    /**
     * 将null转化为00000
     */
    public static String Get00000(String value) {
		
		if(value==null || "".equals(value)){
			return "00000";
		}else {
			return value;
		}
		
	}
    
    
    
    
	/**
	 * 验证字符串 如：1<2
	 * 
	 * @param strA
	 *            数字字符串
	 * @param sign
	 *            符号
	 * @param strB
	 *            数字字符串
	 * @return true Or false
	 */
	public static boolean checkStr(String strA, String sign, String strB) {
		if(strA==null||strB==null){
			return true;
		}
		
		if (strA.length() == 0 || strB.length() == 0) {
			return true;
		}
		
		if ("".equals(sign)||sign==null) {
				return true;
		}
		double a = Double.parseDouble(strA);
		double b = Double.parseDouble(strB);
		if (sign.equals("=")) {
			if (a == b) {
				return true;
			} else {
				return false;
			}
		}
		if (sign.equals(">")) {
			if (a > b) {
				return true;
			} else {
				return false;
			}
		}
		if (sign.equals(">=")) {
			if (a >= b) {
				return true;
			} else {
				return false;
			}
		}
		if (sign.equals("<")) {
			if (a < b) {
				return true;
			} else {
				return false;
			}
		}
		if (sign.equals("<=")) {
			if (a <= b) {
				return true;
			} else {
				return false;
			}
		}
		return false;
	}
	
	
	/**
	 *  构造编号 （如：S0001，S0002 向后增大,增量为1）
	 * @param value 当前最大编号
	 * @param ignore 要忽略掉的前缀
	 * @param num 编号总位数
	 * @return
	 */
	public static String InitSerial(String value,String ignore,int num){
		int length=num-ignore.length();//要构造的位数
		String serial="";
		if(IsNullOrSpace(value)){
			for(int i=0;i<length-1;i++){
				serial+="0";
			}
			serial=serial+"1";
			serial=ignore+serial;
		}else{
			value=value.replaceAll(ignore, "");
			Integer val=Integer.valueOf(value);
			val=val+1;
			length=length-val.toString().length();
			for(int i=0;i<length;i++){
				serial+="0";
			}
			serial=ignore+serial+val;
		}
		return serial;
	}
	

	
	/**
	 * 判断Double是否为null
	 * @param value
	 */
	public static boolean DoubleIsNull(Double value){
		if(value==null){
			return true;
		}else{
			return false;
		}
	}
	
	/**
	 * 判断是否为null或者为空字符串
	 * @param value
	 */
	public static boolean IsNullOrSpace(String value){
		if(value==null){
			return true;
		}else{
			return value.trim().equals("");
		}
	}

	/**
	 * 构造查询condition
	 * @param values 原字符串值集合
	 * @param field 数据库字段名
	 * @param flag 分割字符
	 * @return
	 */
	public static String CreateSqlCondition(String values,String field,String flag){
		
		if(IsNullOrSpace(values)){
			return null;
		}else{
			String[] valueArray=values.split(flag);
			StringBuilder condition=new StringBuilder(field+" in(");
			for (String value : valueArray) {
				condition.append("'"+value+"',");
			}
			return condition.substring(0, condition.length()-1)+")";
		}
	}
	
	/**
	 * 构造查询condition
	 * @param valueArray 原字符串值数组
	 * @param field 数据库字段名
	 * @return
	 */
	public static String CreateSqlCondition(String[] valueArray,String field){
		if(valueArray==null||valueArray.length<1){
			return null;
		}else{
			StringBuilder condition=new StringBuilder(field+" in(");
			for (String value : valueArray) {
				condition.append("'"+value+"',");
			}
			return condition.substring(0, condition.length()-1)+")";
		}
	}
	
	/**
	 * 简单型处理 防sql注入
	 * @param value
	 * @return
	 */
	public static String TrimSqlDangerMark(String value){
		if(IsNullOrSpace(value)){
			return value;
		}else{
			return value.trim().replaceAll("'", "");
		}
	}	
	
	/**
	 * 字符串分割之后组合成list
	 * @param str 原字符
	 * @param flag 分割字符
	 * @return
	 */
	public static List<String> GetListString(String str,String flag){
		List<String> list=new ArrayList<>();
		if(!IsNullOrSpace(str)){
			String[] strArray=str.split(flag);
			for (String array : strArray) {
				list.add(array);
			}
		}
		return list;
	}
	
	/**
	 * 构造查询condition
	 * @param listValue 原字符串值集
	 * @param field 数据库字段名
	 * @return
	 */
	public static String CreateSqlCondition(List<String> listValue,String field){
		if(listValue==null||listValue.size()<1){
			return null;
		}else{
			StringBuilder condition=new StringBuilder(field+" in(");
			for (String value : listValue) {
				condition.append("'"+value+"',");
			}
			return condition.substring(0, condition.length()-1)+")";
		}
	}
	
	/**
	 *  Double 转 String
	 * @param value
	 * @return
	 */
	public static String GetString(Double value){
		if(value==null){
			return null;
		}else{
			return value.toString();
		}
	}
	
	/**
	 * 将空数据转化为null字符串
	 */
	
	public static String GetNull(String value) {
		
		if(value==null || "".equals(value)){
			return "null";
		}else {
			return value;
		}
		
	}
	
	/**
	 * String 转 double
	 * @param value
	 * @return
	 */
	public static Double GetDouble(String value){
		if(value==null){
			return null;
		}else{
			return Double.parseDouble(value);
		}
	}
	
	/**
	 * 字符串转日期 
	 * @param value 日期字符串
	 * @return 长日期
	 */
	public static Date GetDate(String value) throws Exception{
		SimpleDateFormat formate =  new SimpleDateFormat( "yyyy-MM-dd HH:mm:ss"); 
		Date date =formate.parse(value); 
		return date;
	}
	/**
	 * 字符串转日期 
	 * @param value 日期字符串
	 * @return 长日期
	 */
	public static Date GetDate1(String value) throws Exception{
		SimpleDateFormat formate =  new SimpleDateFormat( "yyyy-MM-dd"); 
		Date date =formate.parse(value); 
		return date;
	}
	
	/**
	 * 日期转String类型
	 * @param date 日期
	 * @param dateType 格式化类型
	 * @return
	 */
	public static String GetDateFormatString(Date date,Enum_DateType dateType){
		SimpleDateFormat simpleFormat=GetDateFormat(dateType.toString());
		return simpleFormat.format(date);
	}
	
	/**
	 * 日期转String类型
	 * @param date
	 * @param format
	 * @return
	 */
	public static String GetDateFormatString(Date date,String format){
		SimpleDateFormat simpleFormat=GetCustomerFormat(format);
		return simpleFormat.format(date);
	}
	
	/**
	 * 执行表达式
	 * @param expression 表达式
	 * @return 计算结果
	 * @throws ScriptException
	 */
	public static double GetFormulaResult(String expression) throws ScriptException{
			ScriptEngineManager _mgr=new ScriptEngineManager();
			ScriptEngine _enginer=_mgr.getEngineByName("javascript");
			Object result=_enginer.eval(expression);
			double value=Double.parseDouble(result.toString());
			return value;
	}
	
	
	
	
	
	
	/**
	 * 返回日期格式化器
	 * @param format 格式
	 * @return
	 */
	public static SimpleDateFormat GetCustomerFormat(String format){
		SimpleDateFormat simpleFormat=new SimpleDateFormat();
		simpleFormat.applyPattern(format);
		return simpleFormat;
	}
	
	/**
	 * 返回日期格式化器
	 * @param dateType 日期类型
	 * @return
	 */
	public static SimpleDateFormat GetDateFormat(String dateType){
		SimpleDateFormat simpleFormat=new SimpleDateFormat();
		Enum_DateType _dateType=Enum_DateType.valueOf(dateType);
		switch (_dateType) {
		case Date_Customer:
			simpleFormat.applyPattern("yyyyMMdd");
			break;
		case Date_long:
			simpleFormat.applyPattern("yyyy-MM-dd HH:mm:ss");
			break;
		case Date_Short:
			simpleFormat.applyPattern("yyyy-MM-dd");
			break;
		case Date_YearJoinMonth:
			simpleFormat.applyPattern("yyyy-MM");
			break;
		case Date_MonthJoinDay:
			simpleFormat.applyPattern("MM-dd");
			break;
		default:
			simpleFormat.applyPattern("yyyy-MM-dd HH:mm:ss");
			break;
		}
		return simpleFormat;
		
	}
	
	/**
	 * 工序点类型
	 * @author ZQ
	 *
	 */
	public enum Enum_StationType{
		/**
		 * 成分类
		 */
		Group,
		/**
		 * 材质类
		 */
		Material,
		/**
		 * 公差类
		 */
		Size,
		/**
		 * 探伤类
		 */
		Detection,
		/**
		 * 工艺类
		 */
		Technics,
		/**
		 * 未知
		 */
		None,
		
	}
	
	/**
	 * 日期格式类型
	 * @author ZQ
	 *
	 */
	public enum Enum_DateType{
		/**
		 * yyyyMMdd
		 */
		Date_Customer,
		
		/**
		 * 长日期 yyyy-MM-dd HH:mm:ss
		 */
		Date_long,
		/**
		 * 短日期 yyyy-MM-dd
		 */
		Date_Short,
		/**
		 * 年、月组合  yyyy-MM
		 */
		Date_YearJoinMonth,
		/**
		 * 月、天组合 MM-dd
		 */
		Date_MonthJoinDay
		
	}
	
	
	/**
	 * 检查是否符合标准
	 * @param stdSign 标准符号
	 *  @param valueSign 符号
	 * @param stdValue 标准值
	 * @param value 对比值
	 * @return
	 */
	public static boolean checkSignAndValue(String stdSign,String valueSign,Double stdValue,String value){
		if(value==null||value==""){
			return true;
		}
		if(stdSign==null){
			return true;
		}
		if (valueSign==null || "".equals(valueSign)) {
			switch(stdSign){
			case ">":
				return stdValue.doubleValue()<Double.parseDouble(value);
			case ">=":
				return stdValue.doubleValue()<=Double.parseDouble(value);
			case "<":
				return stdValue.doubleValue()>Double.parseDouble(value);
			case "<=":
				return stdValue.doubleValue()>=Double.parseDouble(value);
			case "=":
				return stdValue.doubleValue()==Double.parseDouble(value);
			default:
				return true;
		}
			
		}else{
			
			if (stdSign.equals(valueSign)) {
				switch(stdSign){
				case ">":
					return stdValue.doubleValue()<Double.parseDouble(value);
				case ">=":
					return stdValue.doubleValue()<=Double.parseDouble(value);
				case "<":
					return stdValue.doubleValue()>Double.parseDouble(value);
				case "<=":
					return stdValue.doubleValue()>=Double.parseDouble(value);
				case "=":
					return stdValue.doubleValue()==Double.parseDouble(value);
				default:
					return true;
			}
				
			}else if ("=".equals(stdSign) && !"=".equals(valueSign)) {
				
				return false;
				
			}else if (!"=".equals(stdSign) && "=".equals(valueSign)) {
				
				switch(stdSign){
				case ">":
					return stdValue.doubleValue()<Double.parseDouble(value);
				case ">=":
					return stdValue.doubleValue()<=Double.parseDouble(value);
				case "<":
					return stdValue.doubleValue()>Double.parseDouble(value);
				case "<=":
					return stdValue.doubleValue()>=Double.parseDouble(value);
				default:
					return true;
			}
				
			}else{
				if (">".equals(stdSign) && ">=".equals(valueSign)) {
					return stdValue.doubleValue()<Double.parseDouble(value);
				}else if (">=".equals(stdSign) && ">".equals(valueSign)) {
					return stdValue.doubleValue()<=Double.parseDouble(value);
				}else if ("<".equals(stdSign) && "<=".equals(valueSign)) {
					return stdValue.doubleValue()>Double.parseDouble(value);
				}else if ("<=".equals(stdSign) && "<".equals(valueSign)) {
					return stdValue.doubleValue()>=Double.parseDouble(value);
				}else{
					return true;
				}
				
				
				
			}
			
			
			
			
			
		}
		
	}
	/***
	 * 拼接检验项
	 * @param phyCodeL
	 * @param phyCodeM
	 * @param phyCodeS
	 * @param phyNameL
	 * @param phyNameM
	 * @param phyNameS
	 * @return
	 */
	public static String GetPhyString(String phyCodeL,String phyCodeM,String phyCodeS,String itemCodeD,String itemCodeT,String itemCodeS){
		return Get00000(phyCodeL) + "_" + Get00000(phyCodeM) + "_" + Get00000(phyCodeS) + "_"
				+ Get00000(itemCodeD) + "_" + Get00000(itemCodeT) + "_" + Get00000(itemCodeS);
	}
	
	
	/**
	 * base64字符串转化成图片
	 * 
	 * @param imgData
	 *            图片编码
	 * @param imgFilePath
	 *            存放到本地路径
	 * @return
	 * @throws IOException
	 */
	@SuppressWarnings("finally")
	public static boolean GenerateImage(String imgData, String imgFilePath) throws IOException { // // 对字节数组字符串进行Base64解码并生成图片
	    if (imgData == null) // 图像数据为空
	        return false;
	    BASE64Decoder decoder = new BASE64Decoder();
	    OutputStream out = null;
	    try {
	        out = new FileOutputStream(imgFilePath);
	        // Base64解码
	        byte[] b = decoder.decodeBuffer(imgData);
	        for (int i = 0; i < b.length; ++i) {
	            if (b[i] < 0) {// 调整异常数据
	                b[i] += 256;
	            }
	        }
	        out.write(b);
	    } catch (FileNotFoundException e) {
	        // TODO Auto-generated catch block
	        e.printStackTrace();
	    } catch (IOException e) {
	        // TODO Auto-generated catch block
	        e.printStackTrace();
	    } finally {
	        out.flush();
	        out.close();
	        return true;
	    }



	}
	
	public static String getDirValue(String item_code_d, String item_code_s, String item_code_t) {
	     String condition="";
	     	 if (item_code_d!=null && !"".equals(item_code_d)) {
	     			
	    	     condition=item_code_d;
	    	 }else{
	    		 condition="null"; 
	    		 
	    	 }
	     	 
	     	 if (item_code_s!=null && !"".equals(item_code_s)) {
	  			
	    	     condition+="_"+item_code_s;
	    	 }else{
	    		 condition+="_null"; 
	    		 
	    	 }
	     	 
	     	 if (item_code_t!=null && !"".equals(item_code_t)) {
	  			
	    	     condition+="_"+item_code_t;
	    	 }else{
	    		 condition+="_null"; 
	    		 
	    	 }
			
			
			
			return condition;
		}
	
	 	public static <T> boolean checkIsNull(List<T> al) {
			if (al!=null && al.size()>0) {
				return true;
			}
			return false;
		}
	 	
	 	public static String getSetCondition(Set<String> set) {
			String condition=null;
			if (set!=null && set.size()>0) {
				for (String key : set) {
					if (condition==null) {
						condition="'"+key+"'";
					}else {
						condition+=",'"+key+"'";
					}
				}
			}
			return condition;
		}
	 	
	 	public static String getSetConditionList(List<String> set) {
			String condition=null;
			if (set!=null && set.size()>0) {
				for (String key : set) {
					if (condition==null) {
						condition="'"+key+"'";
					}else {
						condition+=",'"+key+"'";
					}
				}
			}
			return condition;
		}
	
	
}
