/// <summary> /// 获取推给SAP数据 /// </summary> /// <param name="obj">业务实体对象</param> /// <returns>包含业务实体对象数据的XML</returns> public String GetSAPRequestData(Object obj) { String result = String.Empty; MemoryStream ms = null; XmlSerializer mySerializer = null; ResultWrap rw = null; XmlSerializerNamespaces xmlSerializerNamespaces = null; XmlWriterSettings setting = null; try { rw = xmlUtil.VerificationRequestData(obj); if (rw.SIGN != EnumResultFlagType.Y) { throw new ArgumentException("obj参数校验失败: " + rw.MESSAGE); } xmlSerializerNamespaces = new XmlSerializerNamespaces(); xmlSerializerNamespaces.Add("", ""); obj = xmlUtil.FormatRequestObjData(obj); setting = new XmlWriterSettings(); setting.Encoding = new UTF8Encoding(false); setting.Indent = false; mySerializer = new XmlSerializer(obj.GetType()); using (ms = new MemoryStream()) { using (XmlWriter writer = XmlWriter.Create(ms, setting)) { mySerializer.Serialize(writer, obj, xmlSerializerNamespaces); } result = Encoding.UTF8.GetString(ms.ToArray()); //result = formatRequestStrData(result); ms.Close(); } } catch (Exception exc) { result = String.Empty; if (ms != null) { ms.Close(); ms.Dispose(); } throw exc; } return(result); }
/// <summary> /// 从ERP把PS数据推给SAP并从SAP获取推送结果 /// </summary> /// <param name="requestObj">要推送的PS数据</param> /// <param name="endPointName">端点名称</param> /// <returns></returns> public Object SendDataToSAP(Object requestObj) { Object rw = null; //ServiceReference1.ZWS_MZClient sap_ws = new ServiceReference1.ZWS_MZClient(); ZWS_MZClient sap_ws = null; ZFUN_MZ sap_Obj = null; ZFUN_MZResponse sap_ObjResponse = null; String str = String.Empty; Utils utils = new Utils(); try { str = utils.GetSAPRequestData(requestObj); sap_Obj = new ZFUN_MZ(); sap_Obj.FCODE = EnumFCODE.ZFUN_KC_MES_MZ; sap_Obj.INPUT = str; using (sap_ws = new ZWS_MZClient(this.endPointName)) { //System.ServiceModel.Channels.Binding bind= sap_ObjResponse = sap_ws.ZFUN_MZ(sap_Obj); if (String.IsNullOrEmpty(sap_ObjResponse.OUTPUT)) { throw new InvalidDataException("无效的SAP返回数据!"); } try { //byte[] array = Encoding.UTF8.GetBytes(sap_ObjResponse.OUTPUT); //MemoryStream stream = new MemoryStream(array); //DataSet ds = new DataSet(); //ds.ReadXml(stream, XmlReadMode.Auto); //var logCfg = new FileInfo(AppDomain.CurrentDomain.BaseDirectory + "log4net.config"); //XmlConfigurator.ConfigureAndWatch(logCfg); //var logger =log4net.LogManager.GetLogger(typeof(GetSapMZData)); //logger.Info(sap_ObjResponse.OUTPUT); rw = new ResultWrap() { SIGN = EnumResultFlagType.Y, MESSAGE = "木作数据抓取成功", Data = sap_ObjResponse.OUTPUT }; return(rw); } catch (InvalidOperationException ex) { throw ex; //rw = base.GetSAPResponseData(sap_ObjResponse.OUTPUT, typeof(ResultWrap)); } } } catch (Exception exc) { rw = null; if (sap_ws != null) { sap_ws.Abort(); } throw exc; } finally { if (sap_ws != null) { sap_ws.Close(); } } }
/// <summary> /// 验证 /// </summary> /// <param name="requestObj"></param> /// <returns></returns> public ResultWrap VerificationRequestData(Object requestObj) { ResultWrap rw = null; Type objType = null; FieldInfo[] fieldInfos = null; PropertyInfo[] propertyInfos = null; FieldVerificationAttribute[] fieldVerifiers = null; FieldVerificationAttribute fieldVerifier = null; String str = null; Object[] tmpAttrs = null; try { if (requestObj == null) { throw new ArgumentNullException("requestObj对象不能为空!"); } objType = requestObj.GetType(); propertyInfos = objType.GetProperties(); fieldInfos = objType.GetFields(); if ((fieldInfos == null || fieldInfos.Length <= 0) && (propertyInfos == null || propertyInfos.Length <= 0)) { throw new ArgumentException("没有给业务对象添加字段!(" + requestObj.ToString() + ")"); } if (fieldInfos != null) { foreach (FieldInfo field in fieldInfos) { if (field.FieldType.BaseType == typeof(Array)) { //数组 Object[] tmpObjs = (Object[])field.GetValue(requestObj); foreach (Object tmpObj in tmpObjs) { rw = VerificationRequestData(tmpObj); if (rw.SIGN == EnumResultFlagType.N) { return(rw); } } } else { //非数组 //XmlIgnore属性不判断 tmpAttrs = field.GetCustomAttributes(typeof(XmlIgnoreAttribute), false); if (tmpAttrs != null && tmpAttrs.Length > 0) { continue; } //非数组 if (field.FieldType.BaseType == typeof(System.Enum)) { //类型为枚举的不判断 continue; } if (field.FieldType.BaseType == typeof(System.Enum)) { //类型为枚举的不判断 continue; } fieldVerifiers = (FieldVerificationAttribute[])field.GetCustomAttributes(typeof(FieldVerificationAttribute), false); if (fieldVerifiers == null || fieldVerifiers.Length <= 0) { throw new ArgumentException("没有给业务对象添加属性!" + requestObj.ToString() + ""); } fieldVerifier = fieldVerifiers[0]; str = field.GetValue(requestObj).ToString(); rw = checkData(str, fieldVerifier, field); if (rw.SIGN == EnumResultFlagType.N) { return(rw); } } } } if (propertyInfos != null) { foreach (PropertyInfo property in propertyInfos) { if (property.PropertyType.BaseType == typeof(Array)) { //数组 Object[] tmpObjs = (Object[])property.GetValue(requestObj, null); foreach (Object tmpObj in tmpObjs) { rw = VerificationRequestData(tmpObj); if (rw.SIGN == EnumResultFlagType.N) { return(rw); } } } else { //非数组 //XmlIgnore属性不判断 tmpAttrs = property.GetCustomAttributes(typeof(XmlIgnoreAttribute), false); if (tmpAttrs != null && tmpAttrs.Length > 0) { continue; } //非数组 if (property.PropertyType.BaseType == typeof(System.Enum)) { //类型为枚举的不判断 continue; } fieldVerifiers = (FieldVerificationAttribute[])property.GetCustomAttributes(typeof(FieldVerificationAttribute), false); if (fieldVerifiers == null || fieldVerifiers.Length <= 0) { throw new ArgumentException("没有给业务对象添加属性!" + requestObj.ToString() + ""); } fieldVerifier = fieldVerifiers[0]; str = property.GetValue(requestObj, null).ToString(); rw = checkData(str, fieldVerifier, property); if (rw.SIGN == EnumResultFlagType.N) { return(rw); } } } } } catch (Exception exc) { rw = null; throw exc; } return(rw); }
private ResultWrap checkData(String str, FieldVerificationAttribute fieldVerifier, PropertyInfo property) { ResultWrap rw = null; Object[] tmpAttrs = null; try { tmpAttrs = property.GetCustomAttributes(typeof(XmlIgnoreAttribute), false); if (tmpAttrs != null && tmpAttrs.Length > 0) { rw = new ResultWrap(EnumResultFlagType.Y, ""); return(rw); } int pos = -1; //判断是否是必填字段 if (fieldVerifier.IsRequired) { if (String.IsNullOrEmpty(str)) { //空 rw = new ResultWrap(EnumResultFlagType.N, property.Name + "字段验证失败: 字段不能为空!"); return(rw); } } //判断长度是否超长 if (str.Length > fieldVerifier.FieldLength) { rw = new ResultWrap(EnumResultFlagType.N, property.Name + "字段验证失败: 字段长度超过规则长度!"); return(rw); } //判断是否是数字 if (fieldVerifier.IsNumberic && !String.IsNullOrEmpty(str)) { if (Regex.IsMatch(str, @"[^-0-9.]")) { //含有非数字 rw = new ResultWrap(EnumResultFlagType.N, property.Name + "字段验证失败: 字段不符合数字规则!"); return(rw); } } //判断是否是金额 if (fieldVerifier.IsDecimalDigit && !String.IsNullOrEmpty(str)) { pos = str.IndexOf('.'); if ((pos <= 0) || (str.Length - (pos + 1) != fieldVerifier.DecimalDigitsLength)) { //不符合金额 rw = new ResultWrap(EnumResultFlagType.N, property.Name + "字段验证失败: 字段不符合数字规则!"); return(rw); } } rw = new ResultWrap(EnumResultFlagType.Y, ""); } catch (Exception exc) { rw = null; throw exc; } return(rw); }